xref: /utopia/UTPA2-700.0.x/modules/ojpd_vdec_v1/api/jpeg/apiJPEG.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file    apiJPEG.c
98*53ee8cc1Swenshuai.xi /// @brief  JPEG API
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
104*53ee8cc1Swenshuai.xi //  Include Files
105*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
106*53ee8cc1Swenshuai.xi #ifndef CMODEL
107*53ee8cc1Swenshuai.xi #include "MsCommon.h"
108*53ee8cc1Swenshuai.xi #include "MsVersion.h"
109*53ee8cc1Swenshuai.xi #include "MsOS.h"
110*53ee8cc1Swenshuai.xi #include "asmCPU.h"
111*53ee8cc1Swenshuai.xi #include "jpeg_def.h"
112*53ee8cc1Swenshuai.xi #include "drvJPD.h"
113*53ee8cc1Swenshuai.xi //#include "Utl.h"
114*53ee8cc1Swenshuai.xi ////#include "drvUART.h"
115*53ee8cc1Swenshuai.xi #else
116*53ee8cc1Swenshuai.xi #include "jpeg_cmodel_def.h"
117*53ee8cc1Swenshuai.xi #include "jpeg_cmodel.h"
118*53ee8cc1Swenshuai.xi #endif
119*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
120*53ee8cc1Swenshuai.xi #include <setjmp.h>
121*53ee8cc1Swenshuai.xi #endif
122*53ee8cc1Swenshuai.xi #include "jpeg_memory.h"
123*53ee8cc1Swenshuai.xi #include "apiJPEG.h"
124*53ee8cc1Swenshuai.xi 
125*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
126*53ee8cc1Swenshuai.xi #include <linux/string.h>
127*53ee8cc1Swenshuai.xi #else
128*53ee8cc1Swenshuai.xi #include <string.h>
129*53ee8cc1Swenshuai.xi #endif
130*53ee8cc1Swenshuai.xi 
131*53ee8cc1Swenshuai.xi #include "utopia.h"
132*53ee8cc1Swenshuai.xi #include "apiJPEG_priv.h"
133*53ee8cc1Swenshuai.xi #include "apiJPEG_v2.h"
134*53ee8cc1Swenshuai.xi void* pInstantJPD = NULL;
135*53ee8cc1Swenshuai.xi 
136*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
137*53ee8cc1Swenshuai.xi //  Local Compiler Options
138*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
139*53ee8cc1Swenshuai.xi // PS. CMODEL always supports progressive mode decode
140*53ee8cc1Swenshuai.xi #define SUPPORT_PROGRESSIVE_MODE    1
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi #define ENABLE_JPEG_NO_SIZE_LOWER_BOUND 0
143*53ee8cc1Swenshuai.xi 
144*53ee8cc1Swenshuai.xi #define SUPPORT_PROGRESSIVE_SCLAEDOWN_MODE    1 //CL82399
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi #define SW_OPTIMIZE         0
147*53ee8cc1Swenshuai.xi #define SW_JPD_RGB_CMYK     1
148*53ee8cc1Swenshuai.xi #ifdef CMODEL
149*53ee8cc1Swenshuai.xi // This funcion is not ready in CMODEL
150*53ee8cc1Swenshuai.xi #undef SW_JPD_RGB_CMYK
151*53ee8cc1Swenshuai.xi #define SW_JPD_RGB_CMYK     0
152*53ee8cc1Swenshuai.xi #endif
153*53ee8cc1Swenshuai.xi 
154*53ee8cc1Swenshuai.xi /* Need to check whether OS support jump API or not */
155*53ee8cc1Swenshuai.xi #ifdef CMODEL
156*53ee8cc1Swenshuai.xi #define JPD_LONGJUMP_SUPPORT
157*53ee8cc1Swenshuai.xi #endif
158*53ee8cc1Swenshuai.xi #if 0
159*53ee8cc1Swenshuai.xi #if !defined(MSOS_TYPE_ECOS)
160*53ee8cc1Swenshuai.xi #define USE_LIBC
161*53ee8cc1Swenshuai.xi #endif
162*53ee8cc1Swenshuai.xi #ifndef USE_LIBC
163*53ee8cc1Swenshuai.xi #define jmp_buf             MS_U32
164*53ee8cc1Swenshuai.xi #define setjmp(jmp_state)   FALSE
165*53ee8cc1Swenshuai.xi #define longjmp(jmp_state, status)
166*53ee8cc1Swenshuai.xi #endif
167*53ee8cc1Swenshuai.xi #endif
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi #define PRINT_JPD_DECODE_TIME   0
170*53ee8cc1Swenshuai.xi #define LOG_DATA_TO_USB         0
171*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
172*53ee8cc1Swenshuai.xi //  Local Defines
173*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
174*53ee8cc1Swenshuai.xi // Max. allocated blocks
175*53ee8cc1Swenshuai.xi #ifdef CMODEL
176*53ee8cc1Swenshuai.xi #define JPEG_MAXBLOCKS    100
177*53ee8cc1Swenshuai.xi #else
178*53ee8cc1Swenshuai.xi #define JPEG_MAXBLOCKS    50
179*53ee8cc1Swenshuai.xi #endif
180*53ee8cc1Swenshuai.xi 
181*53ee8cc1Swenshuai.xi #define DEFAULT_DECODE_TIMEOUT  100
182*53ee8cc1Swenshuai.xi 
183*53ee8cc1Swenshuai.xi //fractional bits in scale factors
184*53ee8cc1Swenshuai.xi #define IFAST_SCALE_BITS    2
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi #define JPEG_TIFF_SOI_OFFSET        0x0201
187*53ee8cc1Swenshuai.xi #define JPEG_TIFF_JPEG_IMG_BYTES    0x0202
188*53ee8cc1Swenshuai.xi 
189*53ee8cc1Swenshuai.xi #define JPEG_TIFF_BIG_ENDIAN        0x4D4D
190*53ee8cc1Swenshuai.xi #define JPEG_TIFF_LITTLE_ENDIAN     0x4949
191*53ee8cc1Swenshuai.xi 
192*53ee8cc1Swenshuai.xi //EXIF Tag
193*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_MANUFACTURER              0x010F
194*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_MODEL                     0x0110
195*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_ORIENTATION               0x0112
196*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_DATETIME_MOD              0x0132
197*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_IFD_POINTER               0x8769
198*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_EXPOSURE_PROGRAM          0x8822
199*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_ISO_SPEED_RATING          0x8827
200*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_DATETIME_ORI              0x9003
201*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_EXPOSURE_TIME             0x829A
202*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_F_NUMBER                  0x829D
203*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_SHUTTER_SPEED             0x9201
204*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_APERTURE                  0x9202
205*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_EXPOSURE_BIAS             0x9204
206*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_FLASH                     0x9209
207*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_FOCAL_LENGTH              0x920A
208*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_IMAGE_WIDTH               0xA002
209*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_IMAGE_HEIGHT              0xA003
210*53ee8cc1Swenshuai.xi 
211*53ee8cc1Swenshuai.xi #define JPEG_MANUFACTURER_SIZE                  32
212*53ee8cc1Swenshuai.xi #define JPEG_MODEL_SIZE                         128
213*53ee8cc1Swenshuai.xi 
214*53ee8cc1Swenshuai.xi #define MIN_READBUFFER_SIZE 128
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi #define MRC_BUFFER_ADDR         _u32ReadBufferAddr
217*53ee8cc1Swenshuai.xi #define MRC_BUFFER_SIZE         _u32ReadBufferSize
218*53ee8cc1Swenshuai.xi #define MWC_BUFFER_ADDR         _u32WriteBufferAddr
219*53ee8cc1Swenshuai.xi #define MWC_BUFFER_SIZE         _u32WriteBufferSize
220*53ee8cc1Swenshuai.xi #define INTERNAL_BUFFER_ADDR    _u32InternalBufferAddr
221*53ee8cc1Swenshuai.xi #define INTERNAL_BUFFER_SIZE    _u32InternalBufferSize
222*53ee8cc1Swenshuai.xi 
223*53ee8cc1Swenshuai.xi #define HUFF_EXTEND_TBL(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
224*53ee8cc1Swenshuai.xi 
225*53ee8cc1Swenshuai.xi #define HUFF_EXTEND_P(x,s)  HUFF_EXTEND_TBL(x,s)
226*53ee8cc1Swenshuai.xi 
227*53ee8cc1Swenshuai.xi /* EXIF parsing section */
228*53ee8cc1Swenshuai.xi #define EndianChangeL(_x)   \
229*53ee8cc1Swenshuai.xi     ((((_x) & 0xff) << 24) | (((_x) & 0xff00) << 8) | (((_x) & 0xff0000) >> 8) | (((_x) & 0xff000000) >> 24))
230*53ee8cc1Swenshuai.xi 
231*53ee8cc1Swenshuai.xi #define EndianChangeS(_x)   \
232*53ee8cc1Swenshuai.xi     ((((_x) & 0xff) << 8) | (((_x) & 0xff00) >> 8))
233*53ee8cc1Swenshuai.xi 
234*53ee8cc1Swenshuai.xi #define JPEG_TAG_EXIF   EndianChangeL(0x45786966)
235*53ee8cc1Swenshuai.xi 
236*53ee8cc1Swenshuai.xi #define JPEG_ABS(x)     (((x)>=0)?(x):(-(x)))
237*53ee8cc1Swenshuai.xi 
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi static APP0_Unit App0_Unit_Data;
240*53ee8cc1Swenshuai.xi 
241*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
242*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
243*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16PaddingMcuNumber;
244*53ee8cc1Swenshuai.xi 
245*53ee8cc1Swenshuai.xi MS_U32 u32_Decode_Line;
246*53ee8cc1Swenshuai.xi MS_U8 *u8Out_buf;
247*53ee8cc1Swenshuai.xi //#define DCTSIZE 8
248*53ee8cc1Swenshuai.xi //#define DCTELEM int
249*53ee8cc1Swenshuai.xi #define PASS1_BITS  2
250*53ee8cc1Swenshuai.xi #define FIX_3_0727  ((MS_S32)25172)  /* FIX(3.072711026) */
251*53ee8cc1Swenshuai.xi #define FIX_2_5629  ((MS_S32)20995)  /* FIX(2.562915447) */
252*53ee8cc1Swenshuai.xi #define FIX_2_0531  ((MS_S32)16819)  /* FIX(2.053119869) */
253*53ee8cc1Swenshuai.xi #define FIX_1_9615  ((MS_S32)16069)  /* FIX(1.961570560) */
254*53ee8cc1Swenshuai.xi #define FIX_1_8477  ((MS_S32)15137)  /* FIX(1.847759065) */
255*53ee8cc1Swenshuai.xi #define FIX_1_5013  ((MS_S32)12299)  /* FIX(1.501321110) */
256*53ee8cc1Swenshuai.xi #define FIX_1_1758  ((MS_S32)9633)   /* FIX(1.175875602) */
257*53ee8cc1Swenshuai.xi #define FIX_0_8999  ((MS_S32)7373)   /* FIX(0.899976223) */
258*53ee8cc1Swenshuai.xi #define FIX_0_7653  ((MS_S32)6270)   /* FIX(0.765366865) */
259*53ee8cc1Swenshuai.xi #define FIX_0_5411  ((MS_S32)4433)   /* FIX(0.541196100) */
260*53ee8cc1Swenshuai.xi #define FIX_0_3901  ((MS_S32)3196)   /* FIX(0.390180644) */
261*53ee8cc1Swenshuai.xi #define FIX_0_2986  ((MS_S32)2446)   /* FIX(0.298631336) */
262*53ee8cc1Swenshuai.xi #define SCALE_DONE ((MS_S32) 1)
263*53ee8cc1Swenshuai.xi #define DESCALE(a,m)  (((a) + (SCALE_DONE << ((m)-1))) >> (m))
264*53ee8cc1Swenshuai.xi #define clamp(i) if (i & 0xFF00) i = (((~i) >> 15) & 0xFF);
265*53ee8cc1Swenshuai.xi #define SCALEBITS 16
266*53ee8cc1Swenshuai.xi #define ONE_HALF ((MS_S32) 1 << (SCALEBITS-1))
267*53ee8cc1Swenshuai.xi #define FIX(x) ((MS_S32) ((x) * (1L<<SCALEBITS) + 0.5))
268*53ee8cc1Swenshuai.xi 
269*53ee8cc1Swenshuai.xi 
270*53ee8cc1Swenshuai.xi #define HUFF_EXTEND(x,s)    ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
271*53ee8cc1Swenshuai.xi 
272*53ee8cc1Swenshuai.xi #ifdef CMODEL
273*53ee8cc1Swenshuai.xi // Same as drvJPD.h
274*53ee8cc1Swenshuai.xi // JPD Downscale Ratio
275*53ee8cc1Swenshuai.xi // Bellows are 1, 1/2, 1/4 and 1/8 in order
276*53ee8cc1Swenshuai.xi typedef enum
277*53ee8cc1Swenshuai.xi {
278*53ee8cc1Swenshuai.xi     E_JPD_DOWNSCALE_ORG     = 0x00
279*53ee8cc1Swenshuai.xi   , E_JPD_DOWNSCALE_HALF    = 0x01
280*53ee8cc1Swenshuai.xi   , E_JPD_DOWNSCALE_FOURTH  = 0x02
281*53ee8cc1Swenshuai.xi   , E_JPD_DOWNSCALE_EIGHTH  = 0x03
282*53ee8cc1Swenshuai.xi } JPD_DownScale;
283*53ee8cc1Swenshuai.xi #endif
284*53ee8cc1Swenshuai.xi #endif
285*53ee8cc1Swenshuai.xi 
286*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
287*53ee8cc1Swenshuai.xi FILE *logBinfp;
288*53ee8cc1Swenshuai.xi 
289*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_MSG(format, args...)  do{if(logBinfp) fprintf(logBinfp, format, ##args);}while(0)
290*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_ERR(format, args...)  do{if(logBinfp)  fprintf(logBinfp, format, ##args);}while(0)
291*53ee8cc1Swenshuai.xi #else
292*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_MSG(format, args...)  do{if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) printf(format, ##args);}while(0)
293*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_ERR(format, args...)  do{if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) printf(format, ##args);}while(0)
294*53ee8cc1Swenshuai.xi #endif
295*53ee8cc1Swenshuai.xi #define printf_red(args...)           do{ printf("\033[1;31m"); printf(args); printf("\033[m"); }while(0)
296*53ee8cc1Swenshuai.xi #define UTOPIA_20_DBG(args...)        //do{ printf("\033[1;31m"); printf(args); printf("\033[m"); }while(0)
297*53ee8cc1Swenshuai.xi 
298*53ee8cc1Swenshuai.xi #define JPEG_OVER_BUFFER_RET(addr, buf_addr, buf_size) \
299*53ee8cc1Swenshuai.xi do \
300*53ee8cc1Swenshuai.xi { \
301*53ee8cc1Swenshuai.xi     if(((MS_U32)(addr) < (MS_U32)(buf_addr)) \
302*53ee8cc1Swenshuai.xi     || ((MS_U32)(addr) >= ((MS_U32)(buf_addr) + (MS_U32)(buf_size)))) \
303*53ee8cc1Swenshuai.xi     { \
304*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("%s [%d] invalid address 0x%lx\n", __FUNCTION__, __LINE__, (MS_U32)(addr)); \
305*53ee8cc1Swenshuai.xi         return FALSE; \
306*53ee8cc1Swenshuai.xi     } \
307*53ee8cc1Swenshuai.xi } \
308*53ee8cc1Swenshuai.xi while(0)
309*53ee8cc1Swenshuai.xi 
310*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
311*53ee8cc1Swenshuai.xi //  Local Structures
312*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
313*53ee8cc1Swenshuai.xi //JPEG header marker id
314*53ee8cc1Swenshuai.xi typedef enum
315*53ee8cc1Swenshuai.xi {
316*53ee8cc1Swenshuai.xi     E_JPEG_SOF0     = 0xC0
317*53ee8cc1Swenshuai.xi   , E_JPEG_SOF1     = 0xC1
318*53ee8cc1Swenshuai.xi   , E_JPEG_SOF2     = 0xC2
319*53ee8cc1Swenshuai.xi   , E_JPEG_SOF3     = 0xC3
320*53ee8cc1Swenshuai.xi   , E_JPEG_SOF5     = 0xC5
321*53ee8cc1Swenshuai.xi   , E_JPEG_SOF6     = 0xC6
322*53ee8cc1Swenshuai.xi   , E_JPEG_SOF7     = 0xC7
323*53ee8cc1Swenshuai.xi   , E_JPEG_JPG      = 0xC8
324*53ee8cc1Swenshuai.xi   , E_JPEG_SOF9     = 0xC9
325*53ee8cc1Swenshuai.xi   , E_JPEG_SOF10    = 0xCA
326*53ee8cc1Swenshuai.xi   , E_JPEG_SOF11    = 0xCB
327*53ee8cc1Swenshuai.xi   , E_JPEG_SOF13    = 0xCD
328*53ee8cc1Swenshuai.xi   , E_JPEG_SOF14    = 0xCE
329*53ee8cc1Swenshuai.xi   , E_JPEG_SOF15    = 0xCF
330*53ee8cc1Swenshuai.xi   , E_JPEG_DHT      = 0xC4
331*53ee8cc1Swenshuai.xi   , E_JPEG_DAC      = 0xCC
332*53ee8cc1Swenshuai.xi   , E_JPEG_RST0     = 0xD0
333*53ee8cc1Swenshuai.xi   , E_JPEG_RST1     = 0xD1
334*53ee8cc1Swenshuai.xi   , E_JPEG_RST2     = 0xD2
335*53ee8cc1Swenshuai.xi   , E_JPEG_RST3     = 0xD3
336*53ee8cc1Swenshuai.xi   , E_JPEG_RST4     = 0xD4
337*53ee8cc1Swenshuai.xi   , E_JPEG_RST5     = 0xD5
338*53ee8cc1Swenshuai.xi   , E_JPEG_RST6     = 0xD6
339*53ee8cc1Swenshuai.xi   , E_JPEG_RST7     = 0xD7
340*53ee8cc1Swenshuai.xi   , E_JPEG_SOI      = 0xD8
341*53ee8cc1Swenshuai.xi   , E_JPEG_EOI      = 0xD9
342*53ee8cc1Swenshuai.xi   , E_JPEG_SOS      = 0xDA
343*53ee8cc1Swenshuai.xi   , E_JPEG_DQT      = 0xDB
344*53ee8cc1Swenshuai.xi   , E_JPEG_DNL      = 0xDC
345*53ee8cc1Swenshuai.xi   , E_JPEG_DRI      = 0xDD
346*53ee8cc1Swenshuai.xi   , E_JPEG_DHP      = 0xDE
347*53ee8cc1Swenshuai.xi   , E_JPEG_EXP      = 0xDF
348*53ee8cc1Swenshuai.xi   , E_JPEG_APP0     = 0xE0
349*53ee8cc1Swenshuai.xi   , E_JPEG_APP1     = 0xE1
350*53ee8cc1Swenshuai.xi   , E_JPEG_APP2     = 0xE2
351*53ee8cc1Swenshuai.xi   , E_JPEG_APP3     = 0xE3
352*53ee8cc1Swenshuai.xi   , E_JPEG_APP4     = 0xE4
353*53ee8cc1Swenshuai.xi   , E_JPEG_APP5     = 0xE5
354*53ee8cc1Swenshuai.xi   , E_JPEG_APP6     = 0xE6
355*53ee8cc1Swenshuai.xi   , E_JPEG_APP7     = 0xE7
356*53ee8cc1Swenshuai.xi   , E_JPEG_APP8     = 0xE8
357*53ee8cc1Swenshuai.xi   , E_JPEG_APP9     = 0xE9
358*53ee8cc1Swenshuai.xi   , E_JPEG_APP10     = 0xEA
359*53ee8cc1Swenshuai.xi   , E_JPEG_APP11     = 0xEB
360*53ee8cc1Swenshuai.xi   , E_JPEG_APP12     = 0xEC
361*53ee8cc1Swenshuai.xi   , E_JPEG_APP13     = 0xED
362*53ee8cc1Swenshuai.xi   , E_JPEG_APP14     = 0xEE
363*53ee8cc1Swenshuai.xi   , E_JPEG_APP15    = 0xEF
364*53ee8cc1Swenshuai.xi   , E_JPEG_JPG0     = 0xF0
365*53ee8cc1Swenshuai.xi   , E_JPEG_JPG1     = 0xF1
366*53ee8cc1Swenshuai.xi   , E_JPEG_JPG2     = 0xF2
367*53ee8cc1Swenshuai.xi   , E_JPEG_JPG3     = 0xF3
368*53ee8cc1Swenshuai.xi   , E_JPEG_JPG4     = 0xF4
369*53ee8cc1Swenshuai.xi   , E_JPEG_JPG5     = 0xF5
370*53ee8cc1Swenshuai.xi   , E_JPEG_JPG6     = 0xF6
371*53ee8cc1Swenshuai.xi   , E_JPEG_JPG7     = 0xF7
372*53ee8cc1Swenshuai.xi   , E_JPEG_JPG8     = 0xF8
373*53ee8cc1Swenshuai.xi   , E_JPEG_JPG9     = 0xF9
374*53ee8cc1Swenshuai.xi   , E_JPEG_JPG10     = 0xFA
375*53ee8cc1Swenshuai.xi   , E_JPEG_JPG11     = 0xFB
376*53ee8cc1Swenshuai.xi   , E_JPEG_JPG12     = 0xFC
377*53ee8cc1Swenshuai.xi   , E_JPEG_JPG13    = 0xFD
378*53ee8cc1Swenshuai.xi   , E_JPEG_COM      = 0xFE
379*53ee8cc1Swenshuai.xi   , E_JPEG_TEM      = 0x01
380*53ee8cc1Swenshuai.xi   , E_JPEG_ERROR    = 0x100
381*53ee8cc1Swenshuai.xi } JPEG_HdrMarker;
382*53ee8cc1Swenshuai.xi 
383*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
384*53ee8cc1Swenshuai.xi typedef enum
385*53ee8cc1Swenshuai.xi {
386*53ee8cc1Swenshuai.xi     E_RLE_DC = 0,
387*53ee8cc1Swenshuai.xi     E_RLE_AC,
388*53ee8cc1Swenshuai.xi     E_RLE_ZRL,
389*53ee8cc1Swenshuai.xi     E_RLE_EOB,
390*53ee8cc1Swenshuai.xi } JPEG_RLESymbol;
391*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
392*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Name: JPEG_CoeffBuf
393*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Description: The info of coefficient for JPEG decode
394*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
395*53ee8cc1Swenshuai.xi typedef struct
396*53ee8cc1Swenshuai.xi {
397*53ee8cc1Swenshuai.xi     MS_U8 *pu8Data;         ///<data of coefficient of DC, AC
398*53ee8cc1Swenshuai.xi     MS_U16 u16Block_num_x;  ///<the number of block for width
399*53ee8cc1Swenshuai.xi     MS_U16 u16Block_num_y;  ///<the number of block for height
400*53ee8cc1Swenshuai.xi     MS_U16 u16Block_size;   ///<block size
401*53ee8cc1Swenshuai.xi     MS_U8 u8Block_len_x;    ///<The width of block
402*53ee8cc1Swenshuai.xi     MS_U8 u8Block_len_y;    ///<The height of block
403*53ee8cc1Swenshuai.xi } JPEG_CoeffBuf, *PJPEG_CoeffBuf;
404*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
405*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Name: JPEG_SVLD
406*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Description: The info of SVLD for JPEG decode
407*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
408*53ee8cc1Swenshuai.xi typedef struct
409*53ee8cc1Swenshuai.xi {
410*53ee8cc1Swenshuai.xi     union
411*53ee8cc1Swenshuai.xi     {
412*53ee8cc1Swenshuai.xi         struct
413*53ee8cc1Swenshuai.xi         {
414*53ee8cc1Swenshuai.xi             MS_U32 amp          :11;    ///<The amplitude of value of VLI
415*53ee8cc1Swenshuai.xi             MS_U32 sign         :1;     ///<The sign of value of VLI
416*53ee8cc1Swenshuai.xi             MS_U32 run          :4;     ///<run value
417*53ee8cc1Swenshuai.xi             MS_U32 sym_type     :2;     ///<symbol type
418*53ee8cc1Swenshuai.xi             MS_U32 blk_type     :2;     ///<YUV type
419*53ee8cc1Swenshuai.xi             MS_U32 EOP          :1;     ///<End of picture
420*53ee8cc1Swenshuai.xi             MS_U32 trash        :11;    ///<reserved
421*53ee8cc1Swenshuai.xi         };
422*53ee8cc1Swenshuai.xi 
423*53ee8cc1Swenshuai.xi         struct
424*53ee8cc1Swenshuai.xi         {
425*53ee8cc1Swenshuai.xi             MS_U8 byte0;    ///<byte0 of SVLD
426*53ee8cc1Swenshuai.xi             MS_U8 byte1;    ///<byte1 of SVLD
427*53ee8cc1Swenshuai.xi             MS_U8 byte2;    ///<byte2 of SVLD
428*53ee8cc1Swenshuai.xi             MS_U8 byte3;    ///<byte3 of SVLD
429*53ee8cc1Swenshuai.xi         };
430*53ee8cc1Swenshuai.xi     };
431*53ee8cc1Swenshuai.xi } JPEG_SVLD;
432*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
433*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Name: JPEG_HdrChk
434*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Description: The info of header checking for JPEG decode
435*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
436*53ee8cc1Swenshuai.xi typedef union
437*53ee8cc1Swenshuai.xi {
438*53ee8cc1Swenshuai.xi     struct
439*53ee8cc1Swenshuai.xi     {
440*53ee8cc1Swenshuai.xi         MS_U8 DQT:1;///<has Quant Table?
441*53ee8cc1Swenshuai.xi         MS_U8 DHT:1;///<has Huffman Table?
442*53ee8cc1Swenshuai.xi //      MS_U8 SOF:1;
443*53ee8cc1Swenshuai.xi //      MS_U8 SOS:1;
444*53ee8cc1Swenshuai.xi     };
445*53ee8cc1Swenshuai.xi     MS_U8 result;   ///<wildcard for header check
446*53ee8cc1Swenshuai.xi } JPEG_HdrChk;
447*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
448*53ee8cc1Swenshuai.xi typedef MS_BOOL ( *Pdecode_block_func )( MS_U8, MS_U16, MS_U16 );
449*53ee8cc1Swenshuai.xi 
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
452*53ee8cc1Swenshuai.xi //  Global Variables
453*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
454*53ee8cc1Swenshuai.xi 
455*53ee8cc1Swenshuai.xi 
456*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
457*53ee8cc1Swenshuai.xi //  Local Variables
458*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
459*53ee8cc1Swenshuai.xi #ifdef CMODEL
460*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_HEIGHT = 0xFFFF;
461*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_WIDTH = 0xFFFF;
462*53ee8cc1Swenshuai.xi #else
463*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_HEIGHT = 1200;
464*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_WIDTH = 1600;
465*53ee8cc1Swenshuai.xi #endif
466*53ee8cc1Swenshuai.xi 
467*53ee8cc1Swenshuai.xi // max progressive resolution setting
468*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_PRO_MAX_HEIGHT  = 768;
469*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_PRO_MAX_WIDTH   = 1024;
470*53ee8cc1Swenshuai.xi 
471*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 MAX_JPEG_WIDTH_HD    = 0;
472*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 MAX_JPEG_HEIGHT_HD   = 0;
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
475*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_MAX_HEIGHT = 1200;
476*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_MAX_WIDTH = 1600;
477*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_PRO_MAX_HEIGHT  = 768;
478*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_PRO_MAX_WIDTH   = 1024;
479*53ee8cc1Swenshuai.xi #endif
480*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
481*53ee8cc1Swenshuai.xi #if 0
482*53ee8cc1Swenshuai.xi // Default Table for JPEG
483*53ee8cc1Swenshuai.xi const MS_U16 g16GRPINFO_TBL[128]=
484*53ee8cc1Swenshuai.xi {
485*53ee8cc1Swenshuai.xi 0x0000,
486*53ee8cc1Swenshuai.xi 0x0000,
487*53ee8cc1Swenshuai.xi 0x0000,
488*53ee8cc1Swenshuai.xi 0x0100,
489*53ee8cc1Swenshuai.xi 0x0010,
490*53ee8cc1Swenshuai.xi 0x0140,
491*53ee8cc1Swenshuai.xi 0x0060,
492*53ee8cc1Swenshuai.xi 0x01e0,
493*53ee8cc1Swenshuai.xi 0x0070,
494*53ee8cc1Swenshuai.xi 0x01f0,
495*53ee8cc1Swenshuai.xi 0x0080,
496*53ee8cc1Swenshuai.xi 0x01f8,
497*53ee8cc1Swenshuai.xi 0x0090,
498*53ee8cc1Swenshuai.xi 0x01fc,
499*53ee8cc1Swenshuai.xi 0x00a0,
500*53ee8cc1Swenshuai.xi 0x01fe,
501*53ee8cc1Swenshuai.xi 0x00b0,
502*53ee8cc1Swenshuai.xi 0x01ff,
503*53ee8cc1Swenshuai.xi 0x0000,
504*53ee8cc1Swenshuai.xi 0x0000,
505*53ee8cc1Swenshuai.xi 0x0000,
506*53ee8cc1Swenshuai.xi 0x0000,
507*53ee8cc1Swenshuai.xi 0x0000,
508*53ee8cc1Swenshuai.xi 0x0000,
509*53ee8cc1Swenshuai.xi 0x0000,
510*53ee8cc1Swenshuai.xi 0x0000,
511*53ee8cc1Swenshuai.xi 0x0000,
512*53ee8cc1Swenshuai.xi 0x0000,
513*53ee8cc1Swenshuai.xi 0x0000,
514*53ee8cc1Swenshuai.xi 0x0000,
515*53ee8cc1Swenshuai.xi 0x0000,
516*53ee8cc1Swenshuai.xi 0x0000,
517*53ee8cc1Swenshuai.xi 0x0000,
518*53ee8cc1Swenshuai.xi 0x0000,
519*53ee8cc1Swenshuai.xi 0x0000,
520*53ee8cc1Swenshuai.xi 0x0100,
521*53ee8cc1Swenshuai.xi 0x0030,
522*53ee8cc1Swenshuai.xi 0x01c0,
523*53ee8cc1Swenshuai.xi 0x0040,
524*53ee8cc1Swenshuai.xi 0x01e0,
525*53ee8cc1Swenshuai.xi 0x0050,
526*53ee8cc1Swenshuai.xi 0x01f0,
527*53ee8cc1Swenshuai.xi 0x0060,
528*53ee8cc1Swenshuai.xi 0x01f8,
529*53ee8cc1Swenshuai.xi 0x0070,
530*53ee8cc1Swenshuai.xi 0x01fc,
531*53ee8cc1Swenshuai.xi 0x0080,
532*53ee8cc1Swenshuai.xi 0x01fe,
533*53ee8cc1Swenshuai.xi 0x0090,
534*53ee8cc1Swenshuai.xi 0x01ff,
535*53ee8cc1Swenshuai.xi 0x80a0,
536*53ee8cc1Swenshuai.xi 0x01ff,
537*53ee8cc1Swenshuai.xi 0xc0b0,
538*53ee8cc1Swenshuai.xi 0x01ff,
539*53ee8cc1Swenshuai.xi 0x0000,
540*53ee8cc1Swenshuai.xi 0x0000,
541*53ee8cc1Swenshuai.xi 0x0000,
542*53ee8cc1Swenshuai.xi 0x0000,
543*53ee8cc1Swenshuai.xi 0x0000,
544*53ee8cc1Swenshuai.xi 0x0000,
545*53ee8cc1Swenshuai.xi 0x0000,
546*53ee8cc1Swenshuai.xi 0x0000,
547*53ee8cc1Swenshuai.xi 0x0000,
548*53ee8cc1Swenshuai.xi 0x0000,
549*53ee8cc1Swenshuai.xi 0x0000,
550*53ee8cc1Swenshuai.xi 0x0000,
551*53ee8cc1Swenshuai.xi 0x0000,
552*53ee8cc1Swenshuai.xi 0x0100,
553*53ee8cc1Swenshuai.xi 0x0002,
554*53ee8cc1Swenshuai.xi 0x0180,
555*53ee8cc1Swenshuai.xi 0x0003,
556*53ee8cc1Swenshuai.xi 0x01a0,
557*53ee8cc1Swenshuai.xi 0x0006,
558*53ee8cc1Swenshuai.xi 0x01d0,
559*53ee8cc1Swenshuai.xi 0x0009,
560*53ee8cc1Swenshuai.xi 0x01e8,
561*53ee8cc1Swenshuai.xi 0x000b,
562*53ee8cc1Swenshuai.xi 0x01f0,
563*53ee8cc1Swenshuai.xi 0x000f,
564*53ee8cc1Swenshuai.xi 0x01f8,
565*53ee8cc1Swenshuai.xi 0x0012,
566*53ee8cc1Swenshuai.xi 0x01fb,
567*53ee8cc1Swenshuai.xi 0x8017,
568*53ee8cc1Swenshuai.xi 0x01fd,
569*53ee8cc1Swenshuai.xi 0xc01c,
570*53ee8cc1Swenshuai.xi 0x01fe,
571*53ee8cc1Swenshuai.xi 0x4020,
572*53ee8cc1Swenshuai.xi 0x01ff,
573*53ee8cc1Swenshuai.xi 0x0000,
574*53ee8cc1Swenshuai.xi 0x0000,
575*53ee8cc1Swenshuai.xi 0x0000,
576*53ee8cc1Swenshuai.xi 0x0000,
577*53ee8cc1Swenshuai.xi 0x8024,
578*53ee8cc1Swenshuai.xi 0x01ff,
579*53ee8cc1Swenshuai.xi 0x8225,
580*53ee8cc1Swenshuai.xi 0x01ff,
581*53ee8cc1Swenshuai.xi 0x0000,
582*53ee8cc1Swenshuai.xi 0x0000,
583*53ee8cc1Swenshuai.xi 0x0000,
584*53ee8cc1Swenshuai.xi 0x0100,
585*53ee8cc1Swenshuai.xi 0x0002,
586*53ee8cc1Swenshuai.xi 0x0180,
587*53ee8cc1Swenshuai.xi 0x0003,
588*53ee8cc1Swenshuai.xi 0x01a0,
589*53ee8cc1Swenshuai.xi 0x0005,
590*53ee8cc1Swenshuai.xi 0x01c0,
591*53ee8cc1Swenshuai.xi 0x0009,
592*53ee8cc1Swenshuai.xi 0x01e0,
593*53ee8cc1Swenshuai.xi 0x000d,
594*53ee8cc1Swenshuai.xi 0x01f0,
595*53ee8cc1Swenshuai.xi 0x0010,
596*53ee8cc1Swenshuai.xi 0x01f6,
597*53ee8cc1Swenshuai.xi 0x0014,
598*53ee8cc1Swenshuai.xi 0x01fa,
599*53ee8cc1Swenshuai.xi 0x801b,
600*53ee8cc1Swenshuai.xi 0x01fd,
601*53ee8cc1Swenshuai.xi 0xc020,
602*53ee8cc1Swenshuai.xi 0x01fe,
603*53ee8cc1Swenshuai.xi 0x4024,
604*53ee8cc1Swenshuai.xi 0x01ff,
605*53ee8cc1Swenshuai.xi 0x0000,
606*53ee8cc1Swenshuai.xi 0x0000,
607*53ee8cc1Swenshuai.xi 0x8028,
608*53ee8cc1Swenshuai.xi 0x01ff,
609*53ee8cc1Swenshuai.xi 0x8429,
610*53ee8cc1Swenshuai.xi 0x01ff,
611*53ee8cc1Swenshuai.xi 0x882b,
612*53ee8cc1Swenshuai.xi 0x01ff
613*53ee8cc1Swenshuai.xi };
614*53ee8cc1Swenshuai.xi #endif
615*53ee8cc1Swenshuai.xi #if 0
616*53ee8cc1Swenshuai.xi const MS_U16 g16SYMIDX_TBL[]=
617*53ee8cc1Swenshuai.xi {
618*53ee8cc1Swenshuai.xi 0x0001,
619*53ee8cc1Swenshuai.xi 0x0102,
620*53ee8cc1Swenshuai.xi 0x0203,
621*53ee8cc1Swenshuai.xi 0x0300,
622*53ee8cc1Swenshuai.xi 0x1104,
623*53ee8cc1Swenshuai.xi 0x0411,
624*53ee8cc1Swenshuai.xi 0x0505,
625*53ee8cc1Swenshuai.xi 0x2112,
626*53ee8cc1Swenshuai.xi 0x3121,
627*53ee8cc1Swenshuai.xi 0x0631,
628*53ee8cc1Swenshuai.xi 0x1241,
629*53ee8cc1Swenshuai.xi 0x4106,
630*53ee8cc1Swenshuai.xi 0x5113,
631*53ee8cc1Swenshuai.xi 0x0751,
632*53ee8cc1Swenshuai.xi 0x6161,
633*53ee8cc1Swenshuai.xi 0x7107,
634*53ee8cc1Swenshuai.xi 0x1322,
635*53ee8cc1Swenshuai.xi 0x2271,
636*53ee8cc1Swenshuai.xi 0x3214,
637*53ee8cc1Swenshuai.xi 0x8132,
638*53ee8cc1Swenshuai.xi 0x0881,
639*53ee8cc1Swenshuai.xi 0x1491,
640*53ee8cc1Swenshuai.xi 0x42a1,
641*53ee8cc1Swenshuai.xi 0x9108,
642*53ee8cc1Swenshuai.xi 0xa123,
643*53ee8cc1Swenshuai.xi 0xb142,
644*53ee8cc1Swenshuai.xi 0xc1b1,
645*53ee8cc1Swenshuai.xi 0x09c1,
646*53ee8cc1Swenshuai.xi 0x2315,
647*53ee8cc1Swenshuai.xi 0x3352,
648*53ee8cc1Swenshuai.xi 0x52d1,
649*53ee8cc1Swenshuai.xi 0xf0f0,
650*53ee8cc1Swenshuai.xi 0x1524,
651*53ee8cc1Swenshuai.xi 0x6233,
652*53ee8cc1Swenshuai.xi 0x7262,
653*53ee8cc1Swenshuai.xi 0xd172,
654*53ee8cc1Swenshuai.xi 0x0a82,
655*53ee8cc1Swenshuai.xi 0x1609,
656*53ee8cc1Swenshuai.xi 0x240a,
657*53ee8cc1Swenshuai.xi 0x3416,
658*53ee8cc1Swenshuai.xi 0xe117,
659*53ee8cc1Swenshuai.xi 0x2518,
660*53ee8cc1Swenshuai.xi 0xf119,
661*53ee8cc1Swenshuai.xi 0x171a,
662*53ee8cc1Swenshuai.xi 0x1825,
663*53ee8cc1Swenshuai.xi 0x1926,
664*53ee8cc1Swenshuai.xi 0x1a27,
665*53ee8cc1Swenshuai.xi 0x2628,
666*53ee8cc1Swenshuai.xi 0x2729,
667*53ee8cc1Swenshuai.xi 0x282a,
668*53ee8cc1Swenshuai.xi 0x2934,
669*53ee8cc1Swenshuai.xi 0x2a35,
670*53ee8cc1Swenshuai.xi 0x3536,
671*53ee8cc1Swenshuai.xi 0x3637,
672*53ee8cc1Swenshuai.xi 0x3738,
673*53ee8cc1Swenshuai.xi 0x3839,
674*53ee8cc1Swenshuai.xi 0x393a,
675*53ee8cc1Swenshuai.xi 0x3a43,
676*53ee8cc1Swenshuai.xi 0x4344,
677*53ee8cc1Swenshuai.xi 0x4445,
678*53ee8cc1Swenshuai.xi 0x4546,
679*53ee8cc1Swenshuai.xi 0x4647,
680*53ee8cc1Swenshuai.xi 0x4748,
681*53ee8cc1Swenshuai.xi 0x4849,
682*53ee8cc1Swenshuai.xi 0x494a,
683*53ee8cc1Swenshuai.xi 0x4a53,
684*53ee8cc1Swenshuai.xi 0x5354,
685*53ee8cc1Swenshuai.xi 0x5455,
686*53ee8cc1Swenshuai.xi 0x5556,
687*53ee8cc1Swenshuai.xi 0x5657,
688*53ee8cc1Swenshuai.xi 0x5758,
689*53ee8cc1Swenshuai.xi 0x5859,
690*53ee8cc1Swenshuai.xi 0x595a,
691*53ee8cc1Swenshuai.xi 0x5a63,
692*53ee8cc1Swenshuai.xi 0x6364,
693*53ee8cc1Swenshuai.xi 0x6465,
694*53ee8cc1Swenshuai.xi 0x6566,
695*53ee8cc1Swenshuai.xi 0x6667,
696*53ee8cc1Swenshuai.xi 0x6768,
697*53ee8cc1Swenshuai.xi 0x6869,
698*53ee8cc1Swenshuai.xi 0x696a,
699*53ee8cc1Swenshuai.xi 0x6a73,
700*53ee8cc1Swenshuai.xi 0x7374,
701*53ee8cc1Swenshuai.xi 0x7475,
702*53ee8cc1Swenshuai.xi 0x7576,
703*53ee8cc1Swenshuai.xi 0x7677,
704*53ee8cc1Swenshuai.xi 0x7778,
705*53ee8cc1Swenshuai.xi 0x7879,
706*53ee8cc1Swenshuai.xi 0x797a,
707*53ee8cc1Swenshuai.xi 0x7a83,
708*53ee8cc1Swenshuai.xi 0x8284,
709*53ee8cc1Swenshuai.xi 0x8385,
710*53ee8cc1Swenshuai.xi 0x8486,
711*53ee8cc1Swenshuai.xi 0x8587,
712*53ee8cc1Swenshuai.xi 0x8688,
713*53ee8cc1Swenshuai.xi 0x8789,
714*53ee8cc1Swenshuai.xi 0x888a,
715*53ee8cc1Swenshuai.xi 0x8992,
716*53ee8cc1Swenshuai.xi 0x8a93,
717*53ee8cc1Swenshuai.xi 0x9294,
718*53ee8cc1Swenshuai.xi 0x9395,
719*53ee8cc1Swenshuai.xi 0x9496,
720*53ee8cc1Swenshuai.xi 0x9597,
721*53ee8cc1Swenshuai.xi 0x9698,
722*53ee8cc1Swenshuai.xi 0x9799,
723*53ee8cc1Swenshuai.xi 0x989a,
724*53ee8cc1Swenshuai.xi 0x99a2,
725*53ee8cc1Swenshuai.xi 0x9aa3,
726*53ee8cc1Swenshuai.xi 0xa2a4,
727*53ee8cc1Swenshuai.xi 0xa3a5,
728*53ee8cc1Swenshuai.xi 0xa4a6,
729*53ee8cc1Swenshuai.xi 0xa5a7,
730*53ee8cc1Swenshuai.xi 0xa6a8,
731*53ee8cc1Swenshuai.xi 0xa7a9,
732*53ee8cc1Swenshuai.xi 0xa8aa,
733*53ee8cc1Swenshuai.xi 0xa9b2,
734*53ee8cc1Swenshuai.xi 0xaab3,
735*53ee8cc1Swenshuai.xi 0xb2b4,
736*53ee8cc1Swenshuai.xi 0xb3b5,
737*53ee8cc1Swenshuai.xi 0xb4b6,
738*53ee8cc1Swenshuai.xi 0xb5b7,
739*53ee8cc1Swenshuai.xi 0xb6b8,
740*53ee8cc1Swenshuai.xi 0xb7b9,
741*53ee8cc1Swenshuai.xi 0xb8ba,
742*53ee8cc1Swenshuai.xi 0xb9c2,
743*53ee8cc1Swenshuai.xi 0xbac3,
744*53ee8cc1Swenshuai.xi 0xc2c4,
745*53ee8cc1Swenshuai.xi 0xc3c5,
746*53ee8cc1Swenshuai.xi 0xc4c6,
747*53ee8cc1Swenshuai.xi 0xc5c7,
748*53ee8cc1Swenshuai.xi 0xc6c8,
749*53ee8cc1Swenshuai.xi 0xc7c9,
750*53ee8cc1Swenshuai.xi 0xc8ca,
751*53ee8cc1Swenshuai.xi 0xc9d2,
752*53ee8cc1Swenshuai.xi 0xcad3,
753*53ee8cc1Swenshuai.xi 0xd2d4,
754*53ee8cc1Swenshuai.xi 0xd3d5,
755*53ee8cc1Swenshuai.xi 0xd4d6,
756*53ee8cc1Swenshuai.xi 0xd5d7,
757*53ee8cc1Swenshuai.xi 0xd6d8,
758*53ee8cc1Swenshuai.xi 0xd7d9,
759*53ee8cc1Swenshuai.xi 0xd8da,
760*53ee8cc1Swenshuai.xi 0xd9e1,
761*53ee8cc1Swenshuai.xi 0xdae2,
762*53ee8cc1Swenshuai.xi 0xe2e3,
763*53ee8cc1Swenshuai.xi 0xe3e4,
764*53ee8cc1Swenshuai.xi 0xe4e5,
765*53ee8cc1Swenshuai.xi 0xe5e6,
766*53ee8cc1Swenshuai.xi 0xe6e7,
767*53ee8cc1Swenshuai.xi 0xe7e8,
768*53ee8cc1Swenshuai.xi 0xe8e9,
769*53ee8cc1Swenshuai.xi 0xe9ea,
770*53ee8cc1Swenshuai.xi 0xeaf1,
771*53ee8cc1Swenshuai.xi 0xf2f2,
772*53ee8cc1Swenshuai.xi 0xf3f3,
773*53ee8cc1Swenshuai.xi 0xf4f4,
774*53ee8cc1Swenshuai.xi 0xf5f5,
775*53ee8cc1Swenshuai.xi 0xf6f6,
776*53ee8cc1Swenshuai.xi 0xf7f7,
777*53ee8cc1Swenshuai.xi 0xf8f8,
778*53ee8cc1Swenshuai.xi 0xf9f9,
779*53ee8cc1Swenshuai.xi 0xfafa,
780*53ee8cc1Swenshuai.xi 0x0000,
781*53ee8cc1Swenshuai.xi 0x0000,
782*53ee8cc1Swenshuai.xi 0x0000,
783*53ee8cc1Swenshuai.xi 0x0000,
784*53ee8cc1Swenshuai.xi 0x0000,
785*53ee8cc1Swenshuai.xi 0x0000,
786*53ee8cc1Swenshuai.xi 0x0000,
787*53ee8cc1Swenshuai.xi 0x0000,
788*53ee8cc1Swenshuai.xi 0x0000,
789*53ee8cc1Swenshuai.xi 0x0000,
790*53ee8cc1Swenshuai.xi 0x0000,
791*53ee8cc1Swenshuai.xi 0x0000,
792*53ee8cc1Swenshuai.xi 0x0000,
793*53ee8cc1Swenshuai.xi 0x0000,
794*53ee8cc1Swenshuai.xi 0x0000,
795*53ee8cc1Swenshuai.xi 0x0000,
796*53ee8cc1Swenshuai.xi 0x0000,
797*53ee8cc1Swenshuai.xi 0x0000,
798*53ee8cc1Swenshuai.xi 0x0000,
799*53ee8cc1Swenshuai.xi 0x0000,
800*53ee8cc1Swenshuai.xi 0x0000,
801*53ee8cc1Swenshuai.xi 0x0000,
802*53ee8cc1Swenshuai.xi 0x0000,
803*53ee8cc1Swenshuai.xi 0x0000,
804*53ee8cc1Swenshuai.xi 0x0000,
805*53ee8cc1Swenshuai.xi 0x0000,
806*53ee8cc1Swenshuai.xi 0x0000,
807*53ee8cc1Swenshuai.xi 0x0000,
808*53ee8cc1Swenshuai.xi 0x0000,
809*53ee8cc1Swenshuai.xi 0x0000,
810*53ee8cc1Swenshuai.xi 0x0000,
811*53ee8cc1Swenshuai.xi 0x0000,
812*53ee8cc1Swenshuai.xi 0x0000,
813*53ee8cc1Swenshuai.xi 0x0000,
814*53ee8cc1Swenshuai.xi 0x0000,
815*53ee8cc1Swenshuai.xi 0x0000,
816*53ee8cc1Swenshuai.xi 0x0000,
817*53ee8cc1Swenshuai.xi 0x0000,
818*53ee8cc1Swenshuai.xi 0x0000,
819*53ee8cc1Swenshuai.xi 0x0000,
820*53ee8cc1Swenshuai.xi 0x0000,
821*53ee8cc1Swenshuai.xi 0x0000,
822*53ee8cc1Swenshuai.xi 0x0000,
823*53ee8cc1Swenshuai.xi 0x0000,
824*53ee8cc1Swenshuai.xi 0x0000,
825*53ee8cc1Swenshuai.xi 0x0000,
826*53ee8cc1Swenshuai.xi 0x0000,
827*53ee8cc1Swenshuai.xi 0x0000,
828*53ee8cc1Swenshuai.xi 0x0000,
829*53ee8cc1Swenshuai.xi 0x0000,
830*53ee8cc1Swenshuai.xi 0x0000,
831*53ee8cc1Swenshuai.xi 0x0000,
832*53ee8cc1Swenshuai.xi 0x0000,
833*53ee8cc1Swenshuai.xi 0x0000,
834*53ee8cc1Swenshuai.xi 0x0000,
835*53ee8cc1Swenshuai.xi 0x0000,
836*53ee8cc1Swenshuai.xi 0x0000,
837*53ee8cc1Swenshuai.xi 0x0000,
838*53ee8cc1Swenshuai.xi 0x0000,
839*53ee8cc1Swenshuai.xi 0x0000,
840*53ee8cc1Swenshuai.xi 0x0000,
841*53ee8cc1Swenshuai.xi 0x0000,
842*53ee8cc1Swenshuai.xi 0x0000,
843*53ee8cc1Swenshuai.xi 0x0000,
844*53ee8cc1Swenshuai.xi 0x0000,
845*53ee8cc1Swenshuai.xi 0x0000,
846*53ee8cc1Swenshuai.xi 0x0000,
847*53ee8cc1Swenshuai.xi 0x0000,
848*53ee8cc1Swenshuai.xi 0x0000,
849*53ee8cc1Swenshuai.xi 0x0000,
850*53ee8cc1Swenshuai.xi 0x0000,
851*53ee8cc1Swenshuai.xi 0x0000,
852*53ee8cc1Swenshuai.xi 0x0000,
853*53ee8cc1Swenshuai.xi 0x0000,
854*53ee8cc1Swenshuai.xi 0x0000,
855*53ee8cc1Swenshuai.xi 0x0000,
856*53ee8cc1Swenshuai.xi 0x0000,
857*53ee8cc1Swenshuai.xi 0x0000,
858*53ee8cc1Swenshuai.xi 0x0000,
859*53ee8cc1Swenshuai.xi 0x0000,
860*53ee8cc1Swenshuai.xi 0x0000,
861*53ee8cc1Swenshuai.xi 0x0000,
862*53ee8cc1Swenshuai.xi 0x0000,
863*53ee8cc1Swenshuai.xi 0x0000,
864*53ee8cc1Swenshuai.xi 0x0000,
865*53ee8cc1Swenshuai.xi 0x0000,
866*53ee8cc1Swenshuai.xi 0x0000,
867*53ee8cc1Swenshuai.xi 0x0000,
868*53ee8cc1Swenshuai.xi 0x0000,
869*53ee8cc1Swenshuai.xi 0x0000,
870*53ee8cc1Swenshuai.xi 0x0000,
871*53ee8cc1Swenshuai.xi 0x0000,
872*53ee8cc1Swenshuai.xi 0x0000,
873*53ee8cc1Swenshuai.xi 0x0000,
874*53ee8cc1Swenshuai.xi 0x0000,
875*53ee8cc1Swenshuai.xi 0x0101,
876*53ee8cc1Swenshuai.xi 0x0202,
877*53ee8cc1Swenshuai.xi 0x0303,
878*53ee8cc1Swenshuai.xi 0x0404,
879*53ee8cc1Swenshuai.xi 0x0505,
880*53ee8cc1Swenshuai.xi 0x0606,
881*53ee8cc1Swenshuai.xi 0x0707,
882*53ee8cc1Swenshuai.xi 0x0808,
883*53ee8cc1Swenshuai.xi 0x0909,
884*53ee8cc1Swenshuai.xi 0x0a0a,
885*53ee8cc1Swenshuai.xi 0x0b0b,
886*53ee8cc1Swenshuai.xi 0x0000,
887*53ee8cc1Swenshuai.xi 0x0000,
888*53ee8cc1Swenshuai.xi 0x0000,
889*53ee8cc1Swenshuai.xi 0x0000
890*53ee8cc1Swenshuai.xi };
891*53ee8cc1Swenshuai.xi #endif
892*53ee8cc1Swenshuai.xi #if 0
893*53ee8cc1Swenshuai.xi const MS_U16 g16IQ_TBL[128]=
894*53ee8cc1Swenshuai.xi {
895*53ee8cc1Swenshuai.xi 0x0010,
896*53ee8cc1Swenshuai.xi 0x000b,
897*53ee8cc1Swenshuai.xi 0x000a,
898*53ee8cc1Swenshuai.xi 0x0010,
899*53ee8cc1Swenshuai.xi 0x0018,
900*53ee8cc1Swenshuai.xi 0x0028,
901*53ee8cc1Swenshuai.xi 0x0033,
902*53ee8cc1Swenshuai.xi 0x003d,
903*53ee8cc1Swenshuai.xi 0x000c,
904*53ee8cc1Swenshuai.xi 0x000c,
905*53ee8cc1Swenshuai.xi 0x000e,
906*53ee8cc1Swenshuai.xi 0x0013,
907*53ee8cc1Swenshuai.xi 0x001a,
908*53ee8cc1Swenshuai.xi 0x003a,
909*53ee8cc1Swenshuai.xi 0x003c,
910*53ee8cc1Swenshuai.xi 0x0037,
911*53ee8cc1Swenshuai.xi 0x000e,
912*53ee8cc1Swenshuai.xi 0x000d,
913*53ee8cc1Swenshuai.xi 0x0010,
914*53ee8cc1Swenshuai.xi 0x0018,
915*53ee8cc1Swenshuai.xi 0x0028,
916*53ee8cc1Swenshuai.xi 0x0039,
917*53ee8cc1Swenshuai.xi 0x0045,
918*53ee8cc1Swenshuai.xi 0x0038,
919*53ee8cc1Swenshuai.xi 0x000e,
920*53ee8cc1Swenshuai.xi 0x0011,
921*53ee8cc1Swenshuai.xi 0x0016,
922*53ee8cc1Swenshuai.xi 0x001d,
923*53ee8cc1Swenshuai.xi 0x0033,
924*53ee8cc1Swenshuai.xi 0x0057,
925*53ee8cc1Swenshuai.xi 0x0050,
926*53ee8cc1Swenshuai.xi 0x003e,
927*53ee8cc1Swenshuai.xi 0x0012,
928*53ee8cc1Swenshuai.xi 0x0016,
929*53ee8cc1Swenshuai.xi 0x0025,
930*53ee8cc1Swenshuai.xi 0x0038,
931*53ee8cc1Swenshuai.xi 0x0044,
932*53ee8cc1Swenshuai.xi 0x006d,
933*53ee8cc1Swenshuai.xi 0x0067,
934*53ee8cc1Swenshuai.xi 0x004d,
935*53ee8cc1Swenshuai.xi 0x0018,
936*53ee8cc1Swenshuai.xi 0x0023,
937*53ee8cc1Swenshuai.xi 0x0037,
938*53ee8cc1Swenshuai.xi 0x0040,
939*53ee8cc1Swenshuai.xi 0x0051,
940*53ee8cc1Swenshuai.xi 0x0068,
941*53ee8cc1Swenshuai.xi 0x0071,
942*53ee8cc1Swenshuai.xi 0x005c,
943*53ee8cc1Swenshuai.xi 0x0031,
944*53ee8cc1Swenshuai.xi 0x0040,
945*53ee8cc1Swenshuai.xi 0x004e,
946*53ee8cc1Swenshuai.xi 0x0057,
947*53ee8cc1Swenshuai.xi 0x0067,
948*53ee8cc1Swenshuai.xi 0x0079,
949*53ee8cc1Swenshuai.xi 0x0078,
950*53ee8cc1Swenshuai.xi 0x0065,
951*53ee8cc1Swenshuai.xi 0x0048,
952*53ee8cc1Swenshuai.xi 0x005c,
953*53ee8cc1Swenshuai.xi 0x005f,
954*53ee8cc1Swenshuai.xi 0x0062,
955*53ee8cc1Swenshuai.xi 0x0070,
956*53ee8cc1Swenshuai.xi 0x0064,
957*53ee8cc1Swenshuai.xi 0x0067,
958*53ee8cc1Swenshuai.xi 0x0063,
959*53ee8cc1Swenshuai.xi 0x0011,
960*53ee8cc1Swenshuai.xi 0x0012,
961*53ee8cc1Swenshuai.xi 0x0018,
962*53ee8cc1Swenshuai.xi 0x002f,
963*53ee8cc1Swenshuai.xi 0x0063,
964*53ee8cc1Swenshuai.xi 0x0063,
965*53ee8cc1Swenshuai.xi 0x0063,
966*53ee8cc1Swenshuai.xi 0x0063,
967*53ee8cc1Swenshuai.xi 0x0012,
968*53ee8cc1Swenshuai.xi 0x0015,
969*53ee8cc1Swenshuai.xi 0x001a,
970*53ee8cc1Swenshuai.xi 0x0042,
971*53ee8cc1Swenshuai.xi 0x0063,
972*53ee8cc1Swenshuai.xi 0x0063,
973*53ee8cc1Swenshuai.xi 0x0063,
974*53ee8cc1Swenshuai.xi 0x0063,
975*53ee8cc1Swenshuai.xi 0x0018,
976*53ee8cc1Swenshuai.xi 0x001a,
977*53ee8cc1Swenshuai.xi 0x0038,
978*53ee8cc1Swenshuai.xi 0x0063,
979*53ee8cc1Swenshuai.xi 0x0063,
980*53ee8cc1Swenshuai.xi 0x0063,
981*53ee8cc1Swenshuai.xi 0x0063,
982*53ee8cc1Swenshuai.xi 0x0063,
983*53ee8cc1Swenshuai.xi 0x002f,
984*53ee8cc1Swenshuai.xi 0x0042,
985*53ee8cc1Swenshuai.xi 0x0063,
986*53ee8cc1Swenshuai.xi 0x0063,
987*53ee8cc1Swenshuai.xi 0x0063,
988*53ee8cc1Swenshuai.xi 0x0063,
989*53ee8cc1Swenshuai.xi 0x0063,
990*53ee8cc1Swenshuai.xi 0x0063,
991*53ee8cc1Swenshuai.xi 0x0063,
992*53ee8cc1Swenshuai.xi 0x0063,
993*53ee8cc1Swenshuai.xi 0x0063,
994*53ee8cc1Swenshuai.xi 0x0063,
995*53ee8cc1Swenshuai.xi 0x0063,
996*53ee8cc1Swenshuai.xi 0x0063,
997*53ee8cc1Swenshuai.xi 0x0063,
998*53ee8cc1Swenshuai.xi 0x0063,
999*53ee8cc1Swenshuai.xi 0x0063,
1000*53ee8cc1Swenshuai.xi 0x0063,
1001*53ee8cc1Swenshuai.xi 0x0063,
1002*53ee8cc1Swenshuai.xi 0x0063,
1003*53ee8cc1Swenshuai.xi 0x0063,
1004*53ee8cc1Swenshuai.xi 0x0063,
1005*53ee8cc1Swenshuai.xi 0x0063,
1006*53ee8cc1Swenshuai.xi 0x0063,
1007*53ee8cc1Swenshuai.xi 0x0063,
1008*53ee8cc1Swenshuai.xi 0x0063,
1009*53ee8cc1Swenshuai.xi 0x0063,
1010*53ee8cc1Swenshuai.xi 0x0063,
1011*53ee8cc1Swenshuai.xi 0x0063,
1012*53ee8cc1Swenshuai.xi 0x0063,
1013*53ee8cc1Swenshuai.xi 0x0063,
1014*53ee8cc1Swenshuai.xi 0x0063,
1015*53ee8cc1Swenshuai.xi 0x0063,
1016*53ee8cc1Swenshuai.xi 0x0063,
1017*53ee8cc1Swenshuai.xi 0x0063,
1018*53ee8cc1Swenshuai.xi 0x0063,
1019*53ee8cc1Swenshuai.xi 0x0063,
1020*53ee8cc1Swenshuai.xi 0x0063,
1021*53ee8cc1Swenshuai.xi 0x0063,
1022*53ee8cc1Swenshuai.xi 0x0063
1023*53ee8cc1Swenshuai.xi };
1024*53ee8cc1Swenshuai.xi #endif
1025*53ee8cc1Swenshuai.xi 
1026*53ee8cc1Swenshuai.xi /* entry n is (-1 << n) + 1 */
1027*53ee8cc1Swenshuai.xi static const MS_S32 extend_offset[16] =
1028*53ee8cc1Swenshuai.xi {
1029*53ee8cc1Swenshuai.xi     0, (( -1)<<1)+1, ((-1)<<2)+1, ((-1)<<3) + 1, ((-1)<<4)+1, ((-1)<<5)+1,
1030*53ee8cc1Swenshuai.xi     ((-1)<<6)+1, ((-1)<<7)+1, ((-1)<<8)+1, ((-1)<<9)+1, ((-1) <<10)+1,
1031*53ee8cc1Swenshuai.xi     ((-1)<<11)+1, ((-1)<<12)+1, ((-1)<<13)+1, ((-1)<<14)+1, ((-1)<<15)+1
1032*53ee8cc1Swenshuai.xi };
1033*53ee8cc1Swenshuai.xi 
1034*53ee8cc1Swenshuai.xi /* entry n is 2**(n-1) */
1035*53ee8cc1Swenshuai.xi static const MS_S32 extend_test[16] =
1036*53ee8cc1Swenshuai.xi {
1037*53ee8cc1Swenshuai.xi     0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000
1038*53ee8cc1Swenshuai.xi };
1039*53ee8cc1Swenshuai.xi 
1040*53ee8cc1Swenshuai.xi static const MS_S32 extend_mask[] =
1041*53ee8cc1Swenshuai.xi {
1042*53ee8cc1Swenshuai.xi     0, (1<<0), (1<<1), (1<<2), (1<<3), (1<<4), (1<<5), (1<<6), (1<<7), (1<<8),
1043*53ee8cc1Swenshuai.xi     (1<<9), (1<<10), (1<<11), (1<<12), (1<<13), (1<<14), (1<<15), (1<<16),
1044*53ee8cc1Swenshuai.xi };
1045*53ee8cc1Swenshuai.xi 
1046*53ee8cc1Swenshuai.xi 
1047*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ReadBufferAddr;
1048*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ReadBufferSize;
1049*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32WriteBufferAddr;
1050*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32WriteBufferSize;
1051*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32InternalBufferAddr;
1052*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32InternalBufferSize;
1053*53ee8cc1Swenshuai.xi 
1054*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32RLEOffset;   // offset to record the current RLE access address
1055*53ee8cc1Swenshuai.xi 
1056*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_HdrChk _HeadCheck;
1057*53ee8cc1Swenshuai.xi 
1058*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_BLOCK_TYPE _s16dc_pred[3];
1059*53ee8cc1Swenshuai.xi 
1060*53ee8cc1Swenshuai.xi // The width/height may be the thumbnail or original image size, it based on decoding mode
1061*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Image_x_size;
1062*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Image_y_size;
1063*53ee8cc1Swenshuai.xi 
1064*53ee8cc1Swenshuai.xi // The original size of this JPEG file after alignment
1065*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16OriginalImage_x_size;
1066*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16OriginalImage_y_size;
1067*53ee8cc1Swenshuai.xi 
1068*53ee8cc1Swenshuai.xi // The original size before alignment
1069*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16NonAlignmentImage_x_size;
1070*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16NonAlignmentImage_y_size;
1071*53ee8cc1Swenshuai.xi 
1072*53ee8cc1Swenshuai.xi // The width/height/pitch of image for displaying.
1073*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImageWidth;
1074*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImagePitch;
1075*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImageHeight;
1076*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImagePitch_H;
1077*53ee8cc1Swenshuai.xi 
1078*53ee8cc1Swenshuai.xi // Scale Down Factor
1079*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8ScaleDownFactor;
1080*53ee8cc1Swenshuai.xi 
1081*53ee8cc1Swenshuai.xi ////JPEG_STATIC PJPEG_FILE_FileSystem_t _pStream;
1082*53ee8cc1Swenshuai.xi 
1083*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8DecodeType = E_JPEG_TYPE_MAIN;
1084*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bProgressive_flag;
1085*53ee8cc1Swenshuai.xi 
1086*53ee8cc1Swenshuai.xi #ifndef CMODEL
1087*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8DownScaleRatio;
1088*53ee8cc1Swenshuai.xi #endif
1089*53ee8cc1Swenshuai.xi 
1090*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bFirstRLE;
1091*53ee8cc1Swenshuai.xi 
1092*53ee8cc1Swenshuai.xi /******* Thumbnail related *******/
1093*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bThumbnailFound;
1094*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bThumbnailAccessMode;
1095*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ThumbnailOffset;
1096*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16ThumbnailSize;
1097*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bTiffBigEndian;
1098*53ee8cc1Swenshuai.xi 
1099*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ThumbnailBufferOffset;   // keep track of thumb buffer access address
1100*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u16ThumbnailBufferSize;   // keep track of thumb buffer size
1101*53ee8cc1Swenshuai.xi /*****************************/
1102*53ee8cc1Swenshuai.xi 
1103*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_HuffInfo _Huff_info[JPEG_MAXHUFFTABLES];
1104*53ee8cc1Swenshuai.xi 
1105*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_QuantTbl _QuantTables[JPEG_MAXQUANTTABLES]; /* pointer to quantization tables */
1106*53ee8cc1Swenshuai.xi 
1107*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comps_in_frame;                             /* # of components in frame */
1108*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_h_samp[JPEG_MAXCOMPONENTS];     /* component's horizontal sampling factor */
1109*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_v_samp[JPEG_MAXCOMPONENTS];     /* component's vertical sampling factor */
1110*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_quant[JPEG_MAXCOMPONENTS];      /* component's quantization table selector */
1111*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_ident[JPEG_MAXCOMPONENTS];      /* component's ID */
1112*53ee8cc1Swenshuai.xi 
1113*53ee8cc1Swenshuai.xi // The Luma and Chroma (YU) component ID, default is 1 & 2
1114*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8LumaCi = 1;
1115*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8ChromaCi = 2;
1116*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Chroma2Ci = 3;
1117*53ee8cc1Swenshuai.xi 
1118*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Comp_h_blocks[JPEG_MAXCOMPONENTS];
1119*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Comp_v_blocks[JPEG_MAXCOMPONENTS];
1120*53ee8cc1Swenshuai.xi 
1121*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comps_in_scan;                  /* # of components in scan */
1122*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_list[JPEG_MAXCOMPSINSCAN];      /* components in this scan */
1123*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_dc_tab[JPEG_MAXCOMPONENTS];     /* component's DC Huffman coding table selector */
1124*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_ac_tab[JPEG_MAXCOMPONENTS];     /* component's AC Huffman coding table selector */
1125*53ee8cc1Swenshuai.xi 
1126*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Spectral_start;                 /* spectral selection start */
1127*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Spectral_end;                   /* spectral selection end   */
1128*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Successive_low;                 /* successive approximation low */
1129*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Successive_high;                /* successive approximation high */
1130*53ee8cc1Swenshuai.xi 
1131*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Blocks_per_mcu;
1132*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Max_blocks_per_row;
1133*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Mcus_per_row;
1134*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Mcus_per_col;
1135*53ee8cc1Swenshuai.xi 
1136*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Mcu_org[JPEG_MAXBLOCKSPERMCU];
1137*53ee8cc1Swenshuai.xi 
1138*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 gu8Max_mcu_x_size;          /* MCU's max. X size in pixels */
1139*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 gu8Max_mcu_y_size;                 /* MCU's max. Y size in pixels */
1140*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 gu16Max_mcus_per_row;
1141*53ee8cc1Swenshuai.xi 
1142*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
1143*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Total_lines_left;               /* total # lines left in image */
1144*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Block_y_mcu[JPEG_MAXCOMPONENTS];
1145*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_HuffTbl _Huff_tbls[JPEG_MAXHUFFTABLES];
1146*53ee8cc1Swenshuai.xi JPEG_STATIC PJPEG_CoeffBuf _DC_Coeffs[JPEG_MAXCOMPONENTS];
1147*53ee8cc1Swenshuai.xi JPEG_STATIC PJPEG_CoeffBuf _AC_Coeffs[JPEG_MAXCOMPONENTS];
1148*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Last_dc_val[JPEG_MAXCOMPONENTS];
1149*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EOB_run;
1150*53ee8cc1Swenshuai.xi #ifdef CMODEL
1151*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 gu16Mcu_lines_left;                 /* total # lines left in this MCU */
1152*53ee8cc1Swenshuai.xi #endif
1153*53ee8cc1Swenshuai.xi #endif
1154*53ee8cc1Swenshuai.xi 
1155*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Max_blocks_per_mcu;
1156*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Max_mcus_per_col;
1157*53ee8cc1Swenshuai.xi 
1158*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 gu8Scan_type;                 /* Grey, Yh1v1, Yh1v2, Yh2v1, Yh2v2,
1159*53ee8cc1Swenshuai.xi                                        CMYK111, CMYK4114 */
1160*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 *_pu8In_buf_ofs;
1161*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32In_buf_left;
1162*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Tem_flag;
1163*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bEOF_flag;
1164*53ee8cc1Swenshuai.xi 
1165*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 *_pu8In_buf;
1166*53ee8cc1Swenshuai.xi 
1167*53ee8cc1Swenshuai.xi JPEG_STATIC MS_S16 _s16Bits_left;
1168*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Bit_buf;
1169*53ee8cc1Swenshuai.xi 
1170*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Restart_interval;
1171*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Restarts_left;
1172*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Next_restart_num;
1173*53ee8cc1Swenshuai.xi 
1174*53ee8cc1Swenshuai.xi JPEG_STATIC void *_pBlocks[JPEG_MAXBLOCKS];         /* list of all dynamically allocated blocks */
1175*53ee8cc1Swenshuai.xi 
1176*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_ErrCode _Error_code;
1177*53ee8cc1Swenshuai.xi 
1178*53ee8cc1Swenshuai.xi #ifdef CMODEL
1179*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bReady_flag;
1180*53ee8cc1Swenshuai.xi #endif
1181*53ee8cc1Swenshuai.xi 
1182*53ee8cc1Swenshuai.xi //#ifdef USE_LIBC
1183*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
1184*53ee8cc1Swenshuai.xi JPEG_STATIC jmp_buf _jmp_state;
1185*53ee8cc1Swenshuai.xi #endif
1186*53ee8cc1Swenshuai.xi //#endif
1187*53ee8cc1Swenshuai.xi 
1188*53ee8cc1Swenshuai.xi ////JPEG_STATIC MS_S32 _Total_Decoded_Size = 0;
1189*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI - harold
1190*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32  NumPics;
1191*53ee8cc1Swenshuai.xi #endif
1192*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Total_bytes_read;
1193*53ee8cc1Swenshuai.xi 
1194*53ee8cc1Swenshuai.xi //JPEG_STATIC MS_U8 *_pu32ExifHeaderAddr;
1195*53ee8cc1Swenshuai.xi 
1196*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_FillHdrFunc _pFillHdrFunc = NULL;
1197*53ee8cc1Swenshuai.xi 
1198*53ee8cc1Swenshuai.xi #ifdef CMODEL
1199*53ee8cc1Swenshuai.xi extern const MS_U8 _u8ZAG[64];
1200*53ee8cc1Swenshuai.xi extern const MS_U8 _u8Jpeg_zigzag_order[64];
1201*53ee8cc1Swenshuai.xi #elif SW_JPD_RGB_CMYK
1202*53ee8cc1Swenshuai.xi static const MS_U8 _u8ZAG[64+1] =
1203*53ee8cc1Swenshuai.xi {
1204*53ee8cc1Swenshuai.xi     0, 1, 8, 16, 9, 2, 3, 10,
1205*53ee8cc1Swenshuai.xi     17, 24, 32, 25, 18, 11, 4, 5,
1206*53ee8cc1Swenshuai.xi     12, 19, 26, 33, 40, 48, 41, 34,
1207*53ee8cc1Swenshuai.xi     27, 20, 13, 6, 7, 14, 21, 28,
1208*53ee8cc1Swenshuai.xi     35, 42, 49, 56, 57, 50, 43, 36,
1209*53ee8cc1Swenshuai.xi     29, 22, 15, 23, 30, 37, 44, 51,
1210*53ee8cc1Swenshuai.xi     58, 59, 52, 45, 38, 31, 39, 46,
1211*53ee8cc1Swenshuai.xi     53, 60, 61, 54, 47, 55, 62, 63
1212*53ee8cc1Swenshuai.xi     ,0
1213*53ee8cc1Swenshuai.xi };
1214*53ee8cc1Swenshuai.xi #endif
1215*53ee8cc1Swenshuai.xi 
1216*53ee8cc1Swenshuai.xi JPEG_STATIC MSIF_Version _api_jpeg_version = {
1217*53ee8cc1Swenshuai.xi     .DDI = { JPEG_API_VERSION },
1218*53ee8cc1Swenshuai.xi };
1219*53ee8cc1Swenshuai.xi 
1220*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8JPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
1221*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bMHEG5 = FALSE;
1222*53ee8cc1Swenshuai.xi 
1223*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _JPD_PreVIdx = 0; //For H/W bug, some cases can not exit after decode done
1224*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _JPD_IsDecoding = FALSE; //For H/W bug, some cases can not exit after decode done
1225*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _JPD_ReCheckTime = 0; //For H/W bug, some cases can not exit after decode done
1226*53ee8cc1Swenshuai.xi 
1227*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _Progressive_ROI_flag = FALSE; //CL82399
1228*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 ROI_width; //CL82399
1229*53ee8cc1Swenshuai.xi 
1230*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_BuffLoadType u8PreLHFlag = E_JPEG_BUFFER_NONE;
1231*53ee8cc1Swenshuai.xi 
1232*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 u32MRCheckCount = 0;
1233*53ee8cc1Swenshuai.xi 
1234*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bIsInit = FALSE;
1235*53ee8cc1Swenshuai.xi 
1236*53ee8cc1Swenshuai.xi ///JPEG_STATIC MS_U32 jpeg_input = 0;
1237*53ee8cc1Swenshuai.xi ///#define JPEG_GO     do{scanf("%d", &jpeg_input);}while(0)
1238*53ee8cc1Swenshuai.xi 
1239*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
1240*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *_ps16Block_seg[JPEG_MAXBLOCKSPERROW];
1241*53ee8cc1Swenshuai.xi MS_U8 _u8Block_max_zag_set[JPEG_MAXBLOCKSPERROW];
1242*53ee8cc1Swenshuai.xi MS_U8 *gpu8Sample_buf;
1243*53ee8cc1Swenshuai.xi MS_S32 gs32Crr[256];
1244*53ee8cc1Swenshuai.xi MS_S32 gs32Cbb[256];
1245*53ee8cc1Swenshuai.xi MS_S32 gs32Crg[256];
1246*53ee8cc1Swenshuai.xi MS_S32 gs32Cbg[256];
1247*53ee8cc1Swenshuai.xi 
1248*53ee8cc1Swenshuai.xi MS_U8 *pgu8Scan_line_0;
1249*53ee8cc1Swenshuai.xi MS_U8 *pgu8scan_line_1;
1250*53ee8cc1Swenshuai.xi 
1251*53ee8cc1Swenshuai.xi //JPEG_STATIC MS_U16 _u16Real_dest_bytes_per_scan_line;
1252*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Dest_bytes_per_scan_line;        /* rounded up */
1253*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Dest_bytes_per_pixel;            /* currently, 4 (RGB) or 1 (Y) */
1254*53ee8cc1Swenshuai.xi 
1255*53ee8cc1Swenshuai.xi #if ( ! SUPPORT_PROGRESSIVE_MODE) && ( ! defined(CMODEL))
1256*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Total_lines_left;               /* total # lines left in image */
1257*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Block_y_mcu[JPEG_MAXCOMPONENTS];
1258*53ee8cc1Swenshuai.xi //JPEG_STATIC MS_U16 gu16Mcu_lines_left;                 /* total # lines left in this MCU */
1259*53ee8cc1Swenshuai.xi #endif
1260*53ee8cc1Swenshuai.xi #endif
1261*53ee8cc1Swenshuai.xi 
1262*53ee8cc1Swenshuai.xi /*===========================================================================*/
1263*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL __bIsMjpeg = FALSE;
1264*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 __u32RealMjpegBase = 0x00000000;
1265*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 __u32TrickyMjpegBase = 0x00000000;
1266*53ee8cc1Swenshuai.xi /*===========================================================================*/
1267*53ee8cc1Swenshuai.xi 
1268*53ee8cc1Swenshuai.xi //The info of JPEG EXIF
1269*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_EXIF_DateTime _stEXIF_DateTime;
1270*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_EXIF_Orientation _eEXIF_Orientation;
1271*53ee8cc1Swenshuai.xi 
1272*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
1273*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8EXIF_Manufacturer[JPEG_MANUFACTURER_SIZE];
1274*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8EXIF_Model[JPEG_MODEL_SIZE];
1275*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16EXIF_Exposureprogram;
1276*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16EXIF_Flash;
1277*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EXIF_ISOSpeedRatings;
1278*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ExposureTime;
1279*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_FNumber;
1280*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ShutterSpeedValue;
1281*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ApertureValue;
1282*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ExposureBiasValue;
1283*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_FocalLength;
1284*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EXIF_ImageWidth;
1285*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EXIF_ImageHeight;
1286*53ee8cc1Swenshuai.xi #endif
1287*53ee8cc1Swenshuai.xi 
1288*53ee8cc1Swenshuai.xi //record data offset
1289*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 u32DataOffset = 0;
1290*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 u32SOFOffset = 0; //for SEC request, they need to know the offset of SOF marker
1291*53ee8cc1Swenshuai.xi 
1292*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bIs3HuffTbl = FALSE;
1293*53ee8cc1Swenshuai.xi 
1294*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
1295*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bEnableCMYK = TRUE;
1296*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bEnableRGB = TRUE;
1297*53ee8cc1Swenshuai.xi #endif
1298*53ee8cc1Swenshuai.xi 
1299*53ee8cc1Swenshuai.xi 
1300*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
1301*53ee8cc1Swenshuai.xi //MPO buffer
1302*53ee8cc1Swenshuai.xi static MS_U8 *_pu8In_buf_MPO_ofs;
1303*53ee8cc1Swenshuai.xi static MS_U32 _u32In_buf_MPO_left = 0xFFFFFFFFUL;
1304*53ee8cc1Swenshuai.xi 
1305*53ee8cc1Swenshuai.xi static MS_BOOL mpo_load_data = TRUE;  //check whether load data when start decode or fill buffer.
1306*53ee8cc1Swenshuai.xi static MS_BOOL bIsMPOFormat = FALSE;
1307*53ee8cc1Swenshuai.xi static MS_U32 u32MPFOffset = 0;
1308*53ee8cc1Swenshuai.xi #endif
1309*53ee8cc1Swenshuai.xi 
1310*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
1311*53ee8cc1Swenshuai.xi static MS_U32 u32MeasureDecodeTime;
1312*53ee8cc1Swenshuai.xi static MS_U32 u32MeasureDecodeTimeSW;
1313*53ee8cc1Swenshuai.xi static MS_U32 u32MeasureDecodeTimeHW;
1314*53ee8cc1Swenshuai.xi #endif
1315*53ee8cc1Swenshuai.xi 
1316*53ee8cc1Swenshuai.xi static unsigned long  u32CRC;
1317*53ee8cc1Swenshuai.xi 
verJPD_CRC32_Init(void)1318*53ee8cc1Swenshuai.xi static void verJPD_CRC32_Init(void)
1319*53ee8cc1Swenshuai.xi {
1320*53ee8cc1Swenshuai.xi     u32CRC = 0xFFFFFFFF;
1321*53ee8cc1Swenshuai.xi }
1322*53ee8cc1Swenshuai.xi 
1323*53ee8cc1Swenshuai.xi 
verJPD_CRC32_GetResult(void)1324*53ee8cc1Swenshuai.xi static MS_U32 verJPD_CRC32_GetResult(void)
1325*53ee8cc1Swenshuai.xi {
1326*53ee8cc1Swenshuai.xi     return (~u32CRC);
1327*53ee8cc1Swenshuai.xi }
1328*53ee8cc1Swenshuai.xi 
1329*53ee8cc1Swenshuai.xi 
verJPD_Init_CRC_Table(MS_U32 * u32CRCtemptable)1330*53ee8cc1Swenshuai.xi static void verJPD_Init_CRC_Table(MS_U32 *u32CRCtemptable)
1331*53ee8cc1Swenshuai.xi {
1332*53ee8cc1Swenshuai.xi 
1333*53ee8cc1Swenshuai.xi     int i,j,tmp, result;
1334*53ee8cc1Swenshuai.xi 
1335*53ee8cc1Swenshuai.xi     for(i=0;i<=0xFF;i++)
1336*53ee8cc1Swenshuai.xi     {
1337*53ee8cc1Swenshuai.xi         tmp=i;
1338*53ee8cc1Swenshuai.xi         result=0;
1339*53ee8cc1Swenshuai.xi 
1340*53ee8cc1Swenshuai.xi         for(j=1;j<9;j++)
1341*53ee8cc1Swenshuai.xi         {
1342*53ee8cc1Swenshuai.xi              if(tmp & 1)
1343*53ee8cc1Swenshuai.xi              {
1344*53ee8cc1Swenshuai.xi                         result |= (1 << (8 - j));
1345*53ee8cc1Swenshuai.xi              }
1346*53ee8cc1Swenshuai.xi              tmp >>= 1;
1347*53ee8cc1Swenshuai.xi         }
1348*53ee8cc1Swenshuai.xi 
1349*53ee8cc1Swenshuai.xi         u32CRCtemptable[i]=result<<24;
1350*53ee8cc1Swenshuai.xi         for(j=0; j<8; j++)
1351*53ee8cc1Swenshuai.xi         {
1352*53ee8cc1Swenshuai.xi             u32CRCtemptable[i] = (u32CRCtemptable[i] << 1) ^ ((u32CRCtemptable[i] & (1 << 31)) ? 0x04C11DB7 : 0);
1353*53ee8cc1Swenshuai.xi         }
1354*53ee8cc1Swenshuai.xi 
1355*53ee8cc1Swenshuai.xi         tmp=u32CRCtemptable[i];
1356*53ee8cc1Swenshuai.xi         result=0;
1357*53ee8cc1Swenshuai.xi 
1358*53ee8cc1Swenshuai.xi         for(j=1;j<33;j++)
1359*53ee8cc1Swenshuai.xi         {
1360*53ee8cc1Swenshuai.xi              if(tmp & 1)
1361*53ee8cc1Swenshuai.xi              {
1362*53ee8cc1Swenshuai.xi                 result |= (1 << (32 - j));
1363*53ee8cc1Swenshuai.xi              }
1364*53ee8cc1Swenshuai.xi              tmp >>= 1;
1365*53ee8cc1Swenshuai.xi         }
1366*53ee8cc1Swenshuai.xi         u32CRCtemptable[i]=result;
1367*53ee8cc1Swenshuai.xi         }
1368*53ee8cc1Swenshuai.xi }
1369*53ee8cc1Swenshuai.xi 
verJPD_CRC32_Update(const MS_U8 * pu8Data,MS_U32 u32Size)1370*53ee8cc1Swenshuai.xi static void verJPD_CRC32_Update(const MS_U8 *pu8Data, MS_U32 u32Size)
1371*53ee8cc1Swenshuai.xi {
1372*53ee8cc1Swenshuai.xi     MS_U32 u32CRCTable[256];
1373*53ee8cc1Swenshuai.xi     MS_U32  u32LoopCounter;
1374*53ee8cc1Swenshuai.xi 
1375*53ee8cc1Swenshuai.xi     if (pu8Data == NULL || u32Size == 0) return;
1376*53ee8cc1Swenshuai.xi 
1377*53ee8cc1Swenshuai.xi     verJPD_Init_CRC_Table(u32CRCTable);
1378*53ee8cc1Swenshuai.xi 
1379*53ee8cc1Swenshuai.xi     #if 0
1380*53ee8cc1Swenshuai.xi         int i;
1381*53ee8cc1Swenshuai.xi         for(i = 0;i<256;i++)
1382*53ee8cc1Swenshuai.xi         {
1383*53ee8cc1Swenshuai.xi             printf("0x%08x,\n", u32CRCTable[i]);
1384*53ee8cc1Swenshuai.xi         }
1385*53ee8cc1Swenshuai.xi     #endif
1386*53ee8cc1Swenshuai.xi 
1387*53ee8cc1Swenshuai.xi     for (u32LoopCounter=0; u32LoopCounter<u32Size; u32LoopCounter++)
1388*53ee8cc1Swenshuai.xi     {
1389*53ee8cc1Swenshuai.xi         u32CRC = (u32CRC >> 8) ^ u32CRCTable[ pu8Data[u32LoopCounter] ^ (unsigned char)(u32CRC & 0xFF) ];
1390*53ee8cc1Swenshuai.xi     }
1391*53ee8cc1Swenshuai.xi }
1392*53ee8cc1Swenshuai.xi 
1393*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1394*53ee8cc1Swenshuai.xi // Local Function Prototypes
1395*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1396*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI - harold
1397*53ee8cc1Swenshuai.xi JPEG_STATIC void MSAPI_MJPEG_Get_Pics(void);
1398*53ee8cc1Swenshuai.xi #endif // not implement for new MDDI - harold
1399*53ee8cc1Swenshuai.xi 
1400*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_terminate(JPEG_ErrCode status);
1401*53ee8cc1Swenshuai.xi 
1402*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_init(void);
1403*53ee8cc1Swenshuai.xi 
1404*53ee8cc1Swenshuai.xi #ifndef CMODEL
1405*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_StartDecode(void);
1406*53ee8cc1Swenshuai.xi #endif
1407*53ee8cc1Swenshuai.xi 
1408*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_GetAlignedResolution(MS_U16 *width, MS_U16 *height);
1409*53ee8cc1Swenshuai.xi 
1410*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
1411*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_transform_row( void );
1412*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_Result msAPI_JPEG_Baseline_Decode(void);
1413*53ee8cc1Swenshuai.xi #endif //SW_JPD_RGB_CMYK
1414*53ee8cc1Swenshuai.xi 
1415*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_GetECS(void);
1416*53ee8cc1Swenshuai.xi 
1417*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1418*53ee8cc1Swenshuai.xi //  Debug Functions
1419*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1420*53ee8cc1Swenshuai.xi 
1421*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1422*53ee8cc1Swenshuai.xi //  Local Functions
1423*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1424*53ee8cc1Swenshuai.xi 
JPEG_OVER_BUFFER(MS_U32 addr,MS_U32 buf_addr,MS_U32 buf_size)1425*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_OVER_BUFFER(MS_U32 addr, MS_U32 buf_addr, MS_U32 buf_size)
1426*53ee8cc1Swenshuai.xi {
1427*53ee8cc1Swenshuai.xi     if((addr < buf_addr)
1428*53ee8cc1Swenshuai.xi     || (addr >= (buf_addr+ buf_size)))
1429*53ee8cc1Swenshuai.xi     {
1430*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("%s [%d] invalid address 0x%lx\n", __FUNCTION__, __LINE__, addr);
1431*53ee8cc1Swenshuai.xi         return TRUE;
1432*53ee8cc1Swenshuai.xi     }
1433*53ee8cc1Swenshuai.xi     return FALSE;
1434*53ee8cc1Swenshuai.xi }
1435*53ee8cc1Swenshuai.xi 
1436*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1437*53ee8cc1Swenshuai.xi // Refill the input buffer.
1438*53ee8cc1Swenshuai.xi // This method will sit in a loop until (A) the buffer is full or (B)
1439*53ee8cc1Swenshuai.xi // the stream's read() method reports an end of file condition.
JPEG_fill_read_buffer(void)1440*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_fill_read_buffer(void)
1441*53ee8cc1Swenshuai.xi {
1442*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer:\n");
1443*53ee8cc1Swenshuai.xi     _u32In_buf_left = 0;
1444*53ee8cc1Swenshuai.xi     _pu8In_buf_ofs = _pu8In_buf;
1445*53ee8cc1Swenshuai.xi 
1446*53ee8cc1Swenshuai.xi     if(_bEOF_flag
1447*53ee8cc1Swenshuai.xi     && (FALSE == _bThumbnailAccessMode))
1448*53ee8cc1Swenshuai.xi     {
1449*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer : EOF!!!\n");
1450*53ee8cc1Swenshuai.xi         return TRUE;
1451*53ee8cc1Swenshuai.xi     }
1452*53ee8cc1Swenshuai.xi 
1453*53ee8cc1Swenshuai.xi     if(_bThumbnailAccessMode)
1454*53ee8cc1Swenshuai.xi     {
1455*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("Fill Thumbnail, buffer left = %ld, buffer offset = %ld\n", _u16ThumbnailBufferSize, _u32ThumbnailBufferOffset);
1456*53ee8cc1Swenshuai.xi         if(_u16ThumbnailBufferSize>=MRC_BUFFER_SIZE)
1457*53ee8cc1Swenshuai.xi         {
1458*53ee8cc1Swenshuai.xi             JPEG_memcpy((void *)(_pu8In_buf + _u32In_buf_left), (void *)(INTERNAL_BUFFER_ADDR + _u32ThumbnailBufferOffset), MRC_BUFFER_SIZE);
1459*53ee8cc1Swenshuai.xi             _u32In_buf_left = MRC_BUFFER_SIZE;
1460*53ee8cc1Swenshuai.xi             _u32ThumbnailBufferOffset += MRC_BUFFER_SIZE;
1461*53ee8cc1Swenshuai.xi             _u16ThumbnailBufferSize -= MRC_BUFFER_SIZE;
1462*53ee8cc1Swenshuai.xi         }
1463*53ee8cc1Swenshuai.xi         else
1464*53ee8cc1Swenshuai.xi         {
1465*53ee8cc1Swenshuai.xi             JPEG_memcpy((void *)(_pu8In_buf + _u32In_buf_left), (void *)(INTERNAL_BUFFER_ADDR + _u32ThumbnailBufferOffset), _u16ThumbnailBufferSize);
1466*53ee8cc1Swenshuai.xi             _bEOF_flag = TRUE;
1467*53ee8cc1Swenshuai.xi             _u32In_buf_left = _u16ThumbnailBufferSize;
1468*53ee8cc1Swenshuai.xi             _u32ThumbnailBufferOffset += _u16ThumbnailBufferSize;
1469*53ee8cc1Swenshuai.xi             _u16ThumbnailBufferSize = 0;
1470*53ee8cc1Swenshuai.xi         }
1471*53ee8cc1Swenshuai.xi     }
1472*53ee8cc1Swenshuai.xi     else
1473*53ee8cc1Swenshuai.xi     {
1474*53ee8cc1Swenshuai.xi         if(_pFillHdrFunc)
1475*53ee8cc1Swenshuai.xi         {
1476*53ee8cc1Swenshuai.xi             MS_S32 byte_read = _pFillHdrFunc((MS_PHYADDR)MS_VA2PA((MS_U32)_pu8In_buf), MRC_BUFFER_SIZE);
1477*53ee8cc1Swenshuai.xi             if(byte_read < 0)
1478*53ee8cc1Swenshuai.xi             {
1479*53ee8cc1Swenshuai.xi                 JPEG_terminate(E_JPEG_STREAM_READ);
1480*53ee8cc1Swenshuai.xi                 return FALSE;
1481*53ee8cc1Swenshuai.xi             }
1482*53ee8cc1Swenshuai.xi             _u32In_buf_left = byte_read;
1483*53ee8cc1Swenshuai.xi         }
1484*53ee8cc1Swenshuai.xi         else
1485*53ee8cc1Swenshuai.xi         {
1486*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("_pFillHdrFunc is not registered!!\n");
1487*53ee8cc1Swenshuai.xi             if (bMHEG5)
1488*53ee8cc1Swenshuai.xi             {
1489*53ee8cc1Swenshuai.xi                 _u32In_buf_left = MRC_BUFFER_SIZE;
1490*53ee8cc1Swenshuai.xi             }
1491*53ee8cc1Swenshuai.xi             else
1492*53ee8cc1Swenshuai.xi             {
1493*53ee8cc1Swenshuai.xi                 JPEG_terminate(E_JPEG_NOT_ENOUGH_HEADER_INFO);
1494*53ee8cc1Swenshuai.xi                 return FALSE;
1495*53ee8cc1Swenshuai.xi             }
1496*53ee8cc1Swenshuai.xi         }
1497*53ee8cc1Swenshuai.xi     }
1498*53ee8cc1Swenshuai.xi #if 0
1499*53ee8cc1Swenshuai.xi     else
1500*53ee8cc1Swenshuai.xi     {
1501*53ee8cc1Swenshuai.xi         do
1502*53ee8cc1Swenshuai.xi         {
1503*53ee8cc1Swenshuai.xi             MS_S32 bytes_read = _pStream->read( _pu8In_buf + _u32In_buf_left, MRC_BUFFER_SIZE - _u32In_buf_left, &_bEOF_flag, _pStream);//, 0 );
1504*53ee8cc1Swenshuai.xi             if ( bytes_read == -1 )
1505*53ee8cc1Swenshuai.xi             {
1506*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_STREAM_READ );
1507*53ee8cc1Swenshuai.xi             }
1508*53ee8cc1Swenshuai.xi             _u32In_buf_left += bytes_read;
1509*53ee8cc1Swenshuai.xi ////            _Total_Decoded_Size += bytes_read;
1510*53ee8cc1Swenshuai.xi         } while ( ( _u32In_buf_left < MRC_BUFFER_SIZE ) && ( !_bEOF_flag ) );
1511*53ee8cc1Swenshuai.xi     }
1512*53ee8cc1Swenshuai.xi 
1513*53ee8cc1Swenshuai.xi     _u32Total_bytes_read += _u32In_buf_left;
1514*53ee8cc1Swenshuai.xi #endif
1515*53ee8cc1Swenshuai.xi 
1516*53ee8cc1Swenshuai.xi     u32DataOffset += MRC_BUFFER_SIZE;
1517*53ee8cc1Swenshuai.xi     return TRUE;
1518*53ee8cc1Swenshuai.xi }
JPEG_force_fill_read_buffer(MS_U32 u32Size)1519*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_force_fill_read_buffer(MS_U32 u32Size)
1520*53ee8cc1Swenshuai.xi {
1521*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer:\n");
1522*53ee8cc1Swenshuai.xi     _u32In_buf_left = u32Size;
1523*53ee8cc1Swenshuai.xi     _pu8In_buf_ofs = _pu8In_buf;
1524*53ee8cc1Swenshuai.xi 
1525*53ee8cc1Swenshuai.xi     if(_bEOF_flag)
1526*53ee8cc1Swenshuai.xi     {
1527*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer : EOF!!!\n");
1528*53ee8cc1Swenshuai.xi         return TRUE;
1529*53ee8cc1Swenshuai.xi     }
1530*53ee8cc1Swenshuai.xi 
1531*53ee8cc1Swenshuai.xi     if(_pFillHdrFunc)
1532*53ee8cc1Swenshuai.xi     {
1533*53ee8cc1Swenshuai.xi         MS_S32 byte_read = 0;
1534*53ee8cc1Swenshuai.xi         if((MRC_BUFFER_SIZE-u32Size) > 0)
1535*53ee8cc1Swenshuai.xi         {
1536*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("[VA] _pu8In_buf=0x%lx\n", (MS_U32)_pu8In_buf);
1537*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("[PA] _pu8In_buf=0x%lx\n", MS_VA2PA((MS_U32)_pu8In_buf));
1538*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("[PA] callback addr=0x%lx\n", (MS_VA2PA((MS_U32)_pu8In_buf)+u32Size));
1539*53ee8cc1Swenshuai.xi             byte_read  = _pFillHdrFunc((MS_PHYADDR)(MS_VA2PA((MS_U32)_pu8In_buf)+u32Size), MRC_BUFFER_SIZE-u32Size);
1540*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@@@fill byte_read=0x%lx\n", byte_read);
1541*53ee8cc1Swenshuai.xi         }
1542*53ee8cc1Swenshuai.xi 
1543*53ee8cc1Swenshuai.xi         if(byte_read < 0)
1544*53ee8cc1Swenshuai.xi         {
1545*53ee8cc1Swenshuai.xi             JPEG_terminate(E_JPEG_STREAM_READ);
1546*53ee8cc1Swenshuai.xi             return FALSE;
1547*53ee8cc1Swenshuai.xi         }
1548*53ee8cc1Swenshuai.xi         _u32In_buf_left += byte_read;
1549*53ee8cc1Swenshuai.xi     }
1550*53ee8cc1Swenshuai.xi     else
1551*53ee8cc1Swenshuai.xi     {
1552*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_pFillHdrFunc is not registered!!\n");
1553*53ee8cc1Swenshuai.xi         return FALSE;
1554*53ee8cc1Swenshuai.xi     }
1555*53ee8cc1Swenshuai.xi 
1556*53ee8cc1Swenshuai.xi     return TRUE;
1557*53ee8cc1Swenshuai.xi }
1558*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1559*53ee8cc1Swenshuai.xi // Logical rotate left operation.
JPEG_rol(MS_U32 i,MS_U8 j)1560*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_rol(MS_U32 i, MS_U8 j)
1561*53ee8cc1Swenshuai.xi {
1562*53ee8cc1Swenshuai.xi     return ( ( i << j ) | ( i >> ( 32 - j ) ) );
1563*53ee8cc1Swenshuai.xi }
1564*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1565*53ee8cc1Swenshuai.xi // Retrieve one character from the input stream.
JPEG_get_char(void)1566*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 JPEG_get_char(void)
1567*53ee8cc1Swenshuai.xi {
1568*53ee8cc1Swenshuai.xi     MS_U8 c;
1569*53ee8cc1Swenshuai.xi 
1570*53ee8cc1Swenshuai.xi     // Any bytes remaining in buffer?
1571*53ee8cc1Swenshuai.xi     if ( !_u32In_buf_left )
1572*53ee8cc1Swenshuai.xi     {
1573*53ee8cc1Swenshuai.xi         // Try to get more bytes.
1574*53ee8cc1Swenshuai.xi         if(!JPEG_fill_read_buffer())
1575*53ee8cc1Swenshuai.xi         {
1576*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("JPEG_get_char : JPEG_fill_read_buffer failed!!!\n");
1577*53ee8cc1Swenshuai.xi             _u32In_buf_left = 0;
1578*53ee8cc1Swenshuai.xi         }
1579*53ee8cc1Swenshuai.xi         // Still nothing to get?
1580*53ee8cc1Swenshuai.xi         if ( !_u32In_buf_left )
1581*53ee8cc1Swenshuai.xi         {
1582*53ee8cc1Swenshuai.xi             // Padd the end of the stream with 0xFF 0xD9 (EOI marker)
1583*53ee8cc1Swenshuai.xi             // FIXME: Is there a better padding pattern to use?
1584*53ee8cc1Swenshuai.xi             MS_U8 t = _u8Tem_flag;
1585*53ee8cc1Swenshuai.xi             _u8Tem_flag ^= 1;
1586*53ee8cc1Swenshuai.xi             if ( t )
1587*53ee8cc1Swenshuai.xi             {
1588*53ee8cc1Swenshuai.xi                 return ( 0xD9 );
1589*53ee8cc1Swenshuai.xi             }
1590*53ee8cc1Swenshuai.xi             else
1591*53ee8cc1Swenshuai.xi             {
1592*53ee8cc1Swenshuai.xi                 return ( 0xFF );
1593*53ee8cc1Swenshuai.xi             }
1594*53ee8cc1Swenshuai.xi         }
1595*53ee8cc1Swenshuai.xi     }
1596*53ee8cc1Swenshuai.xi 
1597*53ee8cc1Swenshuai.xi     c = *_pu8In_buf_ofs++;
1598*53ee8cc1Swenshuai.xi     _u32In_buf_left--;
1599*53ee8cc1Swenshuai.xi 
1600*53ee8cc1Swenshuai.xi     return ( c );
1601*53ee8cc1Swenshuai.xi }
1602*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1603*53ee8cc1Swenshuai.xi // Same as previus method, except can indicate if the character is
1604*53ee8cc1Swenshuai.xi // a "padd" character or not.
JPEG_get_charP(MS_BOOL * Ppadding_flag)1605*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 JPEG_get_charP(MS_BOOL *Ppadding_flag)
1606*53ee8cc1Swenshuai.xi {
1607*53ee8cc1Swenshuai.xi     MS_U8 c;
1608*53ee8cc1Swenshuai.xi 
1609*53ee8cc1Swenshuai.xi     if ( !_u32In_buf_left )
1610*53ee8cc1Swenshuai.xi     {
1611*53ee8cc1Swenshuai.xi         if(!JPEG_fill_read_buffer())
1612*53ee8cc1Swenshuai.xi         {
1613*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("JPEG_get_charP : JPEG_fill_read_buffer failed!!!\n");
1614*53ee8cc1Swenshuai.xi             _u32In_buf_left = 0;
1615*53ee8cc1Swenshuai.xi         }
1616*53ee8cc1Swenshuai.xi 
1617*53ee8cc1Swenshuai.xi         if ( !_u32In_buf_left )
1618*53ee8cc1Swenshuai.xi         {
1619*53ee8cc1Swenshuai.xi             *Ppadding_flag = TRUE;
1620*53ee8cc1Swenshuai.xi #if 1
1621*53ee8cc1Swenshuai.xi             _u8Tem_flag ^= 1;
1622*53ee8cc1Swenshuai.xi             // This function is called during when progressive huffman decoding
1623*53ee8cc1Swenshuai.xi             // Should not padding 0xFFD9 at this state
1624*53ee8cc1Swenshuai.xi             return 0;
1625*53ee8cc1Swenshuai.xi #else
1626*53ee8cc1Swenshuai.xi             MS_U8 t;
1627*53ee8cc1Swenshuai.xi             t = _u8Tem_flag;
1628*53ee8cc1Swenshuai.xi             _u8Tem_flag ^= 1;
1629*53ee8cc1Swenshuai.xi             if ( t )
1630*53ee8cc1Swenshuai.xi             {
1631*53ee8cc1Swenshuai.xi                 return ( 0xD9 );
1632*53ee8cc1Swenshuai.xi             }
1633*53ee8cc1Swenshuai.xi             else
1634*53ee8cc1Swenshuai.xi             {
1635*53ee8cc1Swenshuai.xi                 return ( 0xFF );
1636*53ee8cc1Swenshuai.xi             }
1637*53ee8cc1Swenshuai.xi #endif
1638*53ee8cc1Swenshuai.xi         }
1639*53ee8cc1Swenshuai.xi     }
1640*53ee8cc1Swenshuai.xi 
1641*53ee8cc1Swenshuai.xi     *Ppadding_flag = FALSE;
1642*53ee8cc1Swenshuai.xi 
1643*53ee8cc1Swenshuai.xi     c = *_pu8In_buf_ofs++;
1644*53ee8cc1Swenshuai.xi     _u32In_buf_left--;
1645*53ee8cc1Swenshuai.xi 
1646*53ee8cc1Swenshuai.xi     return ( c );
1647*53ee8cc1Swenshuai.xi }
1648*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1649*53ee8cc1Swenshuai.xi // Inserts a previously retrieved character back into the input buffer.
JPEG_stuff_char(MS_U8 q)1650*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_stuff_char(MS_U8 q)
1651*53ee8cc1Swenshuai.xi {
1652*53ee8cc1Swenshuai.xi     *( --_pu8In_buf_ofs ) = q;
1653*53ee8cc1Swenshuai.xi     _u32In_buf_left++;
1654*53ee8cc1Swenshuai.xi }
1655*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1656*53ee8cc1Swenshuai.xi // Retrieves one character from the input stream, but does
1657*53ee8cc1Swenshuai.xi // not read past markers. Will continue to return 0xFF when a
1658*53ee8cc1Swenshuai.xi // marker is encountered.
1659*53ee8cc1Swenshuai.xi // FIXME: Bad name?
JPEG_get_octet(void)1660*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 JPEG_get_octet(void)
1661*53ee8cc1Swenshuai.xi {
1662*53ee8cc1Swenshuai.xi     MS_BOOL padding_flag;
1663*53ee8cc1Swenshuai.xi     MS_U8 c = JPEG_get_charP( &padding_flag );
1664*53ee8cc1Swenshuai.xi 
1665*53ee8cc1Swenshuai.xi     if ( c == 0xFF )
1666*53ee8cc1Swenshuai.xi     {
1667*53ee8cc1Swenshuai.xi         if ( padding_flag )
1668*53ee8cc1Swenshuai.xi         {
1669*53ee8cc1Swenshuai.xi             return ( 0xFF );
1670*53ee8cc1Swenshuai.xi         }
1671*53ee8cc1Swenshuai.xi 
1672*53ee8cc1Swenshuai.xi         c = JPEG_get_charP( &padding_flag );
1673*53ee8cc1Swenshuai.xi         if ( padding_flag )
1674*53ee8cc1Swenshuai.xi         {
1675*53ee8cc1Swenshuai.xi             JPEG_stuff_char( 0xFF );
1676*53ee8cc1Swenshuai.xi             return ( 0xFF );
1677*53ee8cc1Swenshuai.xi         }
1678*53ee8cc1Swenshuai.xi 
1679*53ee8cc1Swenshuai.xi         if ( c == 0x00 )
1680*53ee8cc1Swenshuai.xi         {
1681*53ee8cc1Swenshuai.xi             return ( 0xFF );
1682*53ee8cc1Swenshuai.xi         }
1683*53ee8cc1Swenshuai.xi         else
1684*53ee8cc1Swenshuai.xi         {
1685*53ee8cc1Swenshuai.xi             JPEG_stuff_char( c );
1686*53ee8cc1Swenshuai.xi             JPEG_stuff_char( 0xFF );
1687*53ee8cc1Swenshuai.xi             return ( 0xFF );
1688*53ee8cc1Swenshuai.xi         }
1689*53ee8cc1Swenshuai.xi     }
1690*53ee8cc1Swenshuai.xi 
1691*53ee8cc1Swenshuai.xi     return ( c );
1692*53ee8cc1Swenshuai.xi }
1693*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1694*53ee8cc1Swenshuai.xi // Retrieves a variable number of bits from the input stream.
1695*53ee8cc1Swenshuai.xi // Markers will not be read into the input bit buffer. Instead,
1696*53ee8cc1Swenshuai.xi // an infinite number of all 1's will be returned when a marker
1697*53ee8cc1Swenshuai.xi // is encountered.
1698*53ee8cc1Swenshuai.xi // FIXME: Is it better to return all 0's instead, like the older implementation?
JPEG_get_bits_2(MS_U8 numbits)1699*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_get_bits_2(MS_U8 numbits)
1700*53ee8cc1Swenshuai.xi {
1701*53ee8cc1Swenshuai.xi     MS_U32 i, c1, c2;
1702*53ee8cc1Swenshuai.xi 
1703*53ee8cc1Swenshuai.xi     i = ( _u32Bit_buf >> ( 16 - numbits ) ) & ( ( 1 << numbits ) - 1 );
1704*53ee8cc1Swenshuai.xi 
1705*53ee8cc1Swenshuai.xi     _s16Bits_left -= numbits;
1706*53ee8cc1Swenshuai.xi     if ( _s16Bits_left <= 0 )
1707*53ee8cc1Swenshuai.xi     {
1708*53ee8cc1Swenshuai.xi         _u32Bit_buf = JPEG_rol( _u32Bit_buf, numbits += _s16Bits_left );
1709*53ee8cc1Swenshuai.xi 
1710*53ee8cc1Swenshuai.xi         c1 = JPEG_get_octet();
1711*53ee8cc1Swenshuai.xi         c2 = JPEG_get_octet();
1712*53ee8cc1Swenshuai.xi 
1713*53ee8cc1Swenshuai.xi         _u32Bit_buf = ( _u32Bit_buf & 0xFFFF ) | ( ( ( MS_U32 )c1 ) << 24 ) | ( ( ( MS_U32 )c2 ) << 16 );
1714*53ee8cc1Swenshuai.xi 
1715*53ee8cc1Swenshuai.xi         _u32Bit_buf = JPEG_rol( _u32Bit_buf, -_s16Bits_left );
1716*53ee8cc1Swenshuai.xi 
1717*53ee8cc1Swenshuai.xi         _s16Bits_left += 16;
1718*53ee8cc1Swenshuai.xi     }
1719*53ee8cc1Swenshuai.xi     else
1720*53ee8cc1Swenshuai.xi     {
1721*53ee8cc1Swenshuai.xi         _u32Bit_buf = JPEG_rol( _u32Bit_buf, numbits );
1722*53ee8cc1Swenshuai.xi     }
1723*53ee8cc1Swenshuai.xi 
1724*53ee8cc1Swenshuai.xi     return i;
1725*53ee8cc1Swenshuai.xi }
1726*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1727*53ee8cc1Swenshuai.xi // Decodes a Huffman encoded symbol.
JPEG_huff_decode(JPEG_HuffTbl * Ph)1728*53ee8cc1Swenshuai.xi JPEG_STATIC MS_S32 JPEG_huff_decode(JPEG_HuffTbl *Ph)
1729*53ee8cc1Swenshuai.xi {
1730*53ee8cc1Swenshuai.xi     MS_S32 symbol;
1731*53ee8cc1Swenshuai.xi 
1732*53ee8cc1Swenshuai.xi     // Check first 8-bits: do we have a complete symbol?
1733*53ee8cc1Swenshuai.xi     symbol = Ph->s16Look_up[( _u32Bit_buf >> 8 ) & 0xFF];
1734*53ee8cc1Swenshuai.xi     if ( symbol < 0 )
1735*53ee8cc1Swenshuai.xi     {
1736*53ee8cc1Swenshuai.xi         // Decode more bits, use a tree traversal to find symbol.
1737*53ee8cc1Swenshuai.xi         JPEG_get_bits_2( 8 );
1738*53ee8cc1Swenshuai.xi 
1739*53ee8cc1Swenshuai.xi         do
1740*53ee8cc1Swenshuai.xi         {
1741*53ee8cc1Swenshuai.xi             symbol = Ph->s16Tree[~symbol + ( 1 - JPEG_get_bits_2( 1 ) )];
1742*53ee8cc1Swenshuai.xi         }
1743*53ee8cc1Swenshuai.xi         while ( symbol < 0 );
1744*53ee8cc1Swenshuai.xi     }
1745*53ee8cc1Swenshuai.xi     else
1746*53ee8cc1Swenshuai.xi     {
1747*53ee8cc1Swenshuai.xi         JPEG_get_bits_2( Ph->u8Code_size[symbol] );
1748*53ee8cc1Swenshuai.xi     }
1749*53ee8cc1Swenshuai.xi 
1750*53ee8cc1Swenshuai.xi     return symbol;
1751*53ee8cc1Swenshuai.xi }
1752*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1753*53ee8cc1Swenshuai.xi // Unconditionally frees all allocated blocks.
JPEG_free_all_blocks(void)1754*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_free_all_blocks(void)
1755*53ee8cc1Swenshuai.xi {
1756*53ee8cc1Swenshuai.xi     MS_U8 i;
1757*53ee8cc1Swenshuai.xi #if 0
1758*53ee8cc1Swenshuai.xi     if ( _pStream )
1759*53ee8cc1Swenshuai.xi     {
1760*53ee8cc1Swenshuai.xi         _pStream = NULL;
1761*53ee8cc1Swenshuai.xi     }
1762*53ee8cc1Swenshuai.xi #endif
1763*53ee8cc1Swenshuai.xi     for ( i = 0; i < JPEG_MAXBLOCKS; i++ )
1764*53ee8cc1Swenshuai.xi     {
1765*53ee8cc1Swenshuai.xi         if(_pBlocks[i]!=NULL)
1766*53ee8cc1Swenshuai.xi             JPEG_MEMORY_free( _pBlocks[i] );
1767*53ee8cc1Swenshuai.xi 
1768*53ee8cc1Swenshuai.xi         _pBlocks[i] = NULL;
1769*53ee8cc1Swenshuai.xi     }
1770*53ee8cc1Swenshuai.xi }
1771*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1772*53ee8cc1Swenshuai.xi // This method handles all errors.
1773*53ee8cc1Swenshuai.xi // It could easily be changed to use C++ exceptions.
JPEG_terminate(JPEG_ErrCode status)1774*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_terminate(JPEG_ErrCode status)
1775*53ee8cc1Swenshuai.xi {
1776*53ee8cc1Swenshuai.xi     _Error_code = status;
1777*53ee8cc1Swenshuai.xi 
1778*53ee8cc1Swenshuai.xi     JPEG_free_all_blocks();
1779*53ee8cc1Swenshuai.xi 
1780*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_ERR("%s:ERROR= %d\n", __FUNCTION__, _Error_code);
1781*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
1782*53ee8cc1Swenshuai.xi     longjmp( _jmp_state, status );
1783*53ee8cc1Swenshuai.xi #endif
1784*53ee8cc1Swenshuai.xi }
1785*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1786*53ee8cc1Swenshuai.xi // Allocate a block of memory-- store block's address in list for
1787*53ee8cc1Swenshuai.xi // later deallocation by JPEG_free_all_blocks().
JPEG_alloc(MS_U32 n)1788*53ee8cc1Swenshuai.xi JPEG_STATIC void * JPEG_alloc(MS_U32 n)
1789*53ee8cc1Swenshuai.xi {
1790*53ee8cc1Swenshuai.xi     MS_U8 i;
1791*53ee8cc1Swenshuai.xi     void *q;
1792*53ee8cc1Swenshuai.xi 
1793*53ee8cc1Swenshuai.xi     // Find a free slot. The number of allocated slots will
1794*53ee8cc1Swenshuai.xi     // always be very low, so a linear search is good enough.
1795*53ee8cc1Swenshuai.xi     for ( i = 0; i < JPEG_MAXBLOCKS; i++ )
1796*53ee8cc1Swenshuai.xi     {
1797*53ee8cc1Swenshuai.xi         if ( _pBlocks[i] == NULL )
1798*53ee8cc1Swenshuai.xi         {
1799*53ee8cc1Swenshuai.xi             break;
1800*53ee8cc1Swenshuai.xi         }
1801*53ee8cc1Swenshuai.xi     }
1802*53ee8cc1Swenshuai.xi 
1803*53ee8cc1Swenshuai.xi     if ( i >= JPEG_MAXBLOCKS )
1804*53ee8cc1Swenshuai.xi     {
1805*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_TOO_MANY_BLOCKS );
1806*53ee8cc1Swenshuai.xi         return NULL;
1807*53ee8cc1Swenshuai.xi     }
1808*53ee8cc1Swenshuai.xi 
1809*53ee8cc1Swenshuai.xi     //FixMe: eCos does not support aligned allocate ???
1810*53ee8cc1Swenshuai.xi     q = JPEG_MEMORY_malloc( n + 8 );
1811*53ee8cc1Swenshuai.xi     //q = MsOS_AllocateAlignedMemory(n+8, 8, gs32CachedPoolID);
1812*53ee8cc1Swenshuai.xi     //q = MsOS_AllocateMemory(n+8, gs32CachedPoolID);
1813*53ee8cc1Swenshuai.xi 
1814*53ee8cc1Swenshuai.xi     if ( q == NULL )
1815*53ee8cc1Swenshuai.xi     {
1816*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_NOTENOUGHMEM );
1817*53ee8cc1Swenshuai.xi         return NULL;
1818*53ee8cc1Swenshuai.xi     }
1819*53ee8cc1Swenshuai.xi 
1820*53ee8cc1Swenshuai.xi     JPEG_memset((void *)q, 0, n + 8 );
1821*53ee8cc1Swenshuai.xi 
1822*53ee8cc1Swenshuai.xi     _pBlocks[i] = q;
1823*53ee8cc1Swenshuai.xi 
1824*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG %ld bytes allocated\n", n);
1825*53ee8cc1Swenshuai.xi 
1826*53ee8cc1Swenshuai.xi     return ( ( void* )q );
1827*53ee8cc1Swenshuai.xi }
1828*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_Tiff_EndianChangeL(MS_U32 u32Val)1829*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_Tiff_EndianChangeL(MS_U32 u32Val)
1830*53ee8cc1Swenshuai.xi {
1831*53ee8cc1Swenshuai.xi     if (_bTiffBigEndian)
1832*53ee8cc1Swenshuai.xi         return EndianChangeL(u32Val);
1833*53ee8cc1Swenshuai.xi     else
1834*53ee8cc1Swenshuai.xi         return u32Val;
1835*53ee8cc1Swenshuai.xi }
1836*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_Tiff_EndianChangeS(MS_U16 u16Val)1837*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_Tiff_EndianChangeS(MS_U16 u16Val)
1838*53ee8cc1Swenshuai.xi {
1839*53ee8cc1Swenshuai.xi     if (_bTiffBigEndian)
1840*53ee8cc1Swenshuai.xi         return EndianChangeS(u16Val);
1841*53ee8cc1Swenshuai.xi     else
1842*53ee8cc1Swenshuai.xi         return u16Val;
1843*53ee8cc1Swenshuai.xi }
1844*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_GetU16(MS_U8 * data)1845*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_GetU16(MS_U8 *data)
1846*53ee8cc1Swenshuai.xi {
1847*53ee8cc1Swenshuai.xi     MS_S8 i;
1848*53ee8cc1Swenshuai.xi     MS_U16 val = 0;
1849*53ee8cc1Swenshuai.xi 
1850*53ee8cc1Swenshuai.xi     for(i = 1; i>=0; i--)
1851*53ee8cc1Swenshuai.xi         val = (val << 8) + (MS_U8) *(data + i);
1852*53ee8cc1Swenshuai.xi 
1853*53ee8cc1Swenshuai.xi 
1854*53ee8cc1Swenshuai.xi     return val;
1855*53ee8cc1Swenshuai.xi }
1856*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_GetU32(MS_U8 * data)1857*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_GetU32(MS_U8 *data)
1858*53ee8cc1Swenshuai.xi {
1859*53ee8cc1Swenshuai.xi     MS_S8 i;
1860*53ee8cc1Swenshuai.xi     MS_U32 val = 0;
1861*53ee8cc1Swenshuai.xi 
1862*53ee8cc1Swenshuai.xi     for(i = 3; i>=0; i--)
1863*53ee8cc1Swenshuai.xi         val = (val << 8) + (MS_U8) *(data + i);
1864*53ee8cc1Swenshuai.xi 
1865*53ee8cc1Swenshuai.xi     return val;
1866*53ee8cc1Swenshuai.xi }
1867*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1868*53ee8cc1Swenshuai.xi //***************************************************
1869*53ee8cc1Swenshuai.xi //Parse EXIF header
1870*53ee8cc1Swenshuai.xi //***************************************************
JPEG_DecodeExifInfo(MS_U8 * data,MS_U32 data_length)1871*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_DecodeExifInfo(MS_U8 *data, MS_U32 data_length)
1872*53ee8cc1Swenshuai.xi {
1873*53ee8cc1Swenshuai.xi     MS_U8 *pJpegBuff = data;
1874*53ee8cc1Swenshuai.xi //    MS_U32 u32tmp, u32Len;
1875*53ee8cc1Swenshuai.xi     MS_U32 u32tmp;
1876*53ee8cc1Swenshuai.xi     MS_U16 u16Marker, u16Len, u16NumOfEntry, i;
1877*53ee8cc1Swenshuai.xi     MS_U8  *pTiffHdrPtr, *pNextIfd;
1878*53ee8cc1Swenshuai.xi     MS_U32 u32DataValue;
1879*53ee8cc1Swenshuai.xi     MS_U8 *pExifHdr = NULL, *pExifHdrOffet = NULL;
1880*53ee8cc1Swenshuai.xi     MS_BOOL bIFD_pt_found = FALSE;
1881*53ee8cc1Swenshuai.xi 
1882*53ee8cc1Swenshuai.xi     u32tmp = JPEG_GetU32(pJpegBuff);
1883*53ee8cc1Swenshuai.xi     if (JPEG_TAG_EXIF != u32tmp)
1884*53ee8cc1Swenshuai.xi     {
1885*53ee8cc1Swenshuai.xi         return FALSE;
1886*53ee8cc1Swenshuai.xi     }
1887*53ee8cc1Swenshuai.xi 
1888*53ee8cc1Swenshuai.xi     // Exif starts here
1889*53ee8cc1Swenshuai.xi     pJpegBuff += 6;
1890*53ee8cc1Swenshuai.xi     pExifHdr = pJpegBuff;
1891*53ee8cc1Swenshuai.xi     u16Marker = JPEG_GetU16(pJpegBuff);
1892*53ee8cc1Swenshuai.xi     if (JPEG_TIFF_BIG_ENDIAN == u16Marker)
1893*53ee8cc1Swenshuai.xi         _bTiffBigEndian = TRUE;
1894*53ee8cc1Swenshuai.xi     else if (JPEG_TIFF_LITTLE_ENDIAN == u16Marker)
1895*53ee8cc1Swenshuai.xi         _bTiffBigEndian = FALSE;
1896*53ee8cc1Swenshuai.xi     else
1897*53ee8cc1Swenshuai.xi         return FALSE;
1898*53ee8cc1Swenshuai.xi 
1899*53ee8cc1Swenshuai.xi     _u32ThumbnailOffset += 6;
1900*53ee8cc1Swenshuai.xi     pTiffHdrPtr = pJpegBuff;
1901*53ee8cc1Swenshuai.xi 
1902*53ee8cc1Swenshuai.xi     pJpegBuff += 2;
1903*53ee8cc1Swenshuai.xi     u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1904*53ee8cc1Swenshuai.xi     if (u16Marker != 0x002A)
1905*53ee8cc1Swenshuai.xi         return FALSE;
1906*53ee8cc1Swenshuai.xi 
1907*53ee8cc1Swenshuai.xi     pJpegBuff += 2;
1908*53ee8cc1Swenshuai.xi     u16Len = (MS_U16)JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
1909*53ee8cc1Swenshuai.xi     pJpegBuff += (u16Len - 4); //ENDIAN(2byte) + 0x002A(2byte)
1910*53ee8cc1Swenshuai.xi 
1911*53ee8cc1Swenshuai.xi     // 0th IFD start here
1912*53ee8cc1Swenshuai.xi     u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1913*53ee8cc1Swenshuai.xi     pJpegBuff += 2;
1914*53ee8cc1Swenshuai.xi 
1915*53ee8cc1Swenshuai.xi     // Boundary check, prevent from buffer over-run
1916*53ee8cc1Swenshuai.xi     if((((MS_U32) pJpegBuff) - INTERNAL_BUFFER_ADDR + u16NumOfEntry*12)>=data_length)
1917*53ee8cc1Swenshuai.xi     {
1918*53ee8cc1Swenshuai.xi         return FALSE;
1919*53ee8cc1Swenshuai.xi     }
1920*53ee8cc1Swenshuai.xi 
1921*53ee8cc1Swenshuai.xi //    pJpegBuff += 12*u16NumOfEntry;
1922*53ee8cc1Swenshuai.xi 
1923*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("IFD0 : u16NumOfEntry = %d\n", u16NumOfEntry);
1924*53ee8cc1Swenshuai.xi 
1925*53ee8cc1Swenshuai.xi     //Retrieve orientation
1926*53ee8cc1Swenshuai.xi     for(i = 0; i < u16NumOfEntry; i++)
1927*53ee8cc1Swenshuai.xi     {
1928*53ee8cc1Swenshuai.xi         u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1929*53ee8cc1Swenshuai.xi         pJpegBuff += 8;
1930*53ee8cc1Swenshuai.xi 
1931*53ee8cc1Swenshuai.xi         if((JPEG_EXIF_TAG_ORIENTATION == u16Marker)
1932*53ee8cc1Swenshuai.xi         && (E_JPEG_EXIF_ORIENT_NOT_FOUND == _eEXIF_Orientation))
1933*53ee8cc1Swenshuai.xi         {
1934*53ee8cc1Swenshuai.xi             //The datatype of orientation is short
1935*53ee8cc1Swenshuai.xi             u32DataValue = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1936*53ee8cc1Swenshuai.xi             if((E_JPEG_EXIF_ORIENT_ROTATE_0 > u32DataValue)
1937*53ee8cc1Swenshuai.xi             || (E_JPEG_EXIF_ORIENT_ROTATE_270 < u32DataValue))
1938*53ee8cc1Swenshuai.xi             {
1939*53ee8cc1Swenshuai.xi                 _eEXIF_Orientation = E_JPEG_EXIF_ORIENT_RESERVED;
1940*53ee8cc1Swenshuai.xi             }
1941*53ee8cc1Swenshuai.xi             else
1942*53ee8cc1Swenshuai.xi             {
1943*53ee8cc1Swenshuai.xi                 _eEXIF_Orientation = (JPEG_EXIF_Orientation)u32DataValue;
1944*53ee8cc1Swenshuai.xi             }
1945*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", _eEXIF_Orientation);
1946*53ee8cc1Swenshuai.xi         }
1947*53ee8cc1Swenshuai.xi         else if(JPEG_EXIF_TAG_IFD_POINTER == u16Marker)
1948*53ee8cc1Swenshuai.xi         {
1949*53ee8cc1Swenshuai.xi             bIFD_pt_found = TRUE;
1950*53ee8cc1Swenshuai.xi             //datavalue is an offset from exif marker for datetime
1951*53ee8cc1Swenshuai.xi             u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
1952*53ee8cc1Swenshuai.xi             pExifHdrOffet = pExifHdr + u32DataValue;
1953*53ee8cc1Swenshuai.xi             JPEG_OVER_BUFFER_RET(pExifHdrOffet, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
1954*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("Exif IFD pointer = 0x%lx\n", (MS_U32)pExifHdrOffet);
1955*53ee8cc1Swenshuai.xi         }
1956*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
1957*53ee8cc1Swenshuai.xi         else if(JPEG_EXIF_TAG_MANUFACTURER == u16Marker)
1958*53ee8cc1Swenshuai.xi         {
1959*53ee8cc1Swenshuai.xi             MS_U8 *pIFDPtrOffset;
1960*53ee8cc1Swenshuai.xi             pIFDPtrOffset = pJpegBuff;
1961*53ee8cc1Swenshuai.xi             u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pIFDPtrOffset));
1962*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("MANUFACTURER Offset = 0x%lx\n", u32DataValue);
1963*53ee8cc1Swenshuai.xi             pIFDPtrOffset = pExifHdr + u32DataValue;
1964*53ee8cc1Swenshuai.xi             if(JPEG_OVER_BUFFER((MS_U32)pIFDPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE))
1965*53ee8cc1Swenshuai.xi             {
1966*53ee8cc1Swenshuai.xi                 pJpegBuff += 4;
1967*53ee8cc1Swenshuai.xi                 continue;
1968*53ee8cc1Swenshuai.xi             }
1969*53ee8cc1Swenshuai.xi             //JPEG_DEBUG_API_MSG("MANUFACTURER addr = 0x%lx\n", (MS_U32)pIFDPtrOffset);
1970*53ee8cc1Swenshuai.xi             MS_U8 u8i=0;
1971*53ee8cc1Swenshuai.xi             while(*(pIFDPtrOffset+u8i) && u8i<JPEG_MANUFACTURER_SIZE)
1972*53ee8cc1Swenshuai.xi             {
1973*53ee8cc1Swenshuai.xi                 _u8EXIF_Manufacturer[u8i] = *(pIFDPtrOffset+u8i);
1974*53ee8cc1Swenshuai.xi                 u8i++;
1975*53ee8cc1Swenshuai.xi             }
1976*53ee8cc1Swenshuai.xi         }
1977*53ee8cc1Swenshuai.xi         else if(JPEG_EXIF_TAG_MODEL== u16Marker)
1978*53ee8cc1Swenshuai.xi         {
1979*53ee8cc1Swenshuai.xi             MS_U8 *pIFDPtrOffset;
1980*53ee8cc1Swenshuai.xi             pIFDPtrOffset = pJpegBuff;
1981*53ee8cc1Swenshuai.xi             u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pIFDPtrOffset));
1982*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("MODEL Offset = 0x%lx\n", u32DataValue);
1983*53ee8cc1Swenshuai.xi             pIFDPtrOffset = pExifHdr + u32DataValue;
1984*53ee8cc1Swenshuai.xi             if(JPEG_OVER_BUFFER((MS_U32)pIFDPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE))
1985*53ee8cc1Swenshuai.xi             {
1986*53ee8cc1Swenshuai.xi                 pJpegBuff += 4;
1987*53ee8cc1Swenshuai.xi                 continue;
1988*53ee8cc1Swenshuai.xi             }
1989*53ee8cc1Swenshuai.xi             //JPEG_DEBUG_API_MSG("MODEL addr = 0x%lx\n", (MS_U32)pIFDPtrOffset);
1990*53ee8cc1Swenshuai.xi             MS_U8 u8i=0;
1991*53ee8cc1Swenshuai.xi             while(*(pIFDPtrOffset+u8i) && u8i<JPEG_MODEL_SIZE)
1992*53ee8cc1Swenshuai.xi             {
1993*53ee8cc1Swenshuai.xi                 _u8EXIF_Model[u8i] = *(pIFDPtrOffset+u8i);
1994*53ee8cc1Swenshuai.xi                 u8i++;
1995*53ee8cc1Swenshuai.xi             }
1996*53ee8cc1Swenshuai.xi         }
1997*53ee8cc1Swenshuai.xi #endif
1998*53ee8cc1Swenshuai.xi #if 0
1999*53ee8cc1Swenshuai.xi         else if((JPEG_EXIF_TAG_DATETIME_MOD == u16Marker)
2000*53ee8cc1Swenshuai.xi         && (FALSE == _stEXIF_DateTime.bHasDataTime))
2001*53ee8cc1Swenshuai.xi         {
2002*53ee8cc1Swenshuai.xi             _stEXIF_DateTime.bHasDataTime = TRUE;
2003*53ee8cc1Swenshuai.xi             //datavalue is an offset from exif marker for datetime
2004*53ee8cc1Swenshuai.xi             u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2005*53ee8cc1Swenshuai.xi             pExifOffset = pExifHdr + u32DataValue;
2006*53ee8cc1Swenshuai.xi             printf("pExifOffset1 = 0x%lx\n", (MS_U32)pExifOffset);
2007*53ee8cc1Swenshuai.xi             JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Year);
2008*53ee8cc1Swenshuai.xi             pExifOffset++;
2009*53ee8cc1Swenshuai.xi             JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Month);
2010*53ee8cc1Swenshuai.xi             pExifOffset++;
2011*53ee8cc1Swenshuai.xi             JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Day);
2012*53ee8cc1Swenshuai.xi             pExifOffset++;
2013*53ee8cc1Swenshuai.xi             JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Hour);
2014*53ee8cc1Swenshuai.xi             pExifOffset++;
2015*53ee8cc1Swenshuai.xi             JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Minute);
2016*53ee8cc1Swenshuai.xi             pExifOffset++;
2017*53ee8cc1Swenshuai.xi             JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Second);
2018*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", _eEXIF_Orientation);
2019*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime======= Exist = %d, Original = %d \n", _stEXIF_DateTime.bHasDataTime, bOriDateTimeFound);
2020*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
2021*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
2022*53ee8cc1Swenshuai.xi         }
2023*53ee8cc1Swenshuai.xi #endif
2024*53ee8cc1Swenshuai.xi         pJpegBuff += 4;
2025*53ee8cc1Swenshuai.xi     }
2026*53ee8cc1Swenshuai.xi 
2027*53ee8cc1Swenshuai.xi     if(TRUE == bIFD_pt_found)
2028*53ee8cc1Swenshuai.xi     {
2029*53ee8cc1Swenshuai.xi         u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifHdrOffet));
2030*53ee8cc1Swenshuai.xi         pExifHdrOffet += 2;
2031*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("EXIF IFD : u16NumOfEntry = %d\n", u16NumOfEntry);
2032*53ee8cc1Swenshuai.xi 
2033*53ee8cc1Swenshuai.xi         for(i = 0; i < u16NumOfEntry; i++)
2034*53ee8cc1Swenshuai.xi         {
2035*53ee8cc1Swenshuai.xi             u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifHdrOffet));
2036*53ee8cc1Swenshuai.xi #if (SUPPORT_EXIF_EXTRA_INFO==false)
2037*53ee8cc1Swenshuai.xi             if(JPEG_EXIF_TAG_DATETIME_ORI == u16Marker)
2038*53ee8cc1Swenshuai.xi             {
2039*53ee8cc1Swenshuai.xi                 pExifHdrOffet += 8;
2040*53ee8cc1Swenshuai.xi                 _stEXIF_DateTime.bHasDataTime = TRUE;
2041*53ee8cc1Swenshuai.xi                 //datavalue is an offset from exif marker for datetime
2042*53ee8cc1Swenshuai.xi                 u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifHdrOffet));;
2043*53ee8cc1Swenshuai.xi                 pExifHdrOffet = pExifHdr + u32DataValue;
2044*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pExifHdrOffet, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2045*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("pExifOriDateTime Offset = 0x%lx\n", (MS_U32)pExifHdrOffet);
2046*53ee8cc1Swenshuai.xi                 JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Year);
2047*53ee8cc1Swenshuai.xi                 pExifHdrOffet++;
2048*53ee8cc1Swenshuai.xi                 JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Month);
2049*53ee8cc1Swenshuai.xi                 pExifHdrOffet++;
2050*53ee8cc1Swenshuai.xi                 JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Day);
2051*53ee8cc1Swenshuai.xi                 pExifHdrOffet++;
2052*53ee8cc1Swenshuai.xi                 JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Hour);
2053*53ee8cc1Swenshuai.xi                 pExifHdrOffet++;
2054*53ee8cc1Swenshuai.xi                 JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Minute);
2055*53ee8cc1Swenshuai.xi                 pExifHdrOffet++;
2056*53ee8cc1Swenshuai.xi                 JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Second);
2057*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime=======\n");
2058*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
2059*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
2060*53ee8cc1Swenshuai.xi                 break;
2061*53ee8cc1Swenshuai.xi             }
2062*53ee8cc1Swenshuai.xi #else
2063*53ee8cc1Swenshuai.xi             MS_U8 *pExifPtrOffset;
2064*53ee8cc1Swenshuai.xi             MS_U16 u16Type;
2065*53ee8cc1Swenshuai.xi             MS_U32 u32Count;
2066*53ee8cc1Swenshuai.xi             switch(u16Marker)
2067*53ee8cc1Swenshuai.xi             {
2068*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_DATETIME_ORI:
2069*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2070*53ee8cc1Swenshuai.xi                     _stEXIF_DateTime.bHasDataTime = TRUE;
2071*53ee8cc1Swenshuai.xi                     //datavalue is an offset from exif marker for datetime
2072*53ee8cc1Swenshuai.xi                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2073*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdr + u32DataValue;
2074*53ee8cc1Swenshuai.xi                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2075*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("pExifOriDateTime Offset = 0x%lx\n", (MS_U32)pExifPtrOffset);
2076*53ee8cc1Swenshuai.xi                     JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Year);
2077*53ee8cc1Swenshuai.xi                     pExifPtrOffset++;
2078*53ee8cc1Swenshuai.xi                     JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Month);
2079*53ee8cc1Swenshuai.xi                     pExifPtrOffset++;
2080*53ee8cc1Swenshuai.xi                     JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Day);
2081*53ee8cc1Swenshuai.xi                     pExifPtrOffset++;
2082*53ee8cc1Swenshuai.xi                     JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Hour);
2083*53ee8cc1Swenshuai.xi                     pExifPtrOffset++;
2084*53ee8cc1Swenshuai.xi                     JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Minute);
2085*53ee8cc1Swenshuai.xi                     pExifPtrOffset++;
2086*53ee8cc1Swenshuai.xi                     JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Second);
2087*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime=======\n");
2088*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
2089*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
2090*53ee8cc1Swenshuai.xi                     break;
2091*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_ISO_SPEED_RATING:
2092*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 2;
2093*53ee8cc1Swenshuai.xi                     u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2094*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 4;
2095*53ee8cc1Swenshuai.xi                     u32Count = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2096*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2097*53ee8cc1Swenshuai.xi                     if(u16Type==3)
2098*53ee8cc1Swenshuai.xi                     {
2099*53ee8cc1Swenshuai.xi                         if(u32Count==2)
2100*53ee8cc1Swenshuai.xi                         {
2101*53ee8cc1Swenshuai.xi                             _u32EXIF_ISOSpeedRatings=JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2102*53ee8cc1Swenshuai.xi                         }
2103*53ee8cc1Swenshuai.xi                         else if(u32Count==1)
2104*53ee8cc1Swenshuai.xi                         {
2105*53ee8cc1Swenshuai.xi                             _u32EXIF_ISOSpeedRatings=JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2106*53ee8cc1Swenshuai.xi                         }
2107*53ee8cc1Swenshuai.xi                     }
2108*53ee8cc1Swenshuai.xi                     else if(u16Type==4)
2109*53ee8cc1Swenshuai.xi                     {
2110*53ee8cc1Swenshuai.xi                         if(u32Count==1)
2111*53ee8cc1Swenshuai.xi                         {
2112*53ee8cc1Swenshuai.xi                             _u32EXIF_ISOSpeedRatings=JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2113*53ee8cc1Swenshuai.xi                         }
2114*53ee8cc1Swenshuai.xi                     }
2115*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("ISO Speed Rating=%ld\n", _u32EXIF_ISOSpeedRatings);
2116*53ee8cc1Swenshuai.xi                     break;
2117*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_EXPOSURE_TIME:
2118*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2119*53ee8cc1Swenshuai.xi                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2120*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("ExposureTime Offset = 0x%lx\n", u32DataValue);
2121*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdr + u32DataValue;
2122*53ee8cc1Swenshuai.xi                     //JPEG_DEBUG_API_MSG("ExposureTime addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2123*53ee8cc1Swenshuai.xi                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2124*53ee8cc1Swenshuai.xi                     _stEXIF_ExposureTime.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2125*53ee8cc1Swenshuai.xi                     pExifPtrOffset+=4;
2126*53ee8cc1Swenshuai.xi                     _stEXIF_ExposureTime.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2127*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("ExposureTime numerator=%ld, denominator=%ld\n", _stEXIF_ExposureTime.numerator, _stEXIF_ExposureTime.denominator);
2128*53ee8cc1Swenshuai.xi                     break;
2129*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_F_NUMBER:
2130*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2131*53ee8cc1Swenshuai.xi                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2132*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("FNumber Offset = 0x%lx\n", u32DataValue);
2133*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdr + u32DataValue;
2134*53ee8cc1Swenshuai.xi                     //JPEG_DEBUG_API_MSG("FNumber addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2135*53ee8cc1Swenshuai.xi                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2136*53ee8cc1Swenshuai.xi                     _stEXIF_FNumber.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2137*53ee8cc1Swenshuai.xi                     pExifPtrOffset+=4;
2138*53ee8cc1Swenshuai.xi                     _stEXIF_FNumber.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2139*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("FNumber numerator=%ld, denominator=%ld\n", _stEXIF_FNumber.numerator, _stEXIF_FNumber.denominator);
2140*53ee8cc1Swenshuai.xi                     break;
2141*53ee8cc1Swenshuai.xi 
2142*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_SHUTTER_SPEED:
2143*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2144*53ee8cc1Swenshuai.xi                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2145*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("ShutterSpeedValue Offset = 0x%lx\n", u32DataValue);
2146*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdr + u32DataValue;
2147*53ee8cc1Swenshuai.xi                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2148*53ee8cc1Swenshuai.xi                     //JPEG_DEBUG_API_MSG("ShutterSpeedValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2149*53ee8cc1Swenshuai.xi                     _stEXIF_ShutterSpeedValue.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2150*53ee8cc1Swenshuai.xi                     pExifPtrOffset+=4;
2151*53ee8cc1Swenshuai.xi                     _stEXIF_ShutterSpeedValue.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2152*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("ShutterSpeedValue numerator=%ld, denominator=%ld\n", _stEXIF_ShutterSpeedValue.numerator, _stEXIF_ShutterSpeedValue.denominator);
2153*53ee8cc1Swenshuai.xi                     break;
2154*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_APERTURE:
2155*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2156*53ee8cc1Swenshuai.xi                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2157*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("ApertureValue Offset = 0x%lx\n", u32DataValue);
2158*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdr + u32DataValue;
2159*53ee8cc1Swenshuai.xi                     //JPEG_DEBUG_API_MSG("ApertureValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2160*53ee8cc1Swenshuai.xi                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2161*53ee8cc1Swenshuai.xi                     _stEXIF_ApertureValue.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2162*53ee8cc1Swenshuai.xi                     pExifPtrOffset+=4;
2163*53ee8cc1Swenshuai.xi                     _stEXIF_ApertureValue.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2164*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("ApertureValue numerator=%ld, denominator=%ld\n", _stEXIF_ApertureValue.s_numerator, _stEXIF_ApertureValue.s_denominator);
2165*53ee8cc1Swenshuai.xi                     break;
2166*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_EXPOSURE_BIAS:
2167*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2168*53ee8cc1Swenshuai.xi                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2169*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("ExposureBiasValue Offset = 0x%lx\n", u32DataValue);
2170*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdr + u32DataValue;
2171*53ee8cc1Swenshuai.xi                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2172*53ee8cc1Swenshuai.xi                     //JPEG_DEBUG_API_MSG("ExposureBiasValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2173*53ee8cc1Swenshuai.xi                     _stEXIF_ExposureBiasValue.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2174*53ee8cc1Swenshuai.xi                     pExifPtrOffset+=4;
2175*53ee8cc1Swenshuai.xi                     _stEXIF_ExposureBiasValue.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2176*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("ExposureBiasValue numerator=%ld, denominator=%ld\n", _stEXIF_ExposureBiasValue.numerator, _stEXIF_ExposureBiasValue.denominator);
2177*53ee8cc1Swenshuai.xi                     break;
2178*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_FLASH:
2179*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2180*53ee8cc1Swenshuai.xi                     _u16EXIF_Flash = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2181*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("EXIF_Flash=0x%x\n", _u16EXIF_Flash);
2182*53ee8cc1Swenshuai.xi                     break;
2183*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_FOCAL_LENGTH:
2184*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2185*53ee8cc1Swenshuai.xi                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2186*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("FocalLength Offset = 0x%lx\n", u32DataValue);
2187*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdr + u32DataValue;
2188*53ee8cc1Swenshuai.xi                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2189*53ee8cc1Swenshuai.xi                     //JPEG_DEBUG_API_MSG("FocalLength addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2190*53ee8cc1Swenshuai.xi                     _stEXIF_FocalLength.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2191*53ee8cc1Swenshuai.xi                     pExifPtrOffset+=4;
2192*53ee8cc1Swenshuai.xi                     _stEXIF_FocalLength.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2193*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("FocalLength numerator=%ld, denominator=%ld\n", _stEXIF_FocalLength.s_numerator, _stEXIF_FocalLength.s_denominator);
2194*53ee8cc1Swenshuai.xi                     break;
2195*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_IMAGE_WIDTH:
2196*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 2;
2197*53ee8cc1Swenshuai.xi                     u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2198*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2199*53ee8cc1Swenshuai.xi                     if(u16Type==3)
2200*53ee8cc1Swenshuai.xi                     {
2201*53ee8cc1Swenshuai.xi                         _u32EXIF_ImageWidth = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2202*53ee8cc1Swenshuai.xi                     }
2203*53ee8cc1Swenshuai.xi                     else
2204*53ee8cc1Swenshuai.xi                     {
2205*53ee8cc1Swenshuai.xi                         _u32EXIF_ImageWidth = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2206*53ee8cc1Swenshuai.xi                     }
2207*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("EXIF_ImageWidth=%ld\n", _u32EXIF_ImageWidth);
2208*53ee8cc1Swenshuai.xi                     break;
2209*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_IMAGE_HEIGHT:
2210*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 2;
2211*53ee8cc1Swenshuai.xi                     u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2212*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2213*53ee8cc1Swenshuai.xi                     if(u16Type==3)
2214*53ee8cc1Swenshuai.xi                     {
2215*53ee8cc1Swenshuai.xi                         _u32EXIF_ImageHeight = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2216*53ee8cc1Swenshuai.xi                     }
2217*53ee8cc1Swenshuai.xi                     else
2218*53ee8cc1Swenshuai.xi                     {
2219*53ee8cc1Swenshuai.xi                         _u32EXIF_ImageHeight = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2220*53ee8cc1Swenshuai.xi                     }
2221*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("EXIF_ImageHeight=%ld\n", _u32EXIF_ImageHeight);
2222*53ee8cc1Swenshuai.xi                     break;
2223*53ee8cc1Swenshuai.xi                 case JPEG_EXIF_TAG_EXPOSURE_PROGRAM:
2224*53ee8cc1Swenshuai.xi                     pExifPtrOffset = pExifHdrOffet + 8;
2225*53ee8cc1Swenshuai.xi                     _u16EXIF_Exposureprogram = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2226*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("EXIF_Exposureprogram=0x%x\n", _u16EXIF_Exposureprogram);
2227*53ee8cc1Swenshuai.xi                     break;
2228*53ee8cc1Swenshuai.xi                 default:
2229*53ee8cc1Swenshuai.xi                     break;
2230*53ee8cc1Swenshuai.xi             }
2231*53ee8cc1Swenshuai.xi #endif
2232*53ee8cc1Swenshuai.xi             pExifHdrOffet += 12;
2233*53ee8cc1Swenshuai.xi         }
2234*53ee8cc1Swenshuai.xi     }
2235*53ee8cc1Swenshuai.xi 
2236*53ee8cc1Swenshuai.xi     if(E_JPEG_TYPE_THUMBNAIL != _u8DecodeType)
2237*53ee8cc1Swenshuai.xi     {
2238*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("decode type is not thumbnail...\n");
2239*53ee8cc1Swenshuai.xi         return FALSE;
2240*53ee8cc1Swenshuai.xi     }
2241*53ee8cc1Swenshuai.xi 
2242*53ee8cc1Swenshuai.xi     // 1th IFD
2243*53ee8cc1Swenshuai.xi     u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2244*53ee8cc1Swenshuai.xi     if (u32tmp == 0)
2245*53ee8cc1Swenshuai.xi         return FALSE;
2246*53ee8cc1Swenshuai.xi     else
2247*53ee8cc1Swenshuai.xi     {
2248*53ee8cc1Swenshuai.xi         if(u32tmp >= data_length)
2249*53ee8cc1Swenshuai.xi         {
2250*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("u32tmp = %ld is invalid > %ld\n", u32tmp,data_length);
2251*53ee8cc1Swenshuai.xi             return FALSE;
2252*53ee8cc1Swenshuai.xi         }
2253*53ee8cc1Swenshuai.xi         pNextIfd = &pTiffHdrPtr[u32tmp];
2254*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("1st IFD pNextIfd = 0x%lx, u32tmp = %ld\n", (MS_U32)pNextIfd, u32tmp);
2255*53ee8cc1Swenshuai.xi     }
2256*53ee8cc1Swenshuai.xi 
2257*53ee8cc1Swenshuai.xi     u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pNextIfd));
2258*53ee8cc1Swenshuai.xi     pNextIfd += 2;
2259*53ee8cc1Swenshuai.xi 
2260*53ee8cc1Swenshuai.xi     // Boundary check, prevent from buffer over-run
2261*53ee8cc1Swenshuai.xi     if((((MS_U32) pNextIfd) - INTERNAL_BUFFER_ADDR + u16NumOfEntry*12)>=data_length)
2262*53ee8cc1Swenshuai.xi     {
2263*53ee8cc1Swenshuai.xi         return FALSE;
2264*53ee8cc1Swenshuai.xi     }
2265*53ee8cc1Swenshuai.xi 
2266*53ee8cc1Swenshuai.xi     for (i = 0; i < u16NumOfEntry; i++)
2267*53ee8cc1Swenshuai.xi     {
2268*53ee8cc1Swenshuai.xi         u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pNextIfd));
2269*53ee8cc1Swenshuai.xi //        u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pNextIfd + 4));
2270*53ee8cc1Swenshuai.xi         u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pNextIfd + 8));
2271*53ee8cc1Swenshuai.xi 
2272*53ee8cc1Swenshuai.xi         switch (u16Marker)
2273*53ee8cc1Swenshuai.xi         {
2274*53ee8cc1Swenshuai.xi             case JPEG_TIFF_JPEG_IMG_BYTES:
2275*53ee8cc1Swenshuai.xi                 _u16ThumbnailSize = u32tmp;
2276*53ee8cc1Swenshuai.xi                 break;
2277*53ee8cc1Swenshuai.xi             case JPEG_TIFF_SOI_OFFSET:
2278*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("Thumbnail marker found in 0x%lx!!\n", (MS_U32)pNextIfd);
2279*53ee8cc1Swenshuai.xi                 _bThumbnailFound = TRUE;
2280*53ee8cc1Swenshuai.xi                 _u32ThumbnailOffset += u32tmp;
2281*53ee8cc1Swenshuai.xi                 break;
2282*53ee8cc1Swenshuai.xi             default:
2283*53ee8cc1Swenshuai.xi                 break;
2284*53ee8cc1Swenshuai.xi         }
2285*53ee8cc1Swenshuai.xi 
2286*53ee8cc1Swenshuai.xi         pNextIfd += 12;
2287*53ee8cc1Swenshuai.xi     }
2288*53ee8cc1Swenshuai.xi 
2289*53ee8cc1Swenshuai.xi     // Boundary check, prevent from buffer over-run
2290*53ee8cc1Swenshuai.xi     if(_bThumbnailFound)
2291*53ee8cc1Swenshuai.xi     {
2292*53ee8cc1Swenshuai.xi         if((_u32ThumbnailOffset + _u16ThumbnailSize) > data_length)
2293*53ee8cc1Swenshuai.xi             _bThumbnailFound = FALSE;
2294*53ee8cc1Swenshuai.xi 
2295*53ee8cc1Swenshuai.xi         // means it only contains SOI header..
2296*53ee8cc1Swenshuai.xi         if(_u16ThumbnailSize<=2)
2297*53ee8cc1Swenshuai.xi             _bThumbnailFound = FALSE;
2298*53ee8cc1Swenshuai.xi     }
2299*53ee8cc1Swenshuai.xi 
2300*53ee8cc1Swenshuai.xi     return _bThumbnailFound;
2301*53ee8cc1Swenshuai.xi }
2302*53ee8cc1Swenshuai.xi 
2303*53ee8cc1Swenshuai.xi // Used to skip unrecognized markers.
JPEG_skip_bytes(MS_U32 count)2304*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_skip_bytes(MS_U32 count)
2305*53ee8cc1Swenshuai.xi {
2306*53ee8cc1Swenshuai.xi     while(count!=0)
2307*53ee8cc1Swenshuai.xi     {
2308*53ee8cc1Swenshuai.xi         // Any bytes remaining in buffer?
2309*53ee8cc1Swenshuai.xi         if ( !_u32In_buf_left )
2310*53ee8cc1Swenshuai.xi         {
2311*53ee8cc1Swenshuai.xi             // Try to get more bytes.
2312*53ee8cc1Swenshuai.xi             if(!JPEG_fill_read_buffer())
2313*53ee8cc1Swenshuai.xi             {
2314*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer failed!!!\n");
2315*53ee8cc1Swenshuai.xi                 _u32In_buf_left = 0;
2316*53ee8cc1Swenshuai.xi             }
2317*53ee8cc1Swenshuai.xi             // Still nothing to get?
2318*53ee8cc1Swenshuai.xi             if ( !_u32In_buf_left )
2319*53ee8cc1Swenshuai.xi             {
2320*53ee8cc1Swenshuai.xi                 // should not happen
2321*53ee8cc1Swenshuai.xi                 break;
2322*53ee8cc1Swenshuai.xi             }
2323*53ee8cc1Swenshuai.xi         }
2324*53ee8cc1Swenshuai.xi 
2325*53ee8cc1Swenshuai.xi         if(count<_u32In_buf_left)
2326*53ee8cc1Swenshuai.xi         {
2327*53ee8cc1Swenshuai.xi             _u32In_buf_left -= count;
2328*53ee8cc1Swenshuai.xi             _pu8In_buf_ofs += count;
2329*53ee8cc1Swenshuai.xi             count = 0;
2330*53ee8cc1Swenshuai.xi         }
2331*53ee8cc1Swenshuai.xi         else
2332*53ee8cc1Swenshuai.xi         {
2333*53ee8cc1Swenshuai.xi             count -= _u32In_buf_left;
2334*53ee8cc1Swenshuai.xi             _u32In_buf_left = 0;
2335*53ee8cc1Swenshuai.xi         }
2336*53ee8cc1Swenshuai.xi     }
2337*53ee8cc1Swenshuai.xi }
2338*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2339*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
2340*53ee8cc1Swenshuai.xi #define JPEG_TAG_MPO                EndianChangeL(0x4D504600)
2341*53ee8cc1Swenshuai.xi #define JPEG_MPO_TAG_MPF_VERSION        0xB000
2342*53ee8cc1Swenshuai.xi #define JPEG_MPO_TAG_NUM_OF_IMAGES      0xB001
2343*53ee8cc1Swenshuai.xi #define JPEG_MPO_TAG_MP_ENTRY           0xB002
2344*53ee8cc1Swenshuai.xi 
2345*53ee8cc1Swenshuai.xi static JPEG_MPO_INDEX_INFO _stMPOIndex;
2346*53ee8cc1Swenshuai.xi static JPEG_MPO_ATTRIBUTE_INFO _stMPOAttri[JPEG_MPO_MAX_SUPPORT_IMAGE];
2347*53ee8cc1Swenshuai.xi //For start of offset of MPO(only for first MPO picture)
2348*53ee8cc1Swenshuai.xi static MS_U32 _u32App2MarkerOffset = 0;
2349*53ee8cc1Swenshuai.xi 
2350*53ee8cc1Swenshuai.xi typedef enum
2351*53ee8cc1Swenshuai.xi {
2352*53ee8cc1Swenshuai.xi     E_JPEG_MPO_ATTR_IMAGE_NO            = 0xB101
2353*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_PAN_ORIENTATION     = 0xB201
2354*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_PAN_OVERLAP_H       = 0xB202
2355*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_PAN_OVERLAP_V       = 0xB203
2356*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_BASE_VIEWPOINT_NO   = 0xB204
2357*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_CONVERGENCE_ANGLE   = 0xB205
2358*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_BASELINE_LENGTH     = 0xB206
2359*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_DIVERGENCE_ANGLE    = 0xB207
2360*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_AXIS_DISTANCE_X     = 0xB208
2361*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_AXIS_DISTANCE_Y     = 0xB209
2362*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_AXIS_DISTANCE_Z     = 0xB20A
2363*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_YAW_ANGLE           = 0xB20B
2364*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_PITCH_ANGLE         = 0xB20C
2365*53ee8cc1Swenshuai.xi   , E_JPEG_MPO_ATTR_ROLL_ANGLE          = 0xB20D
2366*53ee8cc1Swenshuai.xi } JPEG_MPO_ATTR_TAG;
2367*53ee8cc1Swenshuai.xi 
2368*53ee8cc1Swenshuai.xi #define MAX_MPO_ATTR_TAG_NUM        14          // from E_JPEG_MPO_ATTR_IMAGE_NO to E_JPEG_MPO_ATTR_ROLL_ANGLE
2369*53ee8cc1Swenshuai.xi 
2370*53ee8cc1Swenshuai.xi //***************************************************
2371*53ee8cc1Swenshuai.xi //Initialize EXIF MPO database
2372*53ee8cc1Swenshuai.xi //***************************************************
JPEG_InitMPO(void)2373*53ee8cc1Swenshuai.xi static void JPEG_InitMPO(void)
2374*53ee8cc1Swenshuai.xi {
2375*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
2376*53ee8cc1Swenshuai.xi 
2377*53ee8cc1Swenshuai.xi     //init MPO Index structure
2378*53ee8cc1Swenshuai.xi     _stMPOIndex.num_of_image = 1;
2379*53ee8cc1Swenshuai.xi     for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2380*53ee8cc1Swenshuai.xi     {
2381*53ee8cc1Swenshuai.xi         _stMPOIndex.mp_entry[i].attribute = 0;
2382*53ee8cc1Swenshuai.xi         _stMPOIndex.mp_entry[i].size = 0;
2383*53ee8cc1Swenshuai.xi         _stMPOIndex.mp_entry[i].offset = 0;
2384*53ee8cc1Swenshuai.xi         _stMPOIndex.mp_entry[i].image1_no = 0;
2385*53ee8cc1Swenshuai.xi         _stMPOIndex.mp_entry[i].image2_no = 0;
2386*53ee8cc1Swenshuai.xi     }
2387*53ee8cc1Swenshuai.xi 
2388*53ee8cc1Swenshuai.xi     // init MPO Attribute structure
2389*53ee8cc1Swenshuai.xi     for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2390*53ee8cc1Swenshuai.xi     {
2391*53ee8cc1Swenshuai.xi         _stMPOAttri[i].MPIndividualNum = 0;
2392*53ee8cc1Swenshuai.xi         _stMPOAttri[i].PanOrientation= 0;
2393*53ee8cc1Swenshuai.xi         _stMPOAttri[i].PanOverlap_H.numerator = 0;
2394*53ee8cc1Swenshuai.xi         _stMPOAttri[i].PanOverlap_H.denominator = 0;
2395*53ee8cc1Swenshuai.xi         _stMPOAttri[i].PanOverlap_V.numerator = 0;
2396*53ee8cc1Swenshuai.xi         _stMPOAttri[i].PanOverlap_V.denominator = 0;
2397*53ee8cc1Swenshuai.xi         _stMPOAttri[i].BaseViewpointNum = 0;
2398*53ee8cc1Swenshuai.xi         _stMPOAttri[i].ConvergenceAngle.s_numerator = 0;
2399*53ee8cc1Swenshuai.xi         _stMPOAttri[i].ConvergenceAngle.s_denominator = 0;
2400*53ee8cc1Swenshuai.xi         _stMPOAttri[i].BaselineLength.numerator = 0;
2401*53ee8cc1Swenshuai.xi         _stMPOAttri[i].BaselineLength.denominator = 0;
2402*53ee8cc1Swenshuai.xi         _stMPOAttri[i].VerticalDivergence.s_numerator = 0;
2403*53ee8cc1Swenshuai.xi         _stMPOAttri[i].VerticalDivergence.s_denominator = 0;
2404*53ee8cc1Swenshuai.xi         _stMPOAttri[i].AxisDistance_X.s_numerator = 0;
2405*53ee8cc1Swenshuai.xi         _stMPOAttri[i].AxisDistance_X.s_denominator = 0;
2406*53ee8cc1Swenshuai.xi         _stMPOAttri[i].AxisDistance_Y.s_numerator = 0;
2407*53ee8cc1Swenshuai.xi         _stMPOAttri[i].AxisDistance_Y.s_denominator = 0;
2408*53ee8cc1Swenshuai.xi         _stMPOAttri[i].AxisDistance_Z.s_numerator = 0;
2409*53ee8cc1Swenshuai.xi         _stMPOAttri[i].AxisDistance_Z.s_denominator = 0;
2410*53ee8cc1Swenshuai.xi         _stMPOAttri[i].YawAngle.s_numerator = 0;
2411*53ee8cc1Swenshuai.xi         _stMPOAttri[i].YawAngle.s_denominator = 0;
2412*53ee8cc1Swenshuai.xi         _stMPOAttri[i].PitchAngle.s_numerator = 0;
2413*53ee8cc1Swenshuai.xi         _stMPOAttri[i].PitchAngle.s_denominator = 0;
2414*53ee8cc1Swenshuai.xi         _stMPOAttri[i].RollAngle.s_numerator = 0;
2415*53ee8cc1Swenshuai.xi         _stMPOAttri[i].RollAngle.s_denominator = 0;
2416*53ee8cc1Swenshuai.xi         _stMPOAttri[i].used = FALSE;
2417*53ee8cc1Swenshuai.xi     }
2418*53ee8cc1Swenshuai.xi }
2419*53ee8cc1Swenshuai.xi //***************************************************
2420*53ee8cc1Swenshuai.xi //Parse EXIF MPO Attribute header
2421*53ee8cc1Swenshuai.xi //***************************************************
JPEG_DecodeMPAttrIFD(MS_U8 * data,MS_U8 * start_of_offset,MS_U32 count)2422*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_DecodeMPAttrIFD(MS_U8 *data, MS_U8 *start_of_offset, MS_U32 count)
2423*53ee8cc1Swenshuai.xi {
2424*53ee8cc1Swenshuai.xi     MS_U8 *pMPOAttrPtr = data;
2425*53ee8cc1Swenshuai.xi     MS_U8 *pMPO_offset;
2426*53ee8cc1Swenshuai.xi     MS_U16 u16Marker, i = 0, image_idx = 0;
2427*53ee8cc1Swenshuai.xi 
2428*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG_DecodeMPAttrIFD, count = %ld\n", count);
2429*53ee8cc1Swenshuai.xi 
2430*53ee8cc1Swenshuai.xi     if(count >MAX_MPO_ATTR_TAG_NUM)
2431*53ee8cc1Swenshuai.xi     {
2432*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("Warning!!!unreasonable attribute IFD number !!!\n");
2433*53ee8cc1Swenshuai.xi         return TRUE;
2434*53ee8cc1Swenshuai.xi     }
2435*53ee8cc1Swenshuai.xi 
2436*53ee8cc1Swenshuai.xi     for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2437*53ee8cc1Swenshuai.xi     {
2438*53ee8cc1Swenshuai.xi         if(FALSE == _stMPOAttri[i].used)
2439*53ee8cc1Swenshuai.xi         {
2440*53ee8cc1Swenshuai.xi             image_idx = i;
2441*53ee8cc1Swenshuai.xi             break;
2442*53ee8cc1Swenshuai.xi         }
2443*53ee8cc1Swenshuai.xi     }
2444*53ee8cc1Swenshuai.xi 
2445*53ee8cc1Swenshuai.xi     if(JPEG_MPO_MAX_SUPPORT_IMAGE <= i)
2446*53ee8cc1Swenshuai.xi     {
2447*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("Not support too much images in MPO!!\n");
2448*53ee8cc1Swenshuai.xi         return FALSE;
2449*53ee8cc1Swenshuai.xi     }
2450*53ee8cc1Swenshuai.xi 
2451*53ee8cc1Swenshuai.xi     _stMPOAttri[image_idx].used = TRUE;
2452*53ee8cc1Swenshuai.xi 
2453*53ee8cc1Swenshuai.xi     for(i = 0; i < count; i++)
2454*53ee8cc1Swenshuai.xi     {
2455*53ee8cc1Swenshuai.xi         u16Marker = (JPEG_MPO_ATTR_TAG)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pMPOAttrPtr));
2456*53ee8cc1Swenshuai.xi         pMPOAttrPtr += 8;
2457*53ee8cc1Swenshuai.xi         switch(u16Marker)
2458*53ee8cc1Swenshuai.xi         {
2459*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_IMAGE_NO:
2460*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].MPIndividualNum = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2461*53ee8cc1Swenshuai.xi                 break;
2462*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_PAN_ORIENTATION:
2463*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].PanOrientation = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2464*53ee8cc1Swenshuai.xi                 break;
2465*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_PAN_OVERLAP_H:
2466*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2467*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2468*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].PanOverlap_H.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2469*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2470*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].PanOverlap_H.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2471*53ee8cc1Swenshuai.xi                 break;
2472*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_PAN_OVERLAP_V:
2473*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2474*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2475*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].PanOverlap_V.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2476*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2477*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].PanOverlap_V.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2478*53ee8cc1Swenshuai.xi                 break;
2479*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_BASE_VIEWPOINT_NO:
2480*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].BaseViewpointNum = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2481*53ee8cc1Swenshuai.xi                 break;
2482*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_CONVERGENCE_ANGLE:
2483*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2484*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2485*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].ConvergenceAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2486*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2487*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].ConvergenceAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2488*53ee8cc1Swenshuai.xi                 break;
2489*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_BASELINE_LENGTH:
2490*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2491*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2492*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].BaselineLength.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2493*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2494*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].BaselineLength.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2495*53ee8cc1Swenshuai.xi                 break;
2496*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_DIVERGENCE_ANGLE:
2497*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2498*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2499*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].VerticalDivergence.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2500*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2501*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].VerticalDivergence.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2502*53ee8cc1Swenshuai.xi                 break;
2503*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_AXIS_DISTANCE_X:
2504*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2505*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2506*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].AxisDistance_X.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2507*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2508*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].AxisDistance_X.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2509*53ee8cc1Swenshuai.xi                 break;
2510*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_AXIS_DISTANCE_Y:
2511*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2512*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2513*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].AxisDistance_Y.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2514*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2515*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].AxisDistance_Y.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2516*53ee8cc1Swenshuai.xi                 break;
2517*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_AXIS_DISTANCE_Z:
2518*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2519*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2520*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].AxisDistance_Z.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2521*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2522*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].AxisDistance_Z.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2523*53ee8cc1Swenshuai.xi                 break;
2524*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_YAW_ANGLE:
2525*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2526*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2527*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].YawAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2528*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2529*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].YawAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2530*53ee8cc1Swenshuai.xi                 break;
2531*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_PITCH_ANGLE:
2532*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2533*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2534*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].PitchAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2535*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2536*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].PitchAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2537*53ee8cc1Swenshuai.xi                 break;
2538*53ee8cc1Swenshuai.xi             case E_JPEG_MPO_ATTR_ROLL_ANGLE:
2539*53ee8cc1Swenshuai.xi                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2540*53ee8cc1Swenshuai.xi                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2541*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].RollAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2542*53ee8cc1Swenshuai.xi                 pMPO_offset += 4;
2543*53ee8cc1Swenshuai.xi                 _stMPOAttri[image_idx].RollAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2544*53ee8cc1Swenshuai.xi                 break;
2545*53ee8cc1Swenshuai.xi             default:
2546*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_ERR("Unknown MPO attribute marker =0x%x!!!!!!\n", u16Marker);
2547*53ee8cc1Swenshuai.xi                 break;
2548*53ee8cc1Swenshuai.xi         }
2549*53ee8cc1Swenshuai.xi         pMPOAttrPtr += 4;
2550*53ee8cc1Swenshuai.xi     }
2551*53ee8cc1Swenshuai.xi     return TRUE;
2552*53ee8cc1Swenshuai.xi }
2553*53ee8cc1Swenshuai.xi //***************************************************
2554*53ee8cc1Swenshuai.xi //Parse EXIF MPO header
2555*53ee8cc1Swenshuai.xi //***************************************************
JPEG_DecodeMPOInfo(MS_U8 * data)2556*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_DecodeMPOInfo(MS_U8 *data)
2557*53ee8cc1Swenshuai.xi {
2558*53ee8cc1Swenshuai.xi     MS_U8 *pJpegBuff = data;
2559*53ee8cc1Swenshuai.xi     MS_U8 *pMPOHdrPtr;
2560*53ee8cc1Swenshuai.xi     MS_U32 u32tmp, u32Len;
2561*53ee8cc1Swenshuai.xi     MS_U16 u16Marker, u16NumOfEntry, i;
2562*53ee8cc1Swenshuai.xi 
2563*53ee8cc1Swenshuai.xi     u32tmp = JPEG_GetU32(pJpegBuff);
2564*53ee8cc1Swenshuai.xi     if (u32tmp != JPEG_TAG_MPO)
2565*53ee8cc1Swenshuai.xi     {
2566*53ee8cc1Swenshuai.xi         return FALSE;
2567*53ee8cc1Swenshuai.xi     }
2568*53ee8cc1Swenshuai.xi 
2569*53ee8cc1Swenshuai.xi     // mpo header start from here
2570*53ee8cc1Swenshuai.xi     pJpegBuff += 4;
2571*53ee8cc1Swenshuai.xi     u16Marker = JPEG_GetU16(pJpegBuff);
2572*53ee8cc1Swenshuai.xi     if (u16Marker == JPEG_TIFF_BIG_ENDIAN)
2573*53ee8cc1Swenshuai.xi         _bTiffBigEndian = TRUE;
2574*53ee8cc1Swenshuai.xi     else if (u16Marker == JPEG_TIFF_LITTLE_ENDIAN)
2575*53ee8cc1Swenshuai.xi         _bTiffBigEndian = FALSE;
2576*53ee8cc1Swenshuai.xi     else
2577*53ee8cc1Swenshuai.xi         return FALSE;
2578*53ee8cc1Swenshuai.xi 
2579*53ee8cc1Swenshuai.xi //    _u32ThumbnailOffset += 4;
2580*53ee8cc1Swenshuai.xi     pMPOHdrPtr = pJpegBuff;
2581*53ee8cc1Swenshuai.xi 
2582*53ee8cc1Swenshuai.xi     pJpegBuff += 2;
2583*53ee8cc1Swenshuai.xi     u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2584*53ee8cc1Swenshuai.xi     if (u16Marker != 0x002A)
2585*53ee8cc1Swenshuai.xi         return FALSE;
2586*53ee8cc1Swenshuai.xi 
2587*53ee8cc1Swenshuai.xi     //offset to 1st MPO IFD
2588*53ee8cc1Swenshuai.xi     pJpegBuff += 2;
2589*53ee8cc1Swenshuai.xi     u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2590*53ee8cc1Swenshuai.xi 
2591*53ee8cc1Swenshuai.xi     //1st MPO IFD start from here(either MP Index IFD or MP Attribute IFD)
2592*53ee8cc1Swenshuai.xi     //Count Info
2593*53ee8cc1Swenshuai.xi     pJpegBuff = pMPOHdrPtr + u32Len;
2594*53ee8cc1Swenshuai.xi     JPEG_OVER_BUFFER_RET(pJpegBuff, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2595*53ee8cc1Swenshuai.xi 
2596*53ee8cc1Swenshuai.xi     u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2597*53ee8cc1Swenshuai.xi 
2598*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("num of entry = %d\n", u16NumOfEntry);
2599*53ee8cc1Swenshuai.xi 
2600*53ee8cc1Swenshuai.xi     //MPFVersion
2601*53ee8cc1Swenshuai.xi     pJpegBuff += 2;
2602*53ee8cc1Swenshuai.xi     u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2603*53ee8cc1Swenshuai.xi     if(u16Marker == JPEG_MPO_TAG_MPF_VERSION)
2604*53ee8cc1Swenshuai.xi     {
2605*53ee8cc1Swenshuai.xi         pJpegBuff += 12;
2606*53ee8cc1Swenshuai.xi         u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2607*53ee8cc1Swenshuai.xi         if(u16Marker == JPEG_MPO_TAG_NUM_OF_IMAGES)
2608*53ee8cc1Swenshuai.xi         {
2609*53ee8cc1Swenshuai.xi             //It is a MP Index IFD
2610*53ee8cc1Swenshuai.xi             //Check number of images
2611*53ee8cc1Swenshuai.xi             pJpegBuff += 8;
2612*53ee8cc1Swenshuai.xi             u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2613*53ee8cc1Swenshuai.xi 
2614*53ee8cc1Swenshuai.xi             if(JPEG_MPO_MAX_SUPPORT_IMAGE < u32tmp)
2615*53ee8cc1Swenshuai.xi             {
2616*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("Not support %ld images in MPO!!\n", u32tmp);
2617*53ee8cc1Swenshuai.xi                 _stMPOIndex.num_of_image = 0xFFFFFFFF;
2618*53ee8cc1Swenshuai.xi                 return FALSE;
2619*53ee8cc1Swenshuai.xi             }
2620*53ee8cc1Swenshuai.xi 
2621*53ee8cc1Swenshuai.xi             //Init MPO database
2622*53ee8cc1Swenshuai.xi             JPEG_InitMPO();
2623*53ee8cc1Swenshuai.xi 
2624*53ee8cc1Swenshuai.xi             //start of offset for every individual picture
2625*53ee8cc1Swenshuai.xi             _stMPOIndex.start_of_offset = _u32App2MarkerOffset + 8 - MRC_BUFFER_ADDR;
2626*53ee8cc1Swenshuai.xi 
2627*53ee8cc1Swenshuai.xi             //the numbers of image
2628*53ee8cc1Swenshuai.xi             _stMPOIndex.num_of_image = u32tmp;
2629*53ee8cc1Swenshuai.xi 
2630*53ee8cc1Swenshuai.xi             printf_red("detected _stMPOIndex.num_of_image=0x%lx\n", _stMPOIndex.num_of_image);
2631*53ee8cc1Swenshuai.xi             //MP Entry
2632*53ee8cc1Swenshuai.xi             pJpegBuff += 4;
2633*53ee8cc1Swenshuai.xi             u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2634*53ee8cc1Swenshuai.xi             if(u16Marker != JPEG_MPO_TAG_MP_ENTRY)
2635*53ee8cc1Swenshuai.xi             {
2636*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("No MP Entry in MP index IFD!!\n");
2637*53ee8cc1Swenshuai.xi                 return FALSE;
2638*53ee8cc1Swenshuai.xi             }
2639*53ee8cc1Swenshuai.xi 
2640*53ee8cc1Swenshuai.xi             //offset to next IFD(MP Attribute IFD)
2641*53ee8cc1Swenshuai.xi             pJpegBuff = pMPOHdrPtr + 10 + u16NumOfEntry*12;
2642*53ee8cc1Swenshuai.xi             u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2643*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("pJpegBuff = %lx, u32Len = %ld\n", (MS_U32)pJpegBuff, u32Len);
2644*53ee8cc1Swenshuai.xi 
2645*53ee8cc1Swenshuai.xi             //MP Entry Internal Fields
2646*53ee8cc1Swenshuai.xi             pJpegBuff += 4;
2647*53ee8cc1Swenshuai.xi             for(i = 0; i < _stMPOIndex.num_of_image; i++)
2648*53ee8cc1Swenshuai.xi             {
2649*53ee8cc1Swenshuai.xi                 //Image Attribute
2650*53ee8cc1Swenshuai.xi                 _stMPOIndex.mp_entry[i].attribute = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2651*53ee8cc1Swenshuai.xi                 //Image size
2652*53ee8cc1Swenshuai.xi                 pJpegBuff += 4;
2653*53ee8cc1Swenshuai.xi                 _stMPOIndex.mp_entry[i].size = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2654*53ee8cc1Swenshuai.xi                 //Image size
2655*53ee8cc1Swenshuai.xi                 pJpegBuff += 4;
2656*53ee8cc1Swenshuai.xi                 _stMPOIndex.mp_entry[i].offset = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2657*53ee8cc1Swenshuai.xi                 //Image size
2658*53ee8cc1Swenshuai.xi                 pJpegBuff += 4;
2659*53ee8cc1Swenshuai.xi                 _stMPOIndex.mp_entry[i].image1_no = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2660*53ee8cc1Swenshuai.xi                 //Image size
2661*53ee8cc1Swenshuai.xi                 pJpegBuff += 2;
2662*53ee8cc1Swenshuai.xi                 _stMPOIndex.mp_entry[i].image2_no = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2663*53ee8cc1Swenshuai.xi                 pJpegBuff += 2;
2664*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("%d th : attribute = %lx\n", i, _stMPOIndex.mp_entry[i].attribute);
2665*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("%d th : size = %lx\n", i, _stMPOIndex.mp_entry[i].size);
2666*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("%d th : offset = %lx\n", i, _stMPOIndex.mp_entry[i].offset);
2667*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("%d th : image1_no = %x\n", i, _stMPOIndex.mp_entry[i].image1_no);
2668*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("%d th : image2_no = %x\n", i, _stMPOIndex.mp_entry[i].image2_no);
2669*53ee8cc1Swenshuai.xi             }
2670*53ee8cc1Swenshuai.xi 
2671*53ee8cc1Swenshuai.xi             //get MPO Attribute count
2672*53ee8cc1Swenshuai.xi             pJpegBuff = pMPOHdrPtr + u32Len;
2673*53ee8cc1Swenshuai.xi             JPEG_OVER_BUFFER_RET(pJpegBuff, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2674*53ee8cc1Swenshuai.xi 
2675*53ee8cc1Swenshuai.xi             u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2676*53ee8cc1Swenshuai.xi 
2677*53ee8cc1Swenshuai.xi             pJpegBuff += 2;
2678*53ee8cc1Swenshuai.xi         }
2679*53ee8cc1Swenshuai.xi     }
2680*53ee8cc1Swenshuai.xi 
2681*53ee8cc1Swenshuai.xi     //Decode MP Attr header
2682*53ee8cc1Swenshuai.xi     return JPEG_DecodeMPAttrIFD(pJpegBuff, pMPOHdrPtr, u16NumOfEntry);
2683*53ee8cc1Swenshuai.xi }
2684*53ee8cc1Swenshuai.xi 
2685*53ee8cc1Swenshuai.xi 
2686*53ee8cc1Swenshuai.xi #endif
2687*53ee8cc1Swenshuai.xi 
2688*53ee8cc1Swenshuai.xi // Parse APP0 to get X&Y density.
JPEG_read_app0_marker(void)2689*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_read_app0_marker( void )
2690*53ee8cc1Swenshuai.xi {
2691*53ee8cc1Swenshuai.xi 
2692*53ee8cc1Swenshuai.xi     MS_U32 left;
2693*53ee8cc1Swenshuai.xi     MS_U8 u8Xthumbnail, u8Ythumbnail;
2694*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("APP0\n");
2695*53ee8cc1Swenshuai.xi 
2696*53ee8cc1Swenshuai.xi     //Get APP0 length
2697*53ee8cc1Swenshuai.xi     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2698*53ee8cc1Swenshuai.xi 
2699*53ee8cc1Swenshuai.xi     left-= 2;
2700*53ee8cc1Swenshuai.xi 
2701*53ee8cc1Swenshuai.xi     if(left < 8)
2702*53ee8cc1Swenshuai.xi     {
2703*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_APP0_MARKER );
2704*53ee8cc1Swenshuai.xi         return FALSE;
2705*53ee8cc1Swenshuai.xi     }
2706*53ee8cc1Swenshuai.xi 
2707*53ee8cc1Swenshuai.xi     //Skip Block ID "JFIF"
2708*53ee8cc1Swenshuai.xi     JPEG_skip_bytes(5);
2709*53ee8cc1Swenshuai.xi 
2710*53ee8cc1Swenshuai.xi     left-= 5;
2711*53ee8cc1Swenshuai.xi 
2712*53ee8cc1Swenshuai.xi     //Skip Version Number
2713*53ee8cc1Swenshuai.xi     JPEG_skip_bytes(2);
2714*53ee8cc1Swenshuai.xi 
2715*53ee8cc1Swenshuai.xi     left-= 2;
2716*53ee8cc1Swenshuai.xi 
2717*53ee8cc1Swenshuai.xi     //Get units
2718*53ee8cc1Swenshuai.xi     App0_Unit_Data.u8Unit = JPEG_get_char();
2719*53ee8cc1Swenshuai.xi     App0_Unit_Data.u16Xdensity= (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2720*53ee8cc1Swenshuai.xi     App0_Unit_Data.u16Ydensity= (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2721*53ee8cc1Swenshuai.xi 
2722*53ee8cc1Swenshuai.xi     left-= 5;
2723*53ee8cc1Swenshuai.xi 
2724*53ee8cc1Swenshuai.xi     //Get thumbnail x,y
2725*53ee8cc1Swenshuai.xi     u8Xthumbnail = JPEG_get_char();
2726*53ee8cc1Swenshuai.xi     u8Ythumbnail = JPEG_get_char();
2727*53ee8cc1Swenshuai.xi 
2728*53ee8cc1Swenshuai.xi     left-= 2;
2729*53ee8cc1Swenshuai.xi 
2730*53ee8cc1Swenshuai.xi     //Skip Version Number
2731*53ee8cc1Swenshuai.xi     JPEG_skip_bytes(3*u8Xthumbnail*u8Ythumbnail);
2732*53ee8cc1Swenshuai.xi 
2733*53ee8cc1Swenshuai.xi     left-= 3*u8Xthumbnail*u8Ythumbnail;
2734*53ee8cc1Swenshuai.xi 
2735*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("APP0 : unit : %d\n",(MS_U16)App0_Unit_Data.u8Unit);
2736*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("APP0 : Xdensity : %d\n",App0_Unit_Data.u16Xdensity);
2737*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("APP0 : Ydensity : %d\n",App0_Unit_Data.u16Ydensity);
2738*53ee8cc1Swenshuai.xi 
2739*53ee8cc1Swenshuai.xi     if(left > 0)
2740*53ee8cc1Swenshuai.xi         JPEG_skip_bytes(left);
2741*53ee8cc1Swenshuai.xi 
2742*53ee8cc1Swenshuai.xi     return TRUE;
2743*53ee8cc1Swenshuai.xi }
2744*53ee8cc1Swenshuai.xi 
_msAPI_JPEG_get_APP0_info(MS_U8 * unit,MS_U16 * x,MS_U16 * y)2745*53ee8cc1Swenshuai.xi void _msAPI_JPEG_get_APP0_info( MS_U8 *unit, MS_U16 *x, MS_U16 *y )
2746*53ee8cc1Swenshuai.xi {
2747*53ee8cc1Swenshuai.xi     *unit = App0_Unit_Data.u8Unit;
2748*53ee8cc1Swenshuai.xi     *x = App0_Unit_Data.u16Xdensity;
2749*53ee8cc1Swenshuai.xi     *y = App0_Unit_Data.u16Ydensity;
2750*53ee8cc1Swenshuai.xi }
2751*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2752*53ee8cc1Swenshuai.xi // Read exif info
JPEG_read_app1_marker(void)2753*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_app1_marker(void)
2754*53ee8cc1Swenshuai.xi {
2755*53ee8cc1Swenshuai.xi     MS_U16 length;
2756*53ee8cc1Swenshuai.xi     MS_U8 *exif_buffer = (MS_U8 *) INTERNAL_BUFFER_ADDR;
2757*53ee8cc1Swenshuai.xi     MS_U16 i = 0;
2758*53ee8cc1Swenshuai.xi 
2759*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("APP1\n");
2760*53ee8cc1Swenshuai.xi 
2761*53ee8cc1Swenshuai.xi     length = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2762*53ee8cc1Swenshuai.xi 
2763*53ee8cc1Swenshuai.xi     if ( length < 2 )
2764*53ee8cc1Swenshuai.xi     {
2765*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
2766*53ee8cc1Swenshuai.xi         return FALSE;
2767*53ee8cc1Swenshuai.xi     }
2768*53ee8cc1Swenshuai.xi 
2769*53ee8cc1Swenshuai.xi     length -= 2;
2770*53ee8cc1Swenshuai.xi 
2771*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
2772*53ee8cc1Swenshuai.xi     u32MPFOffset = length;
2773*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("u32MPFOffset=0x%lx\n", u32MPFOffset);
2774*53ee8cc1Swenshuai.xi #endif
2775*53ee8cc1Swenshuai.xi     while((length - i)!=0)
2776*53ee8cc1Swenshuai.xi     {
2777*53ee8cc1Swenshuai.xi         exif_buffer[i] = (MS_U8) JPEG_get_char();
2778*53ee8cc1Swenshuai.xi         i++;
2779*53ee8cc1Swenshuai.xi     }
2780*53ee8cc1Swenshuai.xi 
2781*53ee8cc1Swenshuai.xi     if(JPEG_DecodeExifInfo(exif_buffer, length) == TRUE)
2782*53ee8cc1Swenshuai.xi     {
2783*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("FOUND THUMBNAIL!\n");
2784*53ee8cc1Swenshuai.xi         _u32ThumbnailBufferOffset = _u32ThumbnailOffset;
2785*53ee8cc1Swenshuai.xi         _u16ThumbnailBufferSize = _u16ThumbnailSize;
2786*53ee8cc1Swenshuai.xi     }
2787*53ee8cc1Swenshuai.xi     else
2788*53ee8cc1Swenshuai.xi     {
2789*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("NO THUMBNAIL!\n");
2790*53ee8cc1Swenshuai.xi     }
2791*53ee8cc1Swenshuai.xi     return TRUE;
2792*53ee8cc1Swenshuai.xi }
2793*53ee8cc1Swenshuai.xi 
2794*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
2795*53ee8cc1Swenshuai.xi 
2796*53ee8cc1Swenshuai.xi // Read exif app2 info
JPEG_read_app2_marker(void)2797*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_read_app2_marker( void )
2798*53ee8cc1Swenshuai.xi {
2799*53ee8cc1Swenshuai.xi     MS_U16 length;
2800*53ee8cc1Swenshuai.xi     MS_U8 *exif_buffer = (MS_U8 *) (INTERNAL_BUFFER_ADDR + u32MPFOffset);
2801*53ee8cc1Swenshuai.xi     MS_U16 i = 0;
2802*53ee8cc1Swenshuai.xi 
2803*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("APP2\n");
2804*53ee8cc1Swenshuai.xi 
2805*53ee8cc1Swenshuai.xi     //For start of offset of MPO(only for first MPO picture)
2806*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("_pu8In_buf_ofs = %lx\n", (MS_U32)_pu8In_buf_ofs);
2807*53ee8cc1Swenshuai.xi     _u32App2MarkerOffset = (MS_U32)_pu8In_buf_ofs - 2;
2808*53ee8cc1Swenshuai.xi 
2809*53ee8cc1Swenshuai.xi     length = (MS_U16)((JPEG_get_char()<<8)+JPEG_get_char());
2810*53ee8cc1Swenshuai.xi 
2811*53ee8cc1Swenshuai.xi     if ( length < 2 )
2812*53ee8cc1Swenshuai.xi     {
2813*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_APP2_MARKER );
2814*53ee8cc1Swenshuai.xi         return FALSE;
2815*53ee8cc1Swenshuai.xi     }
2816*53ee8cc1Swenshuai.xi 
2817*53ee8cc1Swenshuai.xi     length -= 2;
2818*53ee8cc1Swenshuai.xi 
2819*53ee8cc1Swenshuai.xi     if(length > INTERNAL_BUFFER_SIZE - u32MPFOffset)
2820*53ee8cc1Swenshuai.xi     {
2821*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_NOTENOUGHMEM );
2822*53ee8cc1Swenshuai.xi         return FALSE;
2823*53ee8cc1Swenshuai.xi     }
2824*53ee8cc1Swenshuai.xi 
2825*53ee8cc1Swenshuai.xi     while((length - i)!=0)
2826*53ee8cc1Swenshuai.xi     {
2827*53ee8cc1Swenshuai.xi         exif_buffer[i] = (MS_U8) JPEG_get_char();
2828*53ee8cc1Swenshuai.xi         i++;
2829*53ee8cc1Swenshuai.xi     }
2830*53ee8cc1Swenshuai.xi 
2831*53ee8cc1Swenshuai.xi     if(JPEG_DecodeMPOInfo(exif_buffer)==TRUE)
2832*53ee8cc1Swenshuai.xi     {
2833*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("FOUND MPO!\n");
2834*53ee8cc1Swenshuai.xi         bIsMPOFormat = TRUE;
2835*53ee8cc1Swenshuai.xi         u32MPFOffset = 0;           // Reset to zero after FOUND MPO
2836*53ee8cc1Swenshuai.xi 
2837*53ee8cc1Swenshuai.xi         //// TODO: MPO format not support thumbnail now....
2838*53ee8cc1Swenshuai.xi         //_u8DecodeType = E_JPEG_TYPE_MAIN;
2839*53ee8cc1Swenshuai.xi         //printf_red("NOTE: MPO not support thumbnail now!!!\n");
2840*53ee8cc1Swenshuai.xi     }
2841*53ee8cc1Swenshuai.xi     else
2842*53ee8cc1Swenshuai.xi     {
2843*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("NO MPO!\n");
2844*53ee8cc1Swenshuai.xi         // Not clear num_of_image for the image with 2 app2 marker
2845*53ee8cc1Swenshuai.xi         // _stMPOIndex.num_of_image = 0;
2846*53ee8cc1Swenshuai.xi     }
2847*53ee8cc1Swenshuai.xi     return TRUE;
2848*53ee8cc1Swenshuai.xi }
2849*53ee8cc1Swenshuai.xi 
2850*53ee8cc1Swenshuai.xi 
2851*53ee8cc1Swenshuai.xi #endif
2852*53ee8cc1Swenshuai.xi 
2853*53ee8cc1Swenshuai.xi // Read app14 info
JPEG_read_app14_marker(void)2854*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_read_app14_marker( void )
2855*53ee8cc1Swenshuai.xi {
2856*53ee8cc1Swenshuai.xi 
2857*53ee8cc1Swenshuai.xi     MS_U32 left;
2858*53ee8cc1Swenshuai.xi     MS_U8 u8Transform;
2859*53ee8cc1Swenshuai.xi 
2860*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("APP14\n");
2861*53ee8cc1Swenshuai.xi 
2862*53ee8cc1Swenshuai.xi     //Get APP14 length
2863*53ee8cc1Swenshuai.xi     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2864*53ee8cc1Swenshuai.xi 
2865*53ee8cc1Swenshuai.xi     left-= 2;
2866*53ee8cc1Swenshuai.xi 
2867*53ee8cc1Swenshuai.xi     if(left < 8)
2868*53ee8cc1Swenshuai.xi     {
2869*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_APP0_MARKER );
2870*53ee8cc1Swenshuai.xi         return FALSE;
2871*53ee8cc1Swenshuai.xi     }
2872*53ee8cc1Swenshuai.xi 
2873*53ee8cc1Swenshuai.xi     //Skip Block ID "Adobe"
2874*53ee8cc1Swenshuai.xi     JPEG_skip_bytes(5);
2875*53ee8cc1Swenshuai.xi 
2876*53ee8cc1Swenshuai.xi     left-= 5;
2877*53ee8cc1Swenshuai.xi 
2878*53ee8cc1Swenshuai.xi     //Skip Version Number
2879*53ee8cc1Swenshuai.xi     JPEG_skip_bytes(2);
2880*53ee8cc1Swenshuai.xi 
2881*53ee8cc1Swenshuai.xi     left-= 2;
2882*53ee8cc1Swenshuai.xi 
2883*53ee8cc1Swenshuai.xi     //Skip F0 Number
2884*53ee8cc1Swenshuai.xi     JPEG_skip_bytes(2);
2885*53ee8cc1Swenshuai.xi 
2886*53ee8cc1Swenshuai.xi     left-= 2;
2887*53ee8cc1Swenshuai.xi 
2888*53ee8cc1Swenshuai.xi     //Skip F1 Number
2889*53ee8cc1Swenshuai.xi     JPEG_skip_bytes(2);
2890*53ee8cc1Swenshuai.xi 
2891*53ee8cc1Swenshuai.xi     left-= 2;
2892*53ee8cc1Swenshuai.xi 
2893*53ee8cc1Swenshuai.xi     u8Transform=  JPEG_get_char();
2894*53ee8cc1Swenshuai.xi 
2895*53ee8cc1Swenshuai.xi     left-= 1;
2896*53ee8cc1Swenshuai.xi 
2897*53ee8cc1Swenshuai.xi     if(u8Transform!=1)
2898*53ee8cc1Swenshuai.xi     {
2899*53ee8cc1Swenshuai.xi         // 0: RGB or CMYK, depends on SOF
2900*53ee8cc1Swenshuai.xi         // 1: YCbCr
2901*53ee8cc1Swenshuai.xi         // 2: YCCK
2902*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("Unsupported Adobe Format with Transform=%d\n", u8Transform);
2903*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
2904*53ee8cc1Swenshuai.xi         return FALSE;
2905*53ee8cc1Swenshuai.xi     }
2906*53ee8cc1Swenshuai.xi 
2907*53ee8cc1Swenshuai.xi     if(left > 0)
2908*53ee8cc1Swenshuai.xi         JPEG_skip_bytes(left);
2909*53ee8cc1Swenshuai.xi 
2910*53ee8cc1Swenshuai.xi     return TRUE;
2911*53ee8cc1Swenshuai.xi }
2912*53ee8cc1Swenshuai.xi 
2913*53ee8cc1Swenshuai.xi /* END OF EXIF PARSING SECTION */
2914*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2915*53ee8cc1Swenshuai.xi // Read a Huffman code table.
JPEG_read_dht_marker(void)2916*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_dht_marker(void)
2917*53ee8cc1Swenshuai.xi {
2918*53ee8cc1Swenshuai.xi     MS_U16 i, index, count;
2919*53ee8cc1Swenshuai.xi     MS_U32 left;
2920*53ee8cc1Swenshuai.xi     MS_U8 u8Huff_num[17];
2921*53ee8cc1Swenshuai.xi     MS_U8 u8Huff_val[256];
2922*53ee8cc1Swenshuai.xi 
2923*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("DHT\n");
2924*53ee8cc1Swenshuai.xi 
2925*53ee8cc1Swenshuai.xi     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2926*53ee8cc1Swenshuai.xi 
2927*53ee8cc1Swenshuai.xi     if ( left < 2 )
2928*53ee8cc1Swenshuai.xi     {
2929*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_DHT_MARKER );
2930*53ee8cc1Swenshuai.xi         return FALSE;
2931*53ee8cc1Swenshuai.xi     }
2932*53ee8cc1Swenshuai.xi 
2933*53ee8cc1Swenshuai.xi     left -= 2;
2934*53ee8cc1Swenshuai.xi 
2935*53ee8cc1Swenshuai.xi     while ( left )
2936*53ee8cc1Swenshuai.xi     {
2937*53ee8cc1Swenshuai.xi         // set it to zero, initialize
2938*53ee8cc1Swenshuai.xi         JPEG_memset((void *)u8Huff_num, 0, 17);
2939*53ee8cc1Swenshuai.xi         JPEG_memset((void *)u8Huff_val, 0, 256);
2940*53ee8cc1Swenshuai.xi 
2941*53ee8cc1Swenshuai.xi         index = JPEG_get_char();
2942*53ee8cc1Swenshuai.xi 
2943*53ee8cc1Swenshuai.xi         u8Huff_num[0] = 0;
2944*53ee8cc1Swenshuai.xi 
2945*53ee8cc1Swenshuai.xi         count = 0;
2946*53ee8cc1Swenshuai.xi 
2947*53ee8cc1Swenshuai.xi         for ( i = 1; i <= 16; i++ )
2948*53ee8cc1Swenshuai.xi         {
2949*53ee8cc1Swenshuai.xi             u8Huff_num[i] = JPEG_get_char();
2950*53ee8cc1Swenshuai.xi             count += u8Huff_num[i];
2951*53ee8cc1Swenshuai.xi         }
2952*53ee8cc1Swenshuai.xi 
2953*53ee8cc1Swenshuai.xi         if ( count > 255 )
2954*53ee8cc1Swenshuai.xi         {
2955*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_BAD_DHT_COUNTS );
2956*53ee8cc1Swenshuai.xi             return FALSE;
2957*53ee8cc1Swenshuai.xi         }
2958*53ee8cc1Swenshuai.xi 
2959*53ee8cc1Swenshuai.xi         for ( i = 0; i < count; i++ )
2960*53ee8cc1Swenshuai.xi         {
2961*53ee8cc1Swenshuai.xi             u8Huff_val[i] = JPEG_get_char();
2962*53ee8cc1Swenshuai.xi         }
2963*53ee8cc1Swenshuai.xi 
2964*53ee8cc1Swenshuai.xi         i = 1 + 16 + count;
2965*53ee8cc1Swenshuai.xi 
2966*53ee8cc1Swenshuai.xi         if ( left < ( MS_U32 )i )
2967*53ee8cc1Swenshuai.xi         {
2968*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_BAD_DHT_MARKER );
2969*53ee8cc1Swenshuai.xi             return FALSE;
2970*53ee8cc1Swenshuai.xi         }
2971*53ee8cc1Swenshuai.xi 
2972*53ee8cc1Swenshuai.xi         left -= i;
2973*53ee8cc1Swenshuai.xi 
2974*53ee8cc1Swenshuai.xi         index = ( index & 0x0F ) + ( ( index & 0x10 ) >> 4 ) * ( JPEG_MAXHUFFTABLES >> 1 ); //???
2975*53ee8cc1Swenshuai.xi 
2976*53ee8cc1Swenshuai.xi         if ( index >= JPEG_MAXHUFFTABLES )
2977*53ee8cc1Swenshuai.xi         {
2978*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_BAD_DHT_INDEX );
2979*53ee8cc1Swenshuai.xi             return FALSE;
2980*53ee8cc1Swenshuai.xi         }
2981*53ee8cc1Swenshuai.xi 
2982*53ee8cc1Swenshuai.xi         if(_Huff_info[index].bValid==FALSE)
2983*53ee8cc1Swenshuai.xi             _Huff_info[index].bValid = TRUE;
2984*53ee8cc1Swenshuai.xi 
2985*53ee8cc1Swenshuai.xi         JPEG_memcpy( (void *)_Huff_info[index].u8Huff_num, (void *)u8Huff_num, 17 );
2986*53ee8cc1Swenshuai.xi         JPEG_memcpy( (void *)_Huff_info[index].u8Huff_val, (void *)u8Huff_val, 256 );
2987*53ee8cc1Swenshuai.xi 
2988*53ee8cc1Swenshuai.xi         // Compute the inverse order of HuffNum. this step is only needed in JPD mode (baseline)
2989*53ee8cc1Swenshuai.xi         for(i = 1; i<=16; i++)
2990*53ee8cc1Swenshuai.xi         {
2991*53ee8cc1Swenshuai.xi             if(u8Huff_num[17 - i]!=0)
2992*53ee8cc1Swenshuai.xi             {
2993*53ee8cc1Swenshuai.xi                 count = count - u8Huff_num[17 - i];
2994*53ee8cc1Swenshuai.xi                 u8Huff_num[17 - i] = count;
2995*53ee8cc1Swenshuai.xi             }
2996*53ee8cc1Swenshuai.xi             else
2997*53ee8cc1Swenshuai.xi                 u8Huff_num[17 - i] = 0xFF;
2998*53ee8cc1Swenshuai.xi         }
2999*53ee8cc1Swenshuai.xi         JPEG_memcpy( (void *)_Huff_info[index].u8Symbol, (void *)u8Huff_num, 17 );
3000*53ee8cc1Swenshuai.xi     }
3001*53ee8cc1Swenshuai.xi     return TRUE;
3002*53ee8cc1Swenshuai.xi }
3003*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3004*53ee8cc1Swenshuai.xi // Read a quantization table.
JPEG_read_dqt_marker(void)3005*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_dqt_marker(void)
3006*53ee8cc1Swenshuai.xi {
3007*53ee8cc1Swenshuai.xi     MS_U16 n, i, prec;
3008*53ee8cc1Swenshuai.xi     MS_U32 left;
3009*53ee8cc1Swenshuai.xi     MS_U32 temp;
3010*53ee8cc1Swenshuai.xi 
3011*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("DQT\n");
3012*53ee8cc1Swenshuai.xi 
3013*53ee8cc1Swenshuai.xi     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3014*53ee8cc1Swenshuai.xi 
3015*53ee8cc1Swenshuai.xi     if ( left < 2 )
3016*53ee8cc1Swenshuai.xi     {
3017*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_DQT_MARKER );
3018*53ee8cc1Swenshuai.xi         return FALSE;
3019*53ee8cc1Swenshuai.xi     }
3020*53ee8cc1Swenshuai.xi 
3021*53ee8cc1Swenshuai.xi     left -= 2;
3022*53ee8cc1Swenshuai.xi 
3023*53ee8cc1Swenshuai.xi     while ( left )
3024*53ee8cc1Swenshuai.xi     {
3025*53ee8cc1Swenshuai.xi         n = JPEG_get_char();
3026*53ee8cc1Swenshuai.xi         prec = n >> 4;
3027*53ee8cc1Swenshuai.xi         n &= 0x0F;
3028*53ee8cc1Swenshuai.xi 
3029*53ee8cc1Swenshuai.xi         if ( n >= JPEG_MAXQUANTTABLES )
3030*53ee8cc1Swenshuai.xi         {
3031*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_BAD_DQT_TABLE );
3032*53ee8cc1Swenshuai.xi             return FALSE;
3033*53ee8cc1Swenshuai.xi         }
3034*53ee8cc1Swenshuai.xi 
3035*53ee8cc1Swenshuai.xi         if(_QuantTables[n].bValid == FALSE)
3036*53ee8cc1Swenshuai.xi             _QuantTables[n].bValid = TRUE;
3037*53ee8cc1Swenshuai.xi 
3038*53ee8cc1Swenshuai.xi         // read quantization entries, in zag order
3039*53ee8cc1Swenshuai.xi         for ( i = 0; i < 64; i++ )
3040*53ee8cc1Swenshuai.xi         {
3041*53ee8cc1Swenshuai.xi             temp = JPEG_get_char();
3042*53ee8cc1Swenshuai.xi 
3043*53ee8cc1Swenshuai.xi             if ( prec )
3044*53ee8cc1Swenshuai.xi             {
3045*53ee8cc1Swenshuai.xi                 temp = ( temp << 8 ) + JPEG_get_char();
3046*53ee8cc1Swenshuai.xi             }
3047*53ee8cc1Swenshuai.xi 
3048*53ee8cc1Swenshuai.xi             _QuantTables[n].s16Value[i] = temp;
3049*53ee8cc1Swenshuai.xi         }
3050*53ee8cc1Swenshuai.xi 
3051*53ee8cc1Swenshuai.xi         i = 64 + 1;
3052*53ee8cc1Swenshuai.xi 
3053*53ee8cc1Swenshuai.xi         if ( prec )
3054*53ee8cc1Swenshuai.xi         {
3055*53ee8cc1Swenshuai.xi             i += 64;
3056*53ee8cc1Swenshuai.xi         }
3057*53ee8cc1Swenshuai.xi 
3058*53ee8cc1Swenshuai.xi         if ( left < ( MS_U32 )i )
3059*53ee8cc1Swenshuai.xi         {
3060*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_BAD_DQT_LENGTH );
3061*53ee8cc1Swenshuai.xi             return FALSE;
3062*53ee8cc1Swenshuai.xi         }
3063*53ee8cc1Swenshuai.xi 
3064*53ee8cc1Swenshuai.xi         left -= i;
3065*53ee8cc1Swenshuai.xi     }
3066*53ee8cc1Swenshuai.xi     return TRUE;
3067*53ee8cc1Swenshuai.xi }
3068*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3069*53ee8cc1Swenshuai.xi // Read the start of frame (SOF) marker.
JPEG_read_sof_marker(void)3070*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_sof_marker(void)
3071*53ee8cc1Swenshuai.xi {
3072*53ee8cc1Swenshuai.xi     MS_U8 i;
3073*53ee8cc1Swenshuai.xi     MS_U32 left;
3074*53ee8cc1Swenshuai.xi     MS_U16 JpegMaxWidth, JpegMaxHeight;
3075*53ee8cc1Swenshuai.xi     MS_U8 c1;
3076*53ee8cc1Swenshuai.xi 
3077*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("SOF\n");
3078*53ee8cc1Swenshuai.xi 
3079*53ee8cc1Swenshuai.xi     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3080*53ee8cc1Swenshuai.xi 
3081*53ee8cc1Swenshuai.xi     if ( JPEG_get_char() != 8 )   /* precision: sorry, only 8-bit precision is supported right now */
3082*53ee8cc1Swenshuai.xi     {
3083*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_PRECISION );
3084*53ee8cc1Swenshuai.xi         return FALSE;
3085*53ee8cc1Swenshuai.xi     }
3086*53ee8cc1Swenshuai.xi 
3087*53ee8cc1Swenshuai.xi     _u16Image_y_size = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3088*53ee8cc1Swenshuai.xi     _u16Image_x_size = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3089*53ee8cc1Swenshuai.xi 
3090*53ee8cc1Swenshuai.xi     // save the original image size
3091*53ee8cc1Swenshuai.xi     _u16OriginalImage_x_size = _u16Image_x_size;
3092*53ee8cc1Swenshuai.xi     _u16OriginalImage_y_size = _u16Image_y_size;
3093*53ee8cc1Swenshuai.xi 
3094*53ee8cc1Swenshuai.xi     if((_bProgressive_flag)
3095*53ee8cc1Swenshuai.xi     && (E_JPEG_TYPE_MAIN == _u8DecodeType))
3096*53ee8cc1Swenshuai.xi     {
3097*53ee8cc1Swenshuai.xi        //Define MAX picture size for progressive, 8 is the max factor of scale down
3098*53ee8cc1Swenshuai.xi         JpegMaxWidth  = JPEG_PRO_MAX_WIDTH * 8;
3099*53ee8cc1Swenshuai.xi         JpegMaxHeight = JPEG_PRO_MAX_HEIGHT * 8;
3100*53ee8cc1Swenshuai.xi 
3101*53ee8cc1Swenshuai.xi         //Calculate Internal Buffer size
3102*53ee8cc1Swenshuai.xi         //check needed buffer for progressive jpeg decoding, for worst case:
3103*53ee8cc1Swenshuai.xi         MS_U32 buff_size = _u16Image_x_size*_u16Image_y_size*3*2
3104*53ee8cc1Swenshuai.xi                          + _u16Image_x_size*_u16Image_y_size*3*2/64
3105*53ee8cc1Swenshuai.xi                          + JPEG_DEFAULT_EXIF_SIZE
3106*53ee8cc1Swenshuai.xi                          + 8*1024;
3107*53ee8cc1Swenshuai.xi //        if( (MS_U32)(_u16Image_x_size*_u16Image_y_size*3*2) > (MS_U32)(INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE) )
3108*53ee8cc1Swenshuai.xi         if( buff_size > INTERNAL_BUFFER_SIZE )
3109*53ee8cc1Swenshuai.xi         {
3110*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Progressive image size too big... do not handle it\n");
3111*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_NOTENOUGHMEM );
3112*53ee8cc1Swenshuai.xi             return FALSE;
3113*53ee8cc1Swenshuai.xi         }
3114*53ee8cc1Swenshuai.xi     }
3115*53ee8cc1Swenshuai.xi     else
3116*53ee8cc1Swenshuai.xi     {
3117*53ee8cc1Swenshuai.xi         //Define MAX picture size for Baseline, 8 is the max factor of scale down
3118*53ee8cc1Swenshuai.xi         JpegMaxWidth  = JPEG_MAX_WIDTH*8;
3119*53ee8cc1Swenshuai.xi         JpegMaxHeight = JPEG_MAX_HEIGHT*8;
3120*53ee8cc1Swenshuai.xi     }
3121*53ee8cc1Swenshuai.xi 
3122*53ee8cc1Swenshuai.xi     if ((_u16Image_y_size < 1) || (_u16Image_y_size > JpegMaxHeight))
3123*53ee8cc1Swenshuai.xi     {
3124*53ee8cc1Swenshuai.xi         JPEG_terminate(E_JPEG_BAD_HEIGHT);
3125*53ee8cc1Swenshuai.xi         return FALSE;
3126*53ee8cc1Swenshuai.xi     }
3127*53ee8cc1Swenshuai.xi 
3128*53ee8cc1Swenshuai.xi     if ((_u16Image_x_size < 1) || (_u16Image_x_size > JpegMaxWidth))
3129*53ee8cc1Swenshuai.xi     {
3130*53ee8cc1Swenshuai.xi         JPEG_terminate(E_JPEG_BAD_WIDTH);
3131*53ee8cc1Swenshuai.xi         return FALSE;
3132*53ee8cc1Swenshuai.xi     }
3133*53ee8cc1Swenshuai.xi 
3134*53ee8cc1Swenshuai.xi     _u8Comps_in_frame = JPEG_get_char();
3135*53ee8cc1Swenshuai.xi 
3136*53ee8cc1Swenshuai.xi     if ( _u8Comps_in_frame > JPEG_MAXCOMPONENTS )
3137*53ee8cc1Swenshuai.xi     {
3138*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_TOO_MANY_COMPONENTS );
3139*53ee8cc1Swenshuai.xi         return FALSE;
3140*53ee8cc1Swenshuai.xi     }
3141*53ee8cc1Swenshuai.xi 
3142*53ee8cc1Swenshuai.xi     if ( left != ( MS_U32 )( _u8Comps_in_frame * 3 + 8 ) )
3143*53ee8cc1Swenshuai.xi     {
3144*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_SOF_LENGTH );
3145*53ee8cc1Swenshuai.xi         return FALSE;
3146*53ee8cc1Swenshuai.xi     }
3147*53ee8cc1Swenshuai.xi 
3148*53ee8cc1Swenshuai.xi     for ( i = 0; i < _u8Comps_in_frame; i++ )
3149*53ee8cc1Swenshuai.xi     {
3150*53ee8cc1Swenshuai.xi         _u8Comp_ident[i] = JPEG_get_char();
3151*53ee8cc1Swenshuai.xi         if(_u8Comp_ident[i]==0)     // The component ID is start from 0 (0 1 2). The normal case is start from 1 (1 2 3) for YUV
3152*53ee8cc1Swenshuai.xi         {
3153*53ee8cc1Swenshuai.xi             _u8LumaCi = 0;
3154*53ee8cc1Swenshuai.xi             _u8ChromaCi = 1;
3155*53ee8cc1Swenshuai.xi             _u8Chroma2Ci = 2;
3156*53ee8cc1Swenshuai.xi         }
3157*53ee8cc1Swenshuai.xi 
3158*53ee8cc1Swenshuai.xi         c1 = JPEG_get_char();
3159*53ee8cc1Swenshuai.xi 
3160*53ee8cc1Swenshuai.xi         _u8Comp_h_samp[i] = (c1 & 0xf0)>>4;
3161*53ee8cc1Swenshuai.xi         _u8Comp_v_samp[i] = (c1 & 0x0f);
3162*53ee8cc1Swenshuai.xi         _u8Comp_quant[i] = JPEG_get_char();
3163*53ee8cc1Swenshuai.xi 
3164*53ee8cc1Swenshuai.xi         // patch from LG driver for the file with the following problem:
3165*53ee8cc1Swenshuai.xi         // only has one component, but its sampling factor is 1x2
3166*53ee8cc1Swenshuai.xi         // Per the JPEG spec A.2.2 (see the attached file, "regardless of the values of H1 and V1"),
3167*53ee8cc1Swenshuai.xi         // please always set H=1 & V=1 to hw, when mono image.
3168*53ee8cc1Swenshuai.xi         if(_u8Comps_in_frame==1)    //allen.chang 2011/6/16 patch
3169*53ee8cc1Swenshuai.xi         {
3170*53ee8cc1Swenshuai.xi             _u8Comp_h_samp[0] =1;
3171*53ee8cc1Swenshuai.xi             _u8Comp_v_samp[0] =1;
3172*53ee8cc1Swenshuai.xi         }
3173*53ee8cc1Swenshuai.xi 
3174*53ee8cc1Swenshuai.xi     }
3175*53ee8cc1Swenshuai.xi     return TRUE;
3176*53ee8cc1Swenshuai.xi }
3177*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3178*53ee8cc1Swenshuai.xi // Used to skip unrecognized markers.
JPEG_skip_variable_marker(void)3179*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_skip_variable_marker(void)
3180*53ee8cc1Swenshuai.xi {
3181*53ee8cc1Swenshuai.xi     MS_U32 left;
3182*53ee8cc1Swenshuai.xi 
3183*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("SKIP markers\n");
3184*53ee8cc1Swenshuai.xi 
3185*53ee8cc1Swenshuai.xi     left = (MS_U32)((JPEG_get_char()<<8)|JPEG_get_char());
3186*53ee8cc1Swenshuai.xi 
3187*53ee8cc1Swenshuai.xi     if ( left < 2 )
3188*53ee8cc1Swenshuai.xi     {
3189*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_VARIABLE_MARKER );
3190*53ee8cc1Swenshuai.xi         return FALSE;
3191*53ee8cc1Swenshuai.xi     }
3192*53ee8cc1Swenshuai.xi 
3193*53ee8cc1Swenshuai.xi     left -= 2;
3194*53ee8cc1Swenshuai.xi 
3195*53ee8cc1Swenshuai.xi     JPEG_skip_bytes(left);
3196*53ee8cc1Swenshuai.xi     return TRUE;
3197*53ee8cc1Swenshuai.xi }
3198*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3199*53ee8cc1Swenshuai.xi // Read a define restart interval (DRI) marker.
JPEG_read_dri_marker(void)3200*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_dri_marker(void)
3201*53ee8cc1Swenshuai.xi {
3202*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("DRI\n");
3203*53ee8cc1Swenshuai.xi 
3204*53ee8cc1Swenshuai.xi     if ( (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char()) != 4 )
3205*53ee8cc1Swenshuai.xi     {
3206*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_DRI_LENGTH );
3207*53ee8cc1Swenshuai.xi         return FALSE;
3208*53ee8cc1Swenshuai.xi     }
3209*53ee8cc1Swenshuai.xi 
3210*53ee8cc1Swenshuai.xi     _u16Restart_interval = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3211*53ee8cc1Swenshuai.xi     return TRUE;
3212*53ee8cc1Swenshuai.xi }
3213*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3214*53ee8cc1Swenshuai.xi // Read a start of scan (SOS) marker.
JPEG_read_sos_marker(void)3215*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_sos_marker(void)
3216*53ee8cc1Swenshuai.xi {
3217*53ee8cc1Swenshuai.xi     MS_U32 left;
3218*53ee8cc1Swenshuai.xi     MS_U16 i, ci, n, c, cc;
3219*53ee8cc1Swenshuai.xi     MS_U8 c1;
3220*53ee8cc1Swenshuai.xi 
3221*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("SOS\n");
3222*53ee8cc1Swenshuai.xi 
3223*53ee8cc1Swenshuai.xi     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3224*53ee8cc1Swenshuai.xi 
3225*53ee8cc1Swenshuai.xi     n = JPEG_get_char();
3226*53ee8cc1Swenshuai.xi 
3227*53ee8cc1Swenshuai.xi     _u8Comps_in_scan = n;
3228*53ee8cc1Swenshuai.xi 
3229*53ee8cc1Swenshuai.xi     left -= 3;
3230*53ee8cc1Swenshuai.xi 
3231*53ee8cc1Swenshuai.xi     if ( ( left != ( MS_U32 )( n * 2 + 3 ) ) || ( n < 1 ) || ( n > JPEG_MAXCOMPSINSCAN ) )
3232*53ee8cc1Swenshuai.xi     {
3233*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_SOS_LENGTH );
3234*53ee8cc1Swenshuai.xi         return FALSE;
3235*53ee8cc1Swenshuai.xi     }
3236*53ee8cc1Swenshuai.xi 
3237*53ee8cc1Swenshuai.xi     for ( i = 0; i < n; i++ )
3238*53ee8cc1Swenshuai.xi     {
3239*53ee8cc1Swenshuai.xi         cc = JPEG_get_char();
3240*53ee8cc1Swenshuai.xi         c = JPEG_get_char();
3241*53ee8cc1Swenshuai.xi         left -= 2;
3242*53ee8cc1Swenshuai.xi 
3243*53ee8cc1Swenshuai.xi         for ( ci = 0; ci < _u8Comps_in_frame; ci++ )
3244*53ee8cc1Swenshuai.xi         {
3245*53ee8cc1Swenshuai.xi             if ( cc == _u8Comp_ident[ci] )
3246*53ee8cc1Swenshuai.xi             {
3247*53ee8cc1Swenshuai.xi                 break;
3248*53ee8cc1Swenshuai.xi             }
3249*53ee8cc1Swenshuai.xi         }
3250*53ee8cc1Swenshuai.xi 
3251*53ee8cc1Swenshuai.xi         if ( ci >= _u8Comps_in_frame )
3252*53ee8cc1Swenshuai.xi         {
3253*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_BAD_SOS_COMP_ID );
3254*53ee8cc1Swenshuai.xi             return FALSE;
3255*53ee8cc1Swenshuai.xi         }
3256*53ee8cc1Swenshuai.xi 
3257*53ee8cc1Swenshuai.xi         _u8Comp_list[i] = ci;
3258*53ee8cc1Swenshuai.xi         _u8Comp_dc_tab[ci] = ( c >> 4 ) & 15;
3259*53ee8cc1Swenshuai.xi         _u8Comp_ac_tab[ci] = ( c & 15 ) + ( JPEG_MAXHUFFTABLES >> 1 );
3260*53ee8cc1Swenshuai.xi     }
3261*53ee8cc1Swenshuai.xi 
3262*53ee8cc1Swenshuai.xi #ifndef CMODEL
3263*53ee8cc1Swenshuai.xi     //HW limitation, for baseline JPEG, U.V need to refer to the same DC and AC huffman table.
3264*53ee8cc1Swenshuai.xi     if(!_bProgressive_flag && (_u8Comps_in_frame == 3)) //Y.U.V.
3265*53ee8cc1Swenshuai.xi     {
3266*53ee8cc1Swenshuai.xi         if((_u8Comp_dc_tab[1] != _u8Comp_dc_tab[2])
3267*53ee8cc1Swenshuai.xi         || (_u8Comp_ac_tab[1] != _u8Comp_ac_tab[2]))
3268*53ee8cc1Swenshuai.xi         {
3269*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
3270*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("U, V use different Huffman table~~\n");
3271*53ee8cc1Swenshuai.xi             bIs3HuffTbl = TRUE;
3272*53ee8cc1Swenshuai.xi #else
3273*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_UNSUPPORTED_HUFF_DECODE );
3274*53ee8cc1Swenshuai.xi             return FALSE;
3275*53ee8cc1Swenshuai.xi #endif
3276*53ee8cc1Swenshuai.xi         }
3277*53ee8cc1Swenshuai.xi     }
3278*53ee8cc1Swenshuai.xi #endif
3279*53ee8cc1Swenshuai.xi 
3280*53ee8cc1Swenshuai.xi     _u8Spectral_start = JPEG_get_char();
3281*53ee8cc1Swenshuai.xi     _u8Spectral_end = JPEG_get_char();
3282*53ee8cc1Swenshuai.xi     c1 = JPEG_get_char();
3283*53ee8cc1Swenshuai.xi     _u8Successive_high = (c1 & 0xf0)>>4;
3284*53ee8cc1Swenshuai.xi     _u8Successive_low = (c1 & 0x0f);
3285*53ee8cc1Swenshuai.xi 
3286*53ee8cc1Swenshuai.xi     if ( !_bProgressive_flag )
3287*53ee8cc1Swenshuai.xi     {
3288*53ee8cc1Swenshuai.xi         _u8Spectral_start = 0;
3289*53ee8cc1Swenshuai.xi         _u8Spectral_end = 63;
3290*53ee8cc1Swenshuai.xi     }
3291*53ee8cc1Swenshuai.xi 
3292*53ee8cc1Swenshuai.xi     left -= 3;
3293*53ee8cc1Swenshuai.xi 
3294*53ee8cc1Swenshuai.xi     JPEG_skip_bytes(left);    /* read past whatever is left */
3295*53ee8cc1Swenshuai.xi     return TRUE;
3296*53ee8cc1Swenshuai.xi }
3297*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3298*53ee8cc1Swenshuai.xi // Finds the next marker.
JPEG_next_marker(void)3299*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_next_marker(void) //ok
3300*53ee8cc1Swenshuai.xi {
3301*53ee8cc1Swenshuai.xi     MS_U32 c, bytes;
3302*53ee8cc1Swenshuai.xi 
3303*53ee8cc1Swenshuai.xi     bytes = 0;
3304*53ee8cc1Swenshuai.xi 
3305*53ee8cc1Swenshuai.xi     do
3306*53ee8cc1Swenshuai.xi     {
3307*53ee8cc1Swenshuai.xi         do
3308*53ee8cc1Swenshuai.xi         {
3309*53ee8cc1Swenshuai.xi             bytes++;
3310*53ee8cc1Swenshuai.xi 
3311*53ee8cc1Swenshuai.xi             c = JPEG_get_char();
3312*53ee8cc1Swenshuai.xi             //JPEG_DEBUG_API_MSG("c = %X\n",c);
3313*53ee8cc1Swenshuai.xi         }
3314*53ee8cc1Swenshuai.xi         while ( c != 0xFF );
3315*53ee8cc1Swenshuai.xi 
3316*53ee8cc1Swenshuai.xi         do
3317*53ee8cc1Swenshuai.xi         {
3318*53ee8cc1Swenshuai.xi             c = JPEG_get_char();
3319*53ee8cc1Swenshuai.xi             //JPEG_DEBUG_API_MSG("c = %X\n",c);
3320*53ee8cc1Swenshuai.xi         }
3321*53ee8cc1Swenshuai.xi         while ( c == 0xFF );
3322*53ee8cc1Swenshuai.xi     }
3323*53ee8cc1Swenshuai.xi     while ( c == 0 );
3324*53ee8cc1Swenshuai.xi 
3325*53ee8cc1Swenshuai.xi     // If bytes > 0 here, there where extra bytes before the marker (not good).
3326*53ee8cc1Swenshuai.xi 
3327*53ee8cc1Swenshuai.xi     return c;
3328*53ee8cc1Swenshuai.xi }
3329*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3330*53ee8cc1Swenshuai.xi // Process markers. Returns when an SOFx, SOI, EOI, or SOS marker is
3331*53ee8cc1Swenshuai.xi // encountered.
JPEG_process_markers(void)3332*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_process_markers(void)
3333*53ee8cc1Swenshuai.xi {
3334*53ee8cc1Swenshuai.xi     MS_U32 c;
3335*53ee8cc1Swenshuai.xi 
3336*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG_process_markers:\n");
3337*53ee8cc1Swenshuai.xi     for ( ; ; )
3338*53ee8cc1Swenshuai.xi     {
3339*53ee8cc1Swenshuai.xi         c = JPEG_next_marker();
3340*53ee8cc1Swenshuai.xi 
3341*53ee8cc1Swenshuai.xi         switch ( c )
3342*53ee8cc1Swenshuai.xi         {
3343*53ee8cc1Swenshuai.xi             case E_JPEG_APP1:
3344*53ee8cc1Swenshuai.xi                 // Prevent from there's thumbnail in thumbnail... & multiple APP1
3345*53ee8cc1Swenshuai.xi                 // Although it's impossible.. =_=
3346*53ee8cc1Swenshuai.xi //                if((E_JPEG_TYPE_THUMBNAIL == _u8DecodeType)
3347*53ee8cc1Swenshuai.xi //                && (FALSE == _bThumbnailFound))
3348*53ee8cc1Swenshuai.xi                 // We need to get EXIF info for decoding main picture or thumbnail.
3349*53ee8cc1Swenshuai.xi                 if((__bIsMjpeg == FALSE)
3350*53ee8cc1Swenshuai.xi                 && (FALSE == _bThumbnailFound))
3351*53ee8cc1Swenshuai.xi                 {
3352*53ee8cc1Swenshuai.xi                     if( !JPEG_read_app1_marker() )
3353*53ee8cc1Swenshuai.xi                         return FALSE;
3354*53ee8cc1Swenshuai.xi                 }
3355*53ee8cc1Swenshuai.xi                 else
3356*53ee8cc1Swenshuai.xi                 {
3357*53ee8cc1Swenshuai.xi                     if( !JPEG_skip_variable_marker() )
3358*53ee8cc1Swenshuai.xi                         return FALSE;
3359*53ee8cc1Swenshuai.xi                 }
3360*53ee8cc1Swenshuai.xi                 break;
3361*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
3362*53ee8cc1Swenshuai.xi             case E_JPEG_APP2:
3363*53ee8cc1Swenshuai.xi                 if( !JPEG_read_app2_marker() )
3364*53ee8cc1Swenshuai.xi                     return FALSE;
3365*53ee8cc1Swenshuai.xi                 break;
3366*53ee8cc1Swenshuai.xi 
3367*53ee8cc1Swenshuai.xi #endif
3368*53ee8cc1Swenshuai.xi             case E_JPEG_SOF0:
3369*53ee8cc1Swenshuai.xi             case E_JPEG_SOF1:
3370*53ee8cc1Swenshuai.xi             case E_JPEG_SOF2:
3371*53ee8cc1Swenshuai.xi             case E_JPEG_SOF3:
3372*53ee8cc1Swenshuai.xi             case E_JPEG_SOF5:
3373*53ee8cc1Swenshuai.xi             case E_JPEG_SOF6:
3374*53ee8cc1Swenshuai.xi             case E_JPEG_SOF7:
3375*53ee8cc1Swenshuai.xi                 //      case E_JPEG_JPG:
3376*53ee8cc1Swenshuai.xi             case E_JPEG_SOF9:
3377*53ee8cc1Swenshuai.xi             case E_JPEG_SOF10:
3378*53ee8cc1Swenshuai.xi             case E_JPEG_SOF11:
3379*53ee8cc1Swenshuai.xi             case E_JPEG_SOF13:
3380*53ee8cc1Swenshuai.xi             case E_JPEG_SOF14:
3381*53ee8cc1Swenshuai.xi             case E_JPEG_SOF15:
3382*53ee8cc1Swenshuai.xi             case E_JPEG_SOI:
3383*53ee8cc1Swenshuai.xi             case E_JPEG_EOI:
3384*53ee8cc1Swenshuai.xi             case E_JPEG_SOS:
3385*53ee8cc1Swenshuai.xi                 {
3386*53ee8cc1Swenshuai.xi                     return c;
3387*53ee8cc1Swenshuai.xi                 }
3388*53ee8cc1Swenshuai.xi             case E_JPEG_DHT:
3389*53ee8cc1Swenshuai.xi                 {
3390*53ee8cc1Swenshuai.xi                     if( !JPEG_read_dht_marker() )
3391*53ee8cc1Swenshuai.xi                         return FALSE;
3392*53ee8cc1Swenshuai.xi                     _HeadCheck.DHT = TRUE;
3393*53ee8cc1Swenshuai.xi                     break;
3394*53ee8cc1Swenshuai.xi                 }
3395*53ee8cc1Swenshuai.xi                 // Sorry, no arithmitic support at this time. Dumb patents!
3396*53ee8cc1Swenshuai.xi             case E_JPEG_DAC:
3397*53ee8cc1Swenshuai.xi                 {
3398*53ee8cc1Swenshuai.xi                     JPEG_terminate( E_JPEG_NO_ARITHMETIC_SUPPORT );
3399*53ee8cc1Swenshuai.xi                     return FALSE;
3400*53ee8cc1Swenshuai.xi                     break;
3401*53ee8cc1Swenshuai.xi                 }
3402*53ee8cc1Swenshuai.xi             case E_JPEG_DQT:
3403*53ee8cc1Swenshuai.xi                 {
3404*53ee8cc1Swenshuai.xi                     if( !JPEG_read_dqt_marker() )
3405*53ee8cc1Swenshuai.xi                         return FALSE;
3406*53ee8cc1Swenshuai.xi                     _HeadCheck.DQT = TRUE;
3407*53ee8cc1Swenshuai.xi                     break;
3408*53ee8cc1Swenshuai.xi                 }
3409*53ee8cc1Swenshuai.xi             case E_JPEG_DRI:
3410*53ee8cc1Swenshuai.xi                 {
3411*53ee8cc1Swenshuai.xi                     if( !JPEG_read_dri_marker() )
3412*53ee8cc1Swenshuai.xi                         return FALSE;
3413*53ee8cc1Swenshuai.xi                     break;
3414*53ee8cc1Swenshuai.xi                 }
3415*53ee8cc1Swenshuai.xi                 //case E_JPEG_APP0:  /* no need to read the JFIF marker */
3416*53ee8cc1Swenshuai.xi 
3417*53ee8cc1Swenshuai.xi             case E_JPEG_JPG:
3418*53ee8cc1Swenshuai.xi             case E_JPEG_RST0:
3419*53ee8cc1Swenshuai.xi                 /* no parameters */
3420*53ee8cc1Swenshuai.xi             case E_JPEG_RST1:
3421*53ee8cc1Swenshuai.xi             case E_JPEG_RST2:
3422*53ee8cc1Swenshuai.xi             case E_JPEG_RST3:
3423*53ee8cc1Swenshuai.xi             case E_JPEG_RST4:
3424*53ee8cc1Swenshuai.xi             case E_JPEG_RST5:
3425*53ee8cc1Swenshuai.xi             case E_JPEG_RST6:
3426*53ee8cc1Swenshuai.xi             case E_JPEG_RST7:
3427*53ee8cc1Swenshuai.xi             case E_JPEG_TEM:
3428*53ee8cc1Swenshuai.xi                 {
3429*53ee8cc1Swenshuai.xi                     JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
3430*53ee8cc1Swenshuai.xi                     return FALSE;
3431*53ee8cc1Swenshuai.xi                     break;
3432*53ee8cc1Swenshuai.xi                 }
3433*53ee8cc1Swenshuai.xi             case E_JPEG_APP0:
3434*53ee8cc1Swenshuai.xi                 if (!bMHEG5)
3435*53ee8cc1Swenshuai.xi                 {
3436*53ee8cc1Swenshuai.xi                     if(!JPEG_skip_variable_marker())
3437*53ee8cc1Swenshuai.xi                     {
3438*53ee8cc1Swenshuai.xi                         return FALSE;
3439*53ee8cc1Swenshuai.xi                     }
3440*53ee8cc1Swenshuai.xi                     break;
3441*53ee8cc1Swenshuai.xi                 }
3442*53ee8cc1Swenshuai.xi                 if(!JPEG_read_app0_marker())
3443*53ee8cc1Swenshuai.xi                 {
3444*53ee8cc1Swenshuai.xi                     return FALSE;
3445*53ee8cc1Swenshuai.xi                 }
3446*53ee8cc1Swenshuai.xi                 break;
3447*53ee8cc1Swenshuai.xi             case E_JPEG_APP14:
3448*53ee8cc1Swenshuai.xi                 if(__bIsMjpeg == FALSE)
3449*53ee8cc1Swenshuai.xi                 {
3450*53ee8cc1Swenshuai.xi                     if( !JPEG_read_app14_marker() )
3451*53ee8cc1Swenshuai.xi                         return FALSE;
3452*53ee8cc1Swenshuai.xi                 }
3453*53ee8cc1Swenshuai.xi                 else
3454*53ee8cc1Swenshuai.xi                 {
3455*53ee8cc1Swenshuai.xi                     if( !JPEG_skip_variable_marker() )
3456*53ee8cc1Swenshuai.xi                         return FALSE;
3457*53ee8cc1Swenshuai.xi                 }
3458*53ee8cc1Swenshuai.xi                 break;
3459*53ee8cc1Swenshuai.xi             case E_JPEG_DNL:
3460*53ee8cc1Swenshuai.xi             case E_JPEG_DHP:
3461*53ee8cc1Swenshuai.xi             case E_JPEG_EXP:
3462*53ee8cc1Swenshuai.xi #if (SUPPORT_MPO_FORMAT == 0)
3463*53ee8cc1Swenshuai.xi             case E_JPEG_APP2:
3464*53ee8cc1Swenshuai.xi #endif
3465*53ee8cc1Swenshuai.xi             case E_JPEG_APP3:
3466*53ee8cc1Swenshuai.xi             case E_JPEG_APP4:
3467*53ee8cc1Swenshuai.xi             case E_JPEG_APP5:
3468*53ee8cc1Swenshuai.xi             case E_JPEG_APP6:
3469*53ee8cc1Swenshuai.xi             case E_JPEG_APP7:
3470*53ee8cc1Swenshuai.xi             case E_JPEG_APP8:
3471*53ee8cc1Swenshuai.xi             case E_JPEG_APP9:
3472*53ee8cc1Swenshuai.xi             case E_JPEG_APP10:
3473*53ee8cc1Swenshuai.xi             case E_JPEG_APP11:
3474*53ee8cc1Swenshuai.xi             case E_JPEG_APP12:
3475*53ee8cc1Swenshuai.xi             case E_JPEG_APP13:
3476*53ee8cc1Swenshuai.xi             case E_JPEG_APP15:
3477*53ee8cc1Swenshuai.xi             case E_JPEG_JPG0:
3478*53ee8cc1Swenshuai.xi             case E_JPEG_JPG1:
3479*53ee8cc1Swenshuai.xi             case E_JPEG_JPG2:
3480*53ee8cc1Swenshuai.xi             case E_JPEG_JPG3:
3481*53ee8cc1Swenshuai.xi             case E_JPEG_JPG4:
3482*53ee8cc1Swenshuai.xi             case E_JPEG_JPG5:
3483*53ee8cc1Swenshuai.xi             case E_JPEG_JPG6:
3484*53ee8cc1Swenshuai.xi             case E_JPEG_JPG7:
3485*53ee8cc1Swenshuai.xi             case E_JPEG_JPG8:
3486*53ee8cc1Swenshuai.xi             case E_JPEG_JPG9:
3487*53ee8cc1Swenshuai.xi             case E_JPEG_JPG10:
3488*53ee8cc1Swenshuai.xi             case E_JPEG_JPG11:
3489*53ee8cc1Swenshuai.xi             case E_JPEG_JPG12:
3490*53ee8cc1Swenshuai.xi             case E_JPEG_JPG13:
3491*53ee8cc1Swenshuai.xi             case E_JPEG_COM:
3492*53ee8cc1Swenshuai.xi                 /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */
3493*53ee8cc1Swenshuai.xi                 {
3494*53ee8cc1Swenshuai.xi                     if(!JPEG_skip_variable_marker())
3495*53ee8cc1Swenshuai.xi                     {
3496*53ee8cc1Swenshuai.xi                         return FALSE;
3497*53ee8cc1Swenshuai.xi                     }
3498*53ee8cc1Swenshuai.xi                     break;
3499*53ee8cc1Swenshuai.xi                 }
3500*53ee8cc1Swenshuai.xi             default:
3501*53ee8cc1Swenshuai.xi                 break;
3502*53ee8cc1Swenshuai.xi         }
3503*53ee8cc1Swenshuai.xi     }
3504*53ee8cc1Swenshuai.xi     return TRUE;
3505*53ee8cc1Swenshuai.xi }
3506*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3507*53ee8cc1Swenshuai.xi // Finds the start of image (SOI) marker.
3508*53ee8cc1Swenshuai.xi // This code is rather defensive: it only checks the first 512 bytes to avoid
3509*53ee8cc1Swenshuai.xi // false positives.
JPEG_locate_soi_marker(void)3510*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_locate_soi_marker(void)
3511*53ee8cc1Swenshuai.xi {
3512*53ee8cc1Swenshuai.xi     MS_U32 lastchar, thischar;
3513*53ee8cc1Swenshuai.xi     MS_U32 bytesleft;
3514*53ee8cc1Swenshuai.xi 
3515*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
3516*53ee8cc1Swenshuai.xi 
3517*53ee8cc1Swenshuai.xi     lastchar = JPEG_get_char();
3518*53ee8cc1Swenshuai.xi 
3519*53ee8cc1Swenshuai.xi     //JPEG_DEBUG_API_MSG("0x%lx\n", lastchar);
3520*53ee8cc1Swenshuai.xi     thischar = JPEG_get_char();
3521*53ee8cc1Swenshuai.xi 
3522*53ee8cc1Swenshuai.xi     //JPEG_DEBUG_API_MSG("0x%lx\n", thischar);
3523*53ee8cc1Swenshuai.xi     /* ok if it's a normal JPEG file without a special header */
3524*53ee8cc1Swenshuai.xi 
3525*53ee8cc1Swenshuai.xi     if ((0xFF == lastchar)
3526*53ee8cc1Swenshuai.xi     && (E_JPEG_SOI == thischar))
3527*53ee8cc1Swenshuai.xi     {
3528*53ee8cc1Swenshuai.xi         //JPEG_DEBUG_API_MSG("SOI\n");
3529*53ee8cc1Swenshuai.xi         return TRUE;
3530*53ee8cc1Swenshuai.xi     }
3531*53ee8cc1Swenshuai.xi 
3532*53ee8cc1Swenshuai.xi     // Set this value to 0x1000 for 4k alignment MPO case when parse 2nd/3rd/... JPEG file
3533*53ee8cc1Swenshuai.xi     bytesleft = 0x1000; //Fix this number from 512 -> 640 for some cases
3534*53ee8cc1Swenshuai.xi 
3535*53ee8cc1Swenshuai.xi     for ( ; ; )
3536*53ee8cc1Swenshuai.xi     {
3537*53ee8cc1Swenshuai.xi         if ( --bytesleft == 0 )
3538*53ee8cc1Swenshuai.xi         {
3539*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_NOT_JPEG );
3540*53ee8cc1Swenshuai.xi             return FALSE;
3541*53ee8cc1Swenshuai.xi         }
3542*53ee8cc1Swenshuai.xi 
3543*53ee8cc1Swenshuai.xi         lastchar = thischar;
3544*53ee8cc1Swenshuai.xi 
3545*53ee8cc1Swenshuai.xi         thischar = JPEG_get_char();
3546*53ee8cc1Swenshuai.xi 
3547*53ee8cc1Swenshuai.xi         //JPEG_DEBUG_API_MSG("%x ", (MS_U8)thischar);
3548*53ee8cc1Swenshuai.xi         //if(bytesleft%8==0)
3549*53ee8cc1Swenshuai.xi         //    JPEG_DEBUG_API_MSG("\n");
3550*53ee8cc1Swenshuai.xi 
3551*53ee8cc1Swenshuai.xi         if ((0xFF == lastchar)
3552*53ee8cc1Swenshuai.xi         && (E_JPEG_SOI == thischar))
3553*53ee8cc1Swenshuai.xi         {
3554*53ee8cc1Swenshuai.xi             //JPEG_DEBUG_API_MSG("SOI\n");
3555*53ee8cc1Swenshuai.xi             break;
3556*53ee8cc1Swenshuai.xi         }
3557*53ee8cc1Swenshuai.xi     }
3558*53ee8cc1Swenshuai.xi 
3559*53ee8cc1Swenshuai.xi     /* Check the next character after marker: if it's not 0xFF, it can't
3560*53ee8cc1Swenshuai.xi        be the start of the next marker, so it probably isn't a JPEG */
3561*53ee8cc1Swenshuai.xi /*  need to check for more detail, currently _u32Bit_buf is not updated during JPEG_get_char()
3562*53ee8cc1Swenshuai.xi     thischar = ( _u32Bit_buf >> 8 ) & 0xFF;
3563*53ee8cc1Swenshuai.xi 
3564*53ee8cc1Swenshuai.xi     if ( thischar != 0xFF )
3565*53ee8cc1Swenshuai.xi     {
3566*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_NOT_JPEG );
3567*53ee8cc1Swenshuai.xi         return FALSE;
3568*53ee8cc1Swenshuai.xi     }
3569*53ee8cc1Swenshuai.xi */
3570*53ee8cc1Swenshuai.xi     return TRUE;
3571*53ee8cc1Swenshuai.xi }
3572*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3573*53ee8cc1Swenshuai.xi // Find a start of frame (SOF) marker.
JPEG_locate_sof_marker(void)3574*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_locate_sof_marker(void)
3575*53ee8cc1Swenshuai.xi {
3576*53ee8cc1Swenshuai.xi     MS_U32 c;
3577*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
3578*53ee8cc1Swenshuai.xi 
3579*53ee8cc1Swenshuai.xi     if(!JPEG_locate_soi_marker())
3580*53ee8cc1Swenshuai.xi         return FALSE;
3581*53ee8cc1Swenshuai.xi 
3582*53ee8cc1Swenshuai.xi     c = JPEG_process_markers();
3583*53ee8cc1Swenshuai.xi 
3584*53ee8cc1Swenshuai.xi     if( c == FALSE )
3585*53ee8cc1Swenshuai.xi         return FALSE;
3586*53ee8cc1Swenshuai.xi 
3587*53ee8cc1Swenshuai.xi     switch ( c )
3588*53ee8cc1Swenshuai.xi     {
3589*53ee8cc1Swenshuai.xi         case E_JPEG_SOF2:
3590*53ee8cc1Swenshuai.xi             {
3591*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("Progressive\n");
3592*53ee8cc1Swenshuai.xi                 _bProgressive_flag = TRUE;
3593*53ee8cc1Swenshuai.xi                 u32SOFOffset = u32DataOffset + JPEG_GetECS() - 2;
3594*53ee8cc1Swenshuai.xi                 if(!JPEG_read_sof_marker())
3595*53ee8cc1Swenshuai.xi                     return FALSE;
3596*53ee8cc1Swenshuai.xi                 break;
3597*53ee8cc1Swenshuai.xi             }
3598*53ee8cc1Swenshuai.xi         case E_JPEG_SOF0:
3599*53ee8cc1Swenshuai.xi             /* baseline DCT */
3600*53ee8cc1Swenshuai.xi         case E_JPEG_SOF1:
3601*53ee8cc1Swenshuai.xi             /* extended sequential DCT */
3602*53ee8cc1Swenshuai.xi             {
3603*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("Baseline\n");
3604*53ee8cc1Swenshuai.xi                 u32SOFOffset = u32DataOffset + JPEG_GetECS() - 2;
3605*53ee8cc1Swenshuai.xi                 if(!JPEG_read_sof_marker())
3606*53ee8cc1Swenshuai.xi                     return FALSE;
3607*53ee8cc1Swenshuai.xi                 break;
3608*53ee8cc1Swenshuai.xi             }
3609*53ee8cc1Swenshuai.xi         case E_JPEG_SOF9:
3610*53ee8cc1Swenshuai.xi             /* Arithmitic coding */
3611*53ee8cc1Swenshuai.xi             {
3612*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_NO_ARITHMETIC_SUPPORT );
3613*53ee8cc1Swenshuai.xi                 return FALSE;
3614*53ee8cc1Swenshuai.xi                 break;
3615*53ee8cc1Swenshuai.xi             }
3616*53ee8cc1Swenshuai.xi 
3617*53ee8cc1Swenshuai.xi         default:
3618*53ee8cc1Swenshuai.xi             {
3619*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("parsed unsupported marker = 0x%04lX\n", c);
3620*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_UNSUPPORTED_MARKER );
3621*53ee8cc1Swenshuai.xi                 return FALSE;
3622*53ee8cc1Swenshuai.xi                 break;
3623*53ee8cc1Swenshuai.xi             }
3624*53ee8cc1Swenshuai.xi     }
3625*53ee8cc1Swenshuai.xi     return TRUE;
3626*53ee8cc1Swenshuai.xi }
3627*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3628*53ee8cc1Swenshuai.xi // Find a start of scan (SOS) marker.
JPEG_locate_sos_marker(void)3629*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_locate_sos_marker(void)
3630*53ee8cc1Swenshuai.xi {
3631*53ee8cc1Swenshuai.xi     MS_U32 c;
3632*53ee8cc1Swenshuai.xi 
3633*53ee8cc1Swenshuai.xi     c = JPEG_process_markers();
3634*53ee8cc1Swenshuai.xi 
3635*53ee8cc1Swenshuai.xi     if ( c == E_JPEG_EOI )
3636*53ee8cc1Swenshuai.xi     {
3637*53ee8cc1Swenshuai.xi         return FALSE;
3638*53ee8cc1Swenshuai.xi     }
3639*53ee8cc1Swenshuai.xi     else if ( c != E_JPEG_SOS )
3640*53ee8cc1Swenshuai.xi     {
3641*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
3642*53ee8cc1Swenshuai.xi         return FALSE;
3643*53ee8cc1Swenshuai.xi     }
3644*53ee8cc1Swenshuai.xi 
3645*53ee8cc1Swenshuai.xi     if(!JPEG_read_sos_marker())
3646*53ee8cc1Swenshuai.xi         return FALSE;
3647*53ee8cc1Swenshuai.xi 
3648*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG(" _pu8In_buf_MPO_ofs=0x%lx, _u32In_buf_MPO_left=0x%lx===========================\n", (MS_U32)_pu8In_buf_ofs, (MS_U32)_u32In_buf_left);
3649*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%02x %02x %02x %02x %02x %02x %02x %02x \n",
3650*53ee8cc1Swenshuai.xi     *_pu8In_buf_ofs, *(_pu8In_buf_ofs+1), *(_pu8In_buf_ofs+2), *(_pu8In_buf_ofs+3),
3651*53ee8cc1Swenshuai.xi     *(_pu8In_buf_ofs+4), *(_pu8In_buf_ofs+5), *(_pu8In_buf_ofs+6), *(_pu8In_buf_ofs+7)
3652*53ee8cc1Swenshuai.xi     );
3653*53ee8cc1Swenshuai.xi 
3654*53ee8cc1Swenshuai.xi     return TRUE;
3655*53ee8cc1Swenshuai.xi }
3656*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3657*53ee8cc1Swenshuai.xi // Reset thumbnail parameters
JPEG_init_thumbnail(void)3658*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_init_thumbnail(void)
3659*53ee8cc1Swenshuai.xi {
3660*53ee8cc1Swenshuai.xi     _bThumbnailFound = FALSE;
3661*53ee8cc1Swenshuai.xi     _u32ThumbnailOffset = 0;
3662*53ee8cc1Swenshuai.xi     _u16ThumbnailSize = 0;
3663*53ee8cc1Swenshuai.xi     _bTiffBigEndian = FALSE;
3664*53ee8cc1Swenshuai.xi 
3665*53ee8cc1Swenshuai.xi     _u32ThumbnailBufferOffset = 0;
3666*53ee8cc1Swenshuai.xi     _u16ThumbnailSize = 0;
3667*53ee8cc1Swenshuai.xi     _bThumbnailAccessMode = FALSE;
3668*53ee8cc1Swenshuai.xi 
3669*53ee8cc1Swenshuai.xi     _stEXIF_DateTime.bHasDataTime = FALSE;
3670*53ee8cc1Swenshuai.xi     _stEXIF_DateTime.u32Year = 0;
3671*53ee8cc1Swenshuai.xi     _stEXIF_DateTime.u32Month = 0;
3672*53ee8cc1Swenshuai.xi     _stEXIF_DateTime.u32Day = 0;
3673*53ee8cc1Swenshuai.xi     _stEXIF_DateTime.u32Hour = 0;
3674*53ee8cc1Swenshuai.xi     _stEXIF_DateTime.u32Minute = 0;
3675*53ee8cc1Swenshuai.xi     _stEXIF_DateTime.u32Second = 0;
3676*53ee8cc1Swenshuai.xi     _eEXIF_Orientation = E_JPEG_EXIF_ORIENT_NOT_FOUND;
3677*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
3678*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u8EXIF_Manufacturer, 0, JPEG_MANUFACTURER_SIZE);
3679*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u8EXIF_Model, 0, JPEG_MODEL_SIZE);
3680*53ee8cc1Swenshuai.xi     _u16EXIF_Flash = 0;
3681*53ee8cc1Swenshuai.xi     _u16EXIF_Exposureprogram = 0;
3682*53ee8cc1Swenshuai.xi     _u32EXIF_ISOSpeedRatings = 0;
3683*53ee8cc1Swenshuai.xi     _stEXIF_ShutterSpeedValue.numerator = 0;
3684*53ee8cc1Swenshuai.xi     _stEXIF_ShutterSpeedValue.denominator= 0;
3685*53ee8cc1Swenshuai.xi     _stEXIF_ApertureValue.s_numerator= 0;
3686*53ee8cc1Swenshuai.xi     _stEXIF_ApertureValue.s_denominator= 0;
3687*53ee8cc1Swenshuai.xi     _stEXIF_ExposureBiasValue.numerator= 0;
3688*53ee8cc1Swenshuai.xi     _stEXIF_ExposureBiasValue.denominator= 0;
3689*53ee8cc1Swenshuai.xi     _stEXIF_FocalLength.s_numerator= 0;
3690*53ee8cc1Swenshuai.xi     _stEXIF_FocalLength.s_denominator= 0;
3691*53ee8cc1Swenshuai.xi     _u32EXIF_ImageWidth = 0;
3692*53ee8cc1Swenshuai.xi     _u32EXIF_ImageHeight = 0;
3693*53ee8cc1Swenshuai.xi     _stEXIF_ExposureTime.numerator = 0;
3694*53ee8cc1Swenshuai.xi     _stEXIF_ExposureTime.denominator =0;
3695*53ee8cc1Swenshuai.xi     _stEXIF_FNumber.numerator = 0;
3696*53ee8cc1Swenshuai.xi     _stEXIF_FNumber.denominator =0;
3697*53ee8cc1Swenshuai.xi #endif
3698*53ee8cc1Swenshuai.xi }
3699*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3700*53ee8cc1Swenshuai.xi // Reset everything to default/uninitialized state.
JPEG_init(void)3701*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init(void)
3702*53ee8cc1Swenshuai.xi {
3703*53ee8cc1Swenshuai.xi     MS_U16 i;
3704*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s!!\n", __FUNCTION__);
3705*53ee8cc1Swenshuai.xi     _u8LumaCi = 1;
3706*53ee8cc1Swenshuai.xi     _u8ChromaCi = 2;
3707*53ee8cc1Swenshuai.xi     _u8Chroma2Ci = 3;
3708*53ee8cc1Swenshuai.xi     bIs3HuffTbl = FALSE;
3709*53ee8cc1Swenshuai.xi 
3710*53ee8cc1Swenshuai.xi     _Error_code = E_JPEG_NO_ERROR;
3711*53ee8cc1Swenshuai.xi 
3712*53ee8cc1Swenshuai.xi #ifdef CMODEL
3713*53ee8cc1Swenshuai.xi     _bReady_flag = FALSE;
3714*53ee8cc1Swenshuai.xi #endif
3715*53ee8cc1Swenshuai.xi 
3716*53ee8cc1Swenshuai.xi     _u16Image_x_size = _u16Image_y_size = 0;
3717*53ee8cc1Swenshuai.xi     _u16OriginalImage_x_size = _u16OriginalImage_y_size = 0;
3718*53ee8cc1Swenshuai.xi     _u16AlignedImageWidth = _u16AlignedImagePitch = _u16AlignedImageHeight = 0;
3719*53ee8cc1Swenshuai.xi     _u16AlignedImagePitch_H = 0;
3720*53ee8cc1Swenshuai.xi 
3721*53ee8cc1Swenshuai.xi ////    _pStream = _Pstream;
3722*53ee8cc1Swenshuai.xi 
3723*53ee8cc1Swenshuai.xi     _bProgressive_flag = FALSE;
3724*53ee8cc1Swenshuai.xi #ifndef CMODEL
3725*53ee8cc1Swenshuai.xi     _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
3726*53ee8cc1Swenshuai.xi #endif
3727*53ee8cc1Swenshuai.xi     _u32RLEOffset = 0;
3728*53ee8cc1Swenshuai.xi     _bFirstRLE = TRUE;
3729*53ee8cc1Swenshuai.xi 
3730*53ee8cc1Swenshuai.xi     _s16dc_pred[0] = _s16dc_pred[1] = _s16dc_pred[2] = 0;
3731*53ee8cc1Swenshuai.xi 
3732*53ee8cc1Swenshuai.xi     _JPD_IsDecoding = FALSE; //For H/W bug, some cases can not exit after decode done.
3733*53ee8cc1Swenshuai.xi     _JPD_ReCheckTime = 0; //For H/W bug, some cases can not exit after decode done, record repeat time.
3734*53ee8cc1Swenshuai.xi     _JPD_PreVIdx = 0;     //For H/W bug, some cases can not exit after decode done, record previous Vidx.
3735*53ee8cc1Swenshuai.xi 
3736*53ee8cc1Swenshuai.xi     _Progressive_ROI_flag = FALSE; //CL82399
3737*53ee8cc1Swenshuai.xi     ROI_width = 0; //CL82399
3738*53ee8cc1Swenshuai.xi 
3739*53ee8cc1Swenshuai.xi     u8PreLHFlag = E_JPEG_BUFFER_NONE;
3740*53ee8cc1Swenshuai.xi 
3741*53ee8cc1Swenshuai.xi     u32MRCheckCount = 0;
3742*53ee8cc1Swenshuai.xi 
3743*53ee8cc1Swenshuai.xi     for(i = 0; i<JPEG_MAXHUFFTABLES; i++)
3744*53ee8cc1Swenshuai.xi     {
3745*53ee8cc1Swenshuai.xi         _Huff_info[i].bValid = FALSE;
3746*53ee8cc1Swenshuai.xi         JPEG_memset((void *)_Huff_info[i].u8Huff_num, 0, 17);
3747*53ee8cc1Swenshuai.xi         JPEG_memset((void *)_Huff_info[i].u8Huff_val, 0, 256);
3748*53ee8cc1Swenshuai.xi         JPEG_memset((void *)_Huff_info[i].u8Symbol, 0, 17);
3749*53ee8cc1Swenshuai.xi         JPEG_memset((void *)_Huff_info[i].u16Code, 0, 17);
3750*53ee8cc1Swenshuai.xi     }
3751*53ee8cc1Swenshuai.xi 
3752*53ee8cc1Swenshuai.xi     for(i = 0; i<JPEG_MAXQUANTTABLES; i++)
3753*53ee8cc1Swenshuai.xi     {
3754*53ee8cc1Swenshuai.xi         _QuantTables[i].bValid = FALSE;
3755*53ee8cc1Swenshuai.xi         JPEG_memset(_QuantTables[i].s16Value, 0, 64);
3756*53ee8cc1Swenshuai.xi     }
3757*53ee8cc1Swenshuai.xi 
3758*53ee8cc1Swenshuai.xi     gu8Scan_type = E_JPEG_GRAYSCALE;
3759*53ee8cc1Swenshuai.xi 
3760*53ee8cc1Swenshuai.xi     _u8Comps_in_frame = 0;
3761*53ee8cc1Swenshuai.xi 
3762*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u8Comp_h_samp, 0, sizeof( _u8Comp_h_samp ) );
3763*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u8Comp_v_samp, 0, sizeof( _u8Comp_v_samp ) );
3764*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u8Comp_quant, 0, sizeof( _u8Comp_quant ) );
3765*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u8Comp_ident, 0, sizeof( _u8Comp_ident ) );
3766*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u16Comp_h_blocks, 0, sizeof( _u16Comp_h_blocks ) );
3767*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u16Comp_v_blocks, 0, sizeof( _u16Comp_v_blocks ) );
3768*53ee8cc1Swenshuai.xi 
3769*53ee8cc1Swenshuai.xi     _u8Comps_in_scan = 0;
3770*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u8Comp_list, 0, sizeof( _u8Comp_list ) );
3771*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u8Comp_dc_tab, 0, sizeof( _u8Comp_dc_tab ) );
3772*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u8Comp_ac_tab, 0, sizeof( _u8Comp_ac_tab ) );
3773*53ee8cc1Swenshuai.xi 
3774*53ee8cc1Swenshuai.xi     _u8Spectral_start = 0;
3775*53ee8cc1Swenshuai.xi     _u8Spectral_end = 0;
3776*53ee8cc1Swenshuai.xi     _u8Successive_low = 0;
3777*53ee8cc1Swenshuai.xi     _u8Successive_high = 0;
3778*53ee8cc1Swenshuai.xi 
3779*53ee8cc1Swenshuai.xi     gu8Max_mcu_x_size = 0;
3780*53ee8cc1Swenshuai.xi     gu8Max_mcu_y_size = 0;
3781*53ee8cc1Swenshuai.xi 
3782*53ee8cc1Swenshuai.xi     _u8Blocks_per_mcu = 0;
3783*53ee8cc1Swenshuai.xi     _u32Max_blocks_per_row = 0;
3784*53ee8cc1Swenshuai.xi     _u16Mcus_per_row = 0;
3785*53ee8cc1Swenshuai.xi     _u16Mcus_per_col = 0;
3786*53ee8cc1Swenshuai.xi 
3787*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u8Mcu_org, 0, sizeof( _u8Mcu_org ) );
3788*53ee8cc1Swenshuai.xi 
3789*53ee8cc1Swenshuai.xi #ifdef CMODEL
3790*53ee8cc1Swenshuai.xi     gu16Real_dest_bytes_per_scan_line = 0;
3791*53ee8cc1Swenshuai.xi     gu16Dest_bytes_per_scan_line = 0;
3792*53ee8cc1Swenshuai.xi     gu8Dest_bytes_per_pixel = 0;
3793*53ee8cc1Swenshuai.xi #endif
3794*53ee8cc1Swenshuai.xi 
3795*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_pBlocks, 0, sizeof( _pBlocks ) );
3796*53ee8cc1Swenshuai.xi 
3797*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3798*53ee8cc1Swenshuai.xi     _u16Total_lines_left = 0;
3799*53ee8cc1Swenshuai.xi #ifdef CMODEL
3800*53ee8cc1Swenshuai.xi     gu16Mcu_lines_left = 0;
3801*53ee8cc1Swenshuai.xi #endif
3802*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u32Block_y_mcu, 0, sizeof( _u32Block_y_mcu ) );
3803*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_Huff_tbls, 0, sizeof( _Huff_tbls ) );
3804*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_DC_Coeffs, 0, sizeof( _DC_Coeffs ) );
3805*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_AC_Coeffs, 0, sizeof( _AC_Coeffs ) );
3806*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u32Last_dc_val, 0, sizeof( _u32Last_dc_val ) );
3807*53ee8cc1Swenshuai.xi 
3808*53ee8cc1Swenshuai.xi     _u32EOB_run = 0;
3809*53ee8cc1Swenshuai.xi #endif
3810*53ee8cc1Swenshuai.xi 
3811*53ee8cc1Swenshuai.xi     _pu8In_buf_ofs = _pu8In_buf;
3812*53ee8cc1Swenshuai.xi ////    _u32In_buf_left = 0;
3813*53ee8cc1Swenshuai.xi ////    _bEOF_flag = FALSE;
3814*53ee8cc1Swenshuai.xi     _u8Tem_flag = 0;
3815*53ee8cc1Swenshuai.xi 
3816*53ee8cc1Swenshuai.xi     //sharon JPEG_memset((void *)_pu8In_buf, 0, sizeof(MS_U8)*(MRC_BUFFER_SIZE + 128) );
3817*53ee8cc1Swenshuai.xi 
3818*53ee8cc1Swenshuai.xi     _u16Restart_interval = 0;
3819*53ee8cc1Swenshuai.xi     _u16Restarts_left = 0;
3820*53ee8cc1Swenshuai.xi     _u16Next_restart_num = 0;
3821*53ee8cc1Swenshuai.xi 
3822*53ee8cc1Swenshuai.xi     gu16Max_mcus_per_row = 0;
3823*53ee8cc1Swenshuai.xi     _u16Max_blocks_per_mcu = 0;
3824*53ee8cc1Swenshuai.xi     _u16Max_mcus_per_col = 0;
3825*53ee8cc1Swenshuai.xi 
3826*53ee8cc1Swenshuai.xi #ifdef CMODEL
3827*53ee8cc1Swenshuai.xi     JPEG_memset((void *)gps16Block_seg, 0, sizeof( gps16Block_seg ) );
3828*53ee8cc1Swenshuai.xi     gpu8Sample_buf = NULL;
3829*53ee8cc1Swenshuai.xi #endif
3830*53ee8cc1Swenshuai.xi 
3831*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
3832*53ee8cc1Swenshuai.xi     JPEG_memset( _ps16Block_seg, 0, sizeof( _ps16Block_seg ) );
3833*53ee8cc1Swenshuai.xi     gpu8Sample_buf = NULL;
3834*53ee8cc1Swenshuai.xi #endif
3835*53ee8cc1Swenshuai.xi 
3836*53ee8cc1Swenshuai.xi     // Tell the stream we're going to use it.
3837*53ee8cc1Swenshuai.xi     //_pStream->attach();
3838*53ee8cc1Swenshuai.xi 
3839*53ee8cc1Swenshuai.xi     // Ready the input buffer.
3840*53ee8cc1Swenshuai.xi     if(_bThumbnailAccessMode)
3841*53ee8cc1Swenshuai.xi     {
3842*53ee8cc1Swenshuai.xi         // It means that thumbnail is found and re-call JPEG_init()
3843*53ee8cc1Swenshuai.xi         // to re-fill thumbnail data to internal buffer.
3844*53ee8cc1Swenshuai.xi         if(!JPEG_fill_read_buffer())
3845*53ee8cc1Swenshuai.xi         {
3846*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("JPEG_init : JPEG_fill_read_buffer failed!!!\n");
3847*53ee8cc1Swenshuai.xi             return FALSE;
3848*53ee8cc1Swenshuai.xi         }
3849*53ee8cc1Swenshuai.xi     }
3850*53ee8cc1Swenshuai.xi     else
3851*53ee8cc1Swenshuai.xi     {
3852*53ee8cc1Swenshuai.xi ////        _u32In_buf_left = MRC_BUFFER_SIZE;  //sharon
3853*53ee8cc1Swenshuai.xi ////        _Total_Decoded_Size = MRC_BUFFER_SIZE;  //sharon
3854*53ee8cc1Swenshuai.xi ////        _u32Total_bytes_read = MRC_BUFFER_SIZE;  //sharon
3855*53ee8cc1Swenshuai.xi         _u32Total_bytes_read = _u32In_buf_left;
3856*53ee8cc1Swenshuai.xi     }
3857*53ee8cc1Swenshuai.xi 
3858*53ee8cc1Swenshuai.xi     // Prime the bit buffer.
3859*53ee8cc1Swenshuai.xi     _s16Bits_left = 0;
3860*53ee8cc1Swenshuai.xi     _u32Bit_buf = 0;
3861*53ee8cc1Swenshuai.xi 
3862*53ee8cc1Swenshuai.xi //    _pu32ExifHeaderAddr = 0;
3863*53ee8cc1Swenshuai.xi 
3864*53ee8cc1Swenshuai.xi #ifdef CMODEL
3865*53ee8cc1Swenshuai.xi     for ( i = 0; i < JPEG_MAXBLOCKSPERROW; i++ )
3866*53ee8cc1Swenshuai.xi     {
3867*53ee8cc1Swenshuai.xi         gu8Block_max_zag_set[i] = 64;
3868*53ee8cc1Swenshuai.xi     }
3869*53ee8cc1Swenshuai.xi #endif
3870*53ee8cc1Swenshuai.xi 
3871*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
3872*53ee8cc1Swenshuai.xi     for ( i = 0; i < JPEG_MAXBLOCKSPERROW; i++ )
3873*53ee8cc1Swenshuai.xi     {
3874*53ee8cc1Swenshuai.xi         _u8Block_max_zag_set[i] = 64;
3875*53ee8cc1Swenshuai.xi     }
3876*53ee8cc1Swenshuai.xi #endif
3877*53ee8cc1Swenshuai.xi     return TRUE;
3878*53ee8cc1Swenshuai.xi }
3879*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3880*53ee8cc1Swenshuai.xi // The coeff_buf series of methods originally stored the coefficients
3881*53ee8cc1Swenshuai.xi // into a "virtual" file which was located in EMS, XMS, or a disk file. A cache
3882*53ee8cc1Swenshuai.xi // was used to make this process more efficient. Now, we can store the entire
3883*53ee8cc1Swenshuai.xi // 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)3884*53ee8cc1Swenshuai.xi 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)
3885*53ee8cc1Swenshuai.xi {
3886*53ee8cc1Swenshuai.xi     PJPEG_CoeffBuf cb = ( PJPEG_CoeffBuf )JPEG_alloc( sizeof( JPEG_CoeffBuf ) );
3887*53ee8cc1Swenshuai.xi 
3888*53ee8cc1Swenshuai.xi     if(cb == NULL)
3889*53ee8cc1Swenshuai.xi         return NULL;
3890*53ee8cc1Swenshuai.xi 
3891*53ee8cc1Swenshuai.xi     cb->u16Block_num_x = block_num_x;
3892*53ee8cc1Swenshuai.xi     cb->u16Block_num_y = block_num_y;
3893*53ee8cc1Swenshuai.xi 
3894*53ee8cc1Swenshuai.xi     cb->u8Block_len_x = block_len_x;
3895*53ee8cc1Swenshuai.xi     cb->u8Block_len_y = block_len_y;
3896*53ee8cc1Swenshuai.xi 
3897*53ee8cc1Swenshuai.xi     cb->u16Block_size = ( block_len_x * block_len_y ) * sizeof( JPEG_BLOCK_TYPE );
3898*53ee8cc1Swenshuai.xi 
3899*53ee8cc1Swenshuai.xi     cb->pu8Data = ( MS_U8 * )JPEG_alloc( cb->u16Block_size * block_num_x * block_num_y );
3900*53ee8cc1Swenshuai.xi 
3901*53ee8cc1Swenshuai.xi     if(cb->pu8Data == NULL)
3902*53ee8cc1Swenshuai.xi         return NULL;
3903*53ee8cc1Swenshuai.xi 
3904*53ee8cc1Swenshuai.xi     return cb;
3905*53ee8cc1Swenshuai.xi }
3906*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_coeff_buf_getp(PJPEG_CoeffBuf cb,MS_U16 block_x,MS_U16 block_y)3907*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_BLOCK_TYPE * JPEG_coeff_buf_getp( PJPEG_CoeffBuf cb, MS_U16 block_x, MS_U16 block_y )
3908*53ee8cc1Swenshuai.xi {
3909*53ee8cc1Swenshuai.xi     if ( block_x >= cb->u16Block_num_x )
3910*53ee8cc1Swenshuai.xi     {
3911*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_ASSERTION_ERROR );
3912*53ee8cc1Swenshuai.xi         return NULL;
3913*53ee8cc1Swenshuai.xi     }
3914*53ee8cc1Swenshuai.xi 
3915*53ee8cc1Swenshuai.xi     if ( block_y >= cb->u16Block_num_y )
3916*53ee8cc1Swenshuai.xi     {
3917*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_ASSERTION_ERROR );
3918*53ee8cc1Swenshuai.xi         return NULL;
3919*53ee8cc1Swenshuai.xi     }
3920*53ee8cc1Swenshuai.xi 
3921*53ee8cc1Swenshuai.xi     return ( JPEG_BLOCK_TYPE * )((MS_U32)( cb->pu8Data + block_x * cb->u16Block_size
3922*53ee8cc1Swenshuai.xi                                             + block_y * (cb->u16Block_size * cb->u16Block_num_x)));
3923*53ee8cc1Swenshuai.xi }
3924*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3925*53ee8cc1Swenshuai.xi // Creates the tables needed for efficient Huffman decoding.
JPEG_make_huff_table(MS_U8 index)3926*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_make_huff_table(MS_U8 index)
3927*53ee8cc1Swenshuai.xi {
3928*53ee8cc1Swenshuai.xi     MS_U16 p, i, l, si;
3929*53ee8cc1Swenshuai.xi     MS_U8 huffsize[257];
3930*53ee8cc1Swenshuai.xi     MS_U16 huffcode[257];
3931*53ee8cc1Swenshuai.xi     MS_U16 _code;
3932*53ee8cc1Swenshuai.xi     MS_U16 subtree;
3933*53ee8cc1Swenshuai.xi     MS_U16 code_size;
3934*53ee8cc1Swenshuai.xi     MS_U16 lastp;
3935*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3936*53ee8cc1Swenshuai.xi     MS_S16 nextfreeentry;
3937*53ee8cc1Swenshuai.xi #endif
3938*53ee8cc1Swenshuai.xi     MS_S16 currententry;
3939*53ee8cc1Swenshuai.xi 
3940*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3941*53ee8cc1Swenshuai.xi     JPEG_HuffTbl *hs = &_Huff_tbls[index];
3942*53ee8cc1Swenshuai.xi #endif
3943*53ee8cc1Swenshuai.xi 
3944*53ee8cc1Swenshuai.xi     JPEG_memset((void *)huffsize, 0, sizeof(huffsize));
3945*53ee8cc1Swenshuai.xi     JPEG_memset((void *)huffcode, 0, sizeof(huffcode));
3946*53ee8cc1Swenshuai.xi 
3947*53ee8cc1Swenshuai.xi     p = 0;
3948*53ee8cc1Swenshuai.xi 
3949*53ee8cc1Swenshuai.xi     for ( l = 1; l <= 16; l++ )
3950*53ee8cc1Swenshuai.xi     {
3951*53ee8cc1Swenshuai.xi         for ( i = 1; i <= _Huff_info[index].u8Huff_num[l]; i++ )
3952*53ee8cc1Swenshuai.xi         {
3953*53ee8cc1Swenshuai.xi             huffsize[p++] = l;
3954*53ee8cc1Swenshuai.xi 
3955*53ee8cc1Swenshuai.xi             //kevinhuang, add protection
3956*53ee8cc1Swenshuai.xi             if ( p >= 257 )
3957*53ee8cc1Swenshuai.xi             {
3958*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
3959*53ee8cc1Swenshuai.xi                 return FALSE;
3960*53ee8cc1Swenshuai.xi             }
3961*53ee8cc1Swenshuai.xi         }
3962*53ee8cc1Swenshuai.xi     }
3963*53ee8cc1Swenshuai.xi 
3964*53ee8cc1Swenshuai.xi     huffsize[p] = 0;
3965*53ee8cc1Swenshuai.xi 
3966*53ee8cc1Swenshuai.xi     lastp = p;
3967*53ee8cc1Swenshuai.xi 
3968*53ee8cc1Swenshuai.xi     _code = 0;
3969*53ee8cc1Swenshuai.xi     si = huffsize[0];
3970*53ee8cc1Swenshuai.xi     p = 0;
3971*53ee8cc1Swenshuai.xi 
3972*53ee8cc1Swenshuai.xi     while ( huffsize[p] )
3973*53ee8cc1Swenshuai.xi     {
3974*53ee8cc1Swenshuai.xi         while ( huffsize[p] == si )
3975*53ee8cc1Swenshuai.xi         {
3976*53ee8cc1Swenshuai.xi             huffcode[p++] = _code;
3977*53ee8cc1Swenshuai.xi             _code++;
3978*53ee8cc1Swenshuai.xi 
3979*53ee8cc1Swenshuai.xi             //kevinhuang, add protection
3980*53ee8cc1Swenshuai.xi             if ( p >= 257 )
3981*53ee8cc1Swenshuai.xi             {
3982*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
3983*53ee8cc1Swenshuai.xi                 return FALSE;
3984*53ee8cc1Swenshuai.xi             }
3985*53ee8cc1Swenshuai.xi         }
3986*53ee8cc1Swenshuai.xi 
3987*53ee8cc1Swenshuai.xi         _code <<= 1;
3988*53ee8cc1Swenshuai.xi         si++;
3989*53ee8cc1Swenshuai.xi     }
3990*53ee8cc1Swenshuai.xi 
3991*53ee8cc1Swenshuai.xi     // Calculate the min code
3992*53ee8cc1Swenshuai.xi     for(i = 1; i<=16; i++)
3993*53ee8cc1Swenshuai.xi         _Huff_info[index].u16Code[i] = huffcode[_Huff_info[index].u8Symbol[i]] << (15 - (i - 1));
3994*53ee8cc1Swenshuai.xi 
3995*53ee8cc1Swenshuai.xi 
3996*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3997*53ee8cc1Swenshuai.xi     // In JPD mode, SW doesn't need huff table when baseline decoding
3998*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
3999*53ee8cc1Swenshuai.xi     if((E_JPEG_CMYK != gu8Scan_type)
4000*53ee8cc1Swenshuai.xi     && (E_JPEG_RGB != gu8Scan_type))
4001*53ee8cc1Swenshuai.xi #endif
4002*53ee8cc1Swenshuai.xi     {
4003*53ee8cc1Swenshuai.xi #ifndef CMODEL
4004*53ee8cc1Swenshuai.xi         if(_bProgressive_flag==FALSE)
4005*53ee8cc1Swenshuai.xi             return TRUE;
4006*53ee8cc1Swenshuai.xi #endif
4007*53ee8cc1Swenshuai.xi     }
4008*53ee8cc1Swenshuai.xi 
4009*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("Make HUFF TABLE\n");
4010*53ee8cc1Swenshuai.xi 
4011*53ee8cc1Swenshuai.xi     JPEG_memset((void *)(hs->s16Look_up), 0, sizeof( hs->s16Look_up ) );
4012*53ee8cc1Swenshuai.xi     JPEG_memset((void *)(hs->s16Tree), 0, sizeof( hs->s16Tree ) );
4013*53ee8cc1Swenshuai.xi     JPEG_memset((void *)(hs->u8Code_size), 0, sizeof( hs->u8Code_size ) );
4014*53ee8cc1Swenshuai.xi 
4015*53ee8cc1Swenshuai.xi     nextfreeentry = -1;
4016*53ee8cc1Swenshuai.xi 
4017*53ee8cc1Swenshuai.xi     p = 0;
4018*53ee8cc1Swenshuai.xi 
4019*53ee8cc1Swenshuai.xi     while ( p < lastp )
4020*53ee8cc1Swenshuai.xi     {
4021*53ee8cc1Swenshuai.xi         i = _Huff_info[index].u8Huff_val[p];
4022*53ee8cc1Swenshuai.xi         _code = huffcode[p];
4023*53ee8cc1Swenshuai.xi         code_size = huffsize[p];
4024*53ee8cc1Swenshuai.xi 
4025*53ee8cc1Swenshuai.xi         hs->u8Code_size[i] = code_size;
4026*53ee8cc1Swenshuai.xi 
4027*53ee8cc1Swenshuai.xi         if ( code_size <= 8 )
4028*53ee8cc1Swenshuai.xi         {
4029*53ee8cc1Swenshuai.xi             _code <<= ( 8 - code_size );
4030*53ee8cc1Swenshuai.xi 
4031*53ee8cc1Swenshuai.xi             for ( l = 1 << ( 8 - code_size ); l > 0; l-- )
4032*53ee8cc1Swenshuai.xi             {
4033*53ee8cc1Swenshuai.xi                 hs->s16Look_up[_code] = i;
4034*53ee8cc1Swenshuai.xi                 _code++;
4035*53ee8cc1Swenshuai.xi             }
4036*53ee8cc1Swenshuai.xi         }
4037*53ee8cc1Swenshuai.xi         else
4038*53ee8cc1Swenshuai.xi         {
4039*53ee8cc1Swenshuai.xi             subtree = ( _code >> ( code_size - 8 ) ) & 0xFF;
4040*53ee8cc1Swenshuai.xi 
4041*53ee8cc1Swenshuai.xi             currententry = hs->s16Look_up[subtree];
4042*53ee8cc1Swenshuai.xi 
4043*53ee8cc1Swenshuai.xi             if ( currententry == 0 )
4044*53ee8cc1Swenshuai.xi             {
4045*53ee8cc1Swenshuai.xi                 hs->s16Look_up[subtree] = currententry = nextfreeentry;
4046*53ee8cc1Swenshuai.xi 
4047*53ee8cc1Swenshuai.xi                 nextfreeentry -= 2;
4048*53ee8cc1Swenshuai.xi             }
4049*53ee8cc1Swenshuai.xi 
4050*53ee8cc1Swenshuai.xi             _code <<= ( 16 - ( code_size - 8 ) );
4051*53ee8cc1Swenshuai.xi 
4052*53ee8cc1Swenshuai.xi             for ( l = code_size; l > 9; l-- )
4053*53ee8cc1Swenshuai.xi             {
4054*53ee8cc1Swenshuai.xi                 if ( ( _code & 0x8000 ) == 0 )
4055*53ee8cc1Swenshuai.xi                 {
4056*53ee8cc1Swenshuai.xi                     currententry--;
4057*53ee8cc1Swenshuai.xi                 }
4058*53ee8cc1Swenshuai.xi 
4059*53ee8cc1Swenshuai.xi                 if ( hs->s16Tree[-currententry - 1] == 0 )
4060*53ee8cc1Swenshuai.xi                 {
4061*53ee8cc1Swenshuai.xi                     hs->s16Tree[-currententry - 1] = nextfreeentry;
4062*53ee8cc1Swenshuai.xi 
4063*53ee8cc1Swenshuai.xi                     currententry = nextfreeentry;
4064*53ee8cc1Swenshuai.xi 
4065*53ee8cc1Swenshuai.xi                     nextfreeentry -= 2;
4066*53ee8cc1Swenshuai.xi                 }
4067*53ee8cc1Swenshuai.xi                 else
4068*53ee8cc1Swenshuai.xi                 {
4069*53ee8cc1Swenshuai.xi                     currententry = hs->s16Tree[-currententry - 1];
4070*53ee8cc1Swenshuai.xi                 }
4071*53ee8cc1Swenshuai.xi 
4072*53ee8cc1Swenshuai.xi                 _code <<= 1;
4073*53ee8cc1Swenshuai.xi             }
4074*53ee8cc1Swenshuai.xi 
4075*53ee8cc1Swenshuai.xi             if ( ( _code & 0x8000 ) == 0 )
4076*53ee8cc1Swenshuai.xi             {
4077*53ee8cc1Swenshuai.xi                 currententry--;
4078*53ee8cc1Swenshuai.xi             }
4079*53ee8cc1Swenshuai.xi 
4080*53ee8cc1Swenshuai.xi             hs->s16Tree[-currententry - 1] = i;
4081*53ee8cc1Swenshuai.xi         }
4082*53ee8cc1Swenshuai.xi 
4083*53ee8cc1Swenshuai.xi         p++;
4084*53ee8cc1Swenshuai.xi     }
4085*53ee8cc1Swenshuai.xi #endif  //SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
4086*53ee8cc1Swenshuai.xi     return TRUE;
4087*53ee8cc1Swenshuai.xi }
4088*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4089*53ee8cc1Swenshuai.xi // Verifies the quantization tables needed for this scan are available.
JPEG_check_quant_tables(void)4090*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_check_quant_tables( void ) //ok
4091*53ee8cc1Swenshuai.xi {
4092*53ee8cc1Swenshuai.xi     MS_U8 i;
4093*53ee8cc1Swenshuai.xi 
4094*53ee8cc1Swenshuai.xi     for ( i = 0; i < _u8Comps_in_scan; i++ )
4095*53ee8cc1Swenshuai.xi     {
4096*53ee8cc1Swenshuai.xi         if ( _QuantTables[_u8Comp_quant[_u8Comp_list[i]]].bValid==FALSE )
4097*53ee8cc1Swenshuai.xi         {
4098*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_UNDEFINED_QUANT_TABLE );
4099*53ee8cc1Swenshuai.xi             return FALSE;
4100*53ee8cc1Swenshuai.xi         }
4101*53ee8cc1Swenshuai.xi     }
4102*53ee8cc1Swenshuai.xi     return TRUE;
4103*53ee8cc1Swenshuai.xi }
4104*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4105*53ee8cc1Swenshuai.xi // Verifies that all the Huffman tables needed for this scan are available.
JPEG_check_huff_tables(void)4106*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_check_huff_tables( void )
4107*53ee8cc1Swenshuai.xi {
4108*53ee8cc1Swenshuai.xi     MS_U8 i;
4109*53ee8cc1Swenshuai.xi 
4110*53ee8cc1Swenshuai.xi     for ( i = 0; i < _u8Comps_in_scan; i++ )
4111*53ee8cc1Swenshuai.xi     {
4112*53ee8cc1Swenshuai.xi         if ( ( _u8Spectral_start == 0 ) && ( _Huff_info[_u8Comp_dc_tab[_u8Comp_list[i]]].bValid== FALSE ) )
4113*53ee8cc1Swenshuai.xi         {
4114*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
4115*53ee8cc1Swenshuai.xi             return FALSE;
4116*53ee8cc1Swenshuai.xi         }
4117*53ee8cc1Swenshuai.xi 
4118*53ee8cc1Swenshuai.xi         if ( ( _u8Spectral_end > 0 ) && ( _Huff_info[_u8Comp_ac_tab[_u8Comp_list[i]]].bValid== FALSE ) )
4119*53ee8cc1Swenshuai.xi         {
4120*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
4121*53ee8cc1Swenshuai.xi             return FALSE;
4122*53ee8cc1Swenshuai.xi         }
4123*53ee8cc1Swenshuai.xi     }
4124*53ee8cc1Swenshuai.xi 
4125*53ee8cc1Swenshuai.xi     for ( i = 0; i < JPEG_MAXHUFFTABLES; i++ )
4126*53ee8cc1Swenshuai.xi     {
4127*53ee8cc1Swenshuai.xi         if ( _Huff_info[i].bValid )
4128*53ee8cc1Swenshuai.xi         {
4129*53ee8cc1Swenshuai.xi             if(!JPEG_make_huff_table(i))
4130*53ee8cc1Swenshuai.xi                 return FALSE;
4131*53ee8cc1Swenshuai.xi         }
4132*53ee8cc1Swenshuai.xi     }
4133*53ee8cc1Swenshuai.xi     return TRUE;
4134*53ee8cc1Swenshuai.xi }
4135*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4136*53ee8cc1Swenshuai.xi // Determines the component order inside each MCU.
4137*53ee8cc1Swenshuai.xi // Also calcs how many MCU's are on each row, etc.
JPEG_calc_mcu_block_order(void)4138*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_calc_mcu_block_order( void ) //ok
4139*53ee8cc1Swenshuai.xi {
4140*53ee8cc1Swenshuai.xi     MS_U8 component_num, component_id;
4141*53ee8cc1Swenshuai.xi     MS_U8 max_h_samp = 0, max_v_samp = 0;
4142*53ee8cc1Swenshuai.xi 
4143*53ee8cc1Swenshuai.xi     for ( component_id = 0; component_id < _u8Comps_in_frame; component_id++ )
4144*53ee8cc1Swenshuai.xi     {
4145*53ee8cc1Swenshuai.xi         if ( _u8Comp_h_samp[component_id] > max_h_samp )
4146*53ee8cc1Swenshuai.xi         {
4147*53ee8cc1Swenshuai.xi             max_h_samp = _u8Comp_h_samp[component_id];
4148*53ee8cc1Swenshuai.xi         }
4149*53ee8cc1Swenshuai.xi 
4150*53ee8cc1Swenshuai.xi         if ( _u8Comp_v_samp[component_id] > max_v_samp )
4151*53ee8cc1Swenshuai.xi         {
4152*53ee8cc1Swenshuai.xi             max_v_samp = _u8Comp_v_samp[component_id];
4153*53ee8cc1Swenshuai.xi         }
4154*53ee8cc1Swenshuai.xi     }
4155*53ee8cc1Swenshuai.xi 
4156*53ee8cc1Swenshuai.xi     if((max_h_samp == 0) || (max_v_samp == 0))
4157*53ee8cc1Swenshuai.xi     {
4158*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_NOT_ENOUGH_HEADER_INFO );
4159*53ee8cc1Swenshuai.xi         return;
4160*53ee8cc1Swenshuai.xi     }
4161*53ee8cc1Swenshuai.xi 
4162*53ee8cc1Swenshuai.xi     for ( component_id = 0; component_id < _u8Comps_in_frame; component_id++ )
4163*53ee8cc1Swenshuai.xi     {
4164*53ee8cc1Swenshuai.xi         _u16Comp_h_blocks[component_id] = ( ( ( ( _u16Image_x_size * _u8Comp_h_samp[component_id] ) + ( max_h_samp - 1 ) ) / max_h_samp ) + 7 ) / 8;
4165*53ee8cc1Swenshuai.xi         _u16Comp_v_blocks[component_id] = ( ( ( ( _u16Image_y_size * _u8Comp_v_samp[component_id] ) + ( max_v_samp - 1 ) ) / max_v_samp ) + 7 ) / 8;
4166*53ee8cc1Swenshuai.xi     }
4167*53ee8cc1Swenshuai.xi 
4168*53ee8cc1Swenshuai.xi     if ( _u8Comps_in_scan == 1 )
4169*53ee8cc1Swenshuai.xi     {
4170*53ee8cc1Swenshuai.xi         _u16Mcus_per_row = _u16Comp_h_blocks[_u8Comp_list[0]];
4171*53ee8cc1Swenshuai.xi         _u16Mcus_per_col = _u16Comp_v_blocks[_u8Comp_list[0]];
4172*53ee8cc1Swenshuai.xi     }
4173*53ee8cc1Swenshuai.xi     else
4174*53ee8cc1Swenshuai.xi     {
4175*53ee8cc1Swenshuai.xi         _u16Mcus_per_row = ( ( ( _u16Image_x_size + 7 ) / 8 ) + ( max_h_samp - 1 ) ) / max_h_samp;
4176*53ee8cc1Swenshuai.xi         _u16Mcus_per_col = ( ( ( _u16Image_y_size + 7 ) / 8 ) + ( max_v_samp - 1 ) ) / max_v_samp;
4177*53ee8cc1Swenshuai.xi     }
4178*53ee8cc1Swenshuai.xi 
4179*53ee8cc1Swenshuai.xi     if ( _u8Comps_in_scan == 1 )
4180*53ee8cc1Swenshuai.xi     {
4181*53ee8cc1Swenshuai.xi         _u8Mcu_org[0] = _u8Comp_list[0];
4182*53ee8cc1Swenshuai.xi 
4183*53ee8cc1Swenshuai.xi         _u8Blocks_per_mcu = 1;
4184*53ee8cc1Swenshuai.xi     }
4185*53ee8cc1Swenshuai.xi     else
4186*53ee8cc1Swenshuai.xi     {
4187*53ee8cc1Swenshuai.xi         _u8Blocks_per_mcu = 0;
4188*53ee8cc1Swenshuai.xi 
4189*53ee8cc1Swenshuai.xi         for ( component_num = 0; component_num < _u8Comps_in_scan; component_num++ )
4190*53ee8cc1Swenshuai.xi         {
4191*53ee8cc1Swenshuai.xi             MS_U8 num_blocks;
4192*53ee8cc1Swenshuai.xi 
4193*53ee8cc1Swenshuai.xi             component_id = _u8Comp_list[component_num];
4194*53ee8cc1Swenshuai.xi 
4195*53ee8cc1Swenshuai.xi             num_blocks = _u8Comp_h_samp[component_id] * _u8Comp_v_samp[component_id];
4196*53ee8cc1Swenshuai.xi 
4197*53ee8cc1Swenshuai.xi             while ( num_blocks-- )
4198*53ee8cc1Swenshuai.xi             {
4199*53ee8cc1Swenshuai.xi                 _u8Mcu_org[_u8Blocks_per_mcu++] = component_id;
4200*53ee8cc1Swenshuai.xi             }
4201*53ee8cc1Swenshuai.xi         }
4202*53ee8cc1Swenshuai.xi     }
4203*53ee8cc1Swenshuai.xi }
4204*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4205*53ee8cc1Swenshuai.xi /* Get current access byte address in MRC buffer relative to MRC start address */
JPEG_GetECS(void)4206*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_GetECS(void)
4207*53ee8cc1Swenshuai.xi {
4208*53ee8cc1Swenshuai.xi     MS_U32 data_end_addr = (MS_U32)_pu8In_buf_ofs;
4209*53ee8cc1Swenshuai.xi     MS_U32 data_start_addr =(MS_U32) _pu8In_buf;
4210*53ee8cc1Swenshuai.xi 
4211*53ee8cc1Swenshuai.xi     return (data_end_addr - data_start_addr);
4212*53ee8cc1Swenshuai.xi }
4213*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4214*53ee8cc1Swenshuai.xi //*************************************************
4215*53ee8cc1Swenshuai.xi //write symbol table
4216*53ee8cc1Swenshuai.xi //*************************************************
4217*53ee8cc1Swenshuai.xi #ifndef CMODEL
4218*53ee8cc1Swenshuai.xi #if 0
4219*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_write_symidx(void)
4220*53ee8cc1Swenshuai.xi {
4221*53ee8cc1Swenshuai.xi     MS_U16 i, tbl_num_luma, tbl_num_chroma;
4222*53ee8cc1Swenshuai.xi     MS_U8 ci, luma_ci = 0, chroma_ci = 0;
4223*53ee8cc1Swenshuai.xi 
4224*53ee8cc1Swenshuai.xi     MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SYMIDX_BASE);
4225*53ee8cc1Swenshuai.xi     if (_HeadCheck.DHT)
4226*53ee8cc1Swenshuai.xi     {
4227*53ee8cc1Swenshuai.xi         for(ci = 0; ci<_u8Comps_in_frame; ci++)
4228*53ee8cc1Swenshuai.xi         {
4229*53ee8cc1Swenshuai.xi             if(_u8LumaCi==_u8Comp_ident[ci])
4230*53ee8cc1Swenshuai.xi             {
4231*53ee8cc1Swenshuai.xi                 luma_ci = ci;
4232*53ee8cc1Swenshuai.xi                 break;
4233*53ee8cc1Swenshuai.xi             }
4234*53ee8cc1Swenshuai.xi         }
4235*53ee8cc1Swenshuai.xi 
4236*53ee8cc1Swenshuai.xi         for(ci = 0; ci<_u8Comps_in_frame; ci++)
4237*53ee8cc1Swenshuai.xi         {
4238*53ee8cc1Swenshuai.xi             if(_u8ChromaCi==_u8Comp_ident[ci])
4239*53ee8cc1Swenshuai.xi             {
4240*53ee8cc1Swenshuai.xi                 chroma_ci = ci;
4241*53ee8cc1Swenshuai.xi                 break;
4242*53ee8cc1Swenshuai.xi             }
4243*53ee8cc1Swenshuai.xi         }
4244*53ee8cc1Swenshuai.xi 
4245*53ee8cc1Swenshuai.xi         tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4246*53ee8cc1Swenshuai.xi         tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4247*53ee8cc1Swenshuai.xi 
4248*53ee8cc1Swenshuai.xi         for ( i = 0; i < 256; i++ )
4249*53ee8cc1Swenshuai.xi         {
4250*53ee8cc1Swenshuai.xi             MDrv_Write2Byte( BK_JPD_TID_DAT, ( _Huff_info[tbl_num_chroma].u8Huff_val[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Huff_val[i] ) );
4251*53ee8cc1Swenshuai.xi         }
4252*53ee8cc1Swenshuai.xi 
4253*53ee8cc1Swenshuai.xi         tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4254*53ee8cc1Swenshuai.xi         tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4255*53ee8cc1Swenshuai.xi 
4256*53ee8cc1Swenshuai.xi         for ( i = 0; i < 16; i++ )
4257*53ee8cc1Swenshuai.xi         {
4258*53ee8cc1Swenshuai.xi             MDrv_Write2Byte( BK_JPD_TID_DAT, ( _Huff_info[tbl_num_chroma].u8Huff_val[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Huff_val[i] ) );
4259*53ee8cc1Swenshuai.xi         }
4260*53ee8cc1Swenshuai.xi     }
4261*53ee8cc1Swenshuai.xi     else
4262*53ee8cc1Swenshuai.xi     {
4263*53ee8cc1Swenshuai.xi         for(i=0;i<272;i++)
4264*53ee8cc1Swenshuai.xi             MDrv_Write2Byte( BK_JPD_TID_DAT, g16SYMIDX_TBL[i]);
4265*53ee8cc1Swenshuai.xi     }
4266*53ee8cc1Swenshuai.xi }
4267*53ee8cc1Swenshuai.xi #endif
4268*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_WriteSymidx(void)4269*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_WriteSymidx(void)
4270*53ee8cc1Swenshuai.xi {
4271*53ee8cc1Swenshuai.xi     //MS_U16 i, tbl_num_luma, tbl_num_chroma;
4272*53ee8cc1Swenshuai.xi     MS_U16 ac_tbl_num_luma = 0, ac_tbl_num_chroma = 0;
4273*53ee8cc1Swenshuai.xi     MS_U16 dc_tbl_num_luma = 0, dc_tbl_num_chroma = 0;
4274*53ee8cc1Swenshuai.xi     MS_U8 ci, luma_ci = 0, chroma_ci = 0;
4275*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4276*53ee8cc1Swenshuai.xi     MS_U16 ac_tbl_num_chroma2 = 0;
4277*53ee8cc1Swenshuai.xi     MS_U16 dc_tbl_num_chroma2 = 0;
4278*53ee8cc1Swenshuai.xi     MS_U8 chroma2_ci = 0;
4279*53ee8cc1Swenshuai.xi #endif
4280*53ee8cc1Swenshuai.xi     JPD_Symidx structSymidx;
4281*53ee8cc1Swenshuai.xi 
4282*53ee8cc1Swenshuai.xi     JPEG_memset((void *)(&structSymidx), 0, sizeof(structSymidx));
4283*53ee8cc1Swenshuai.xi 
4284*53ee8cc1Swenshuai.xi     // Moved to MDrv_JPD_WriteSymidx()
4285*53ee8cc1Swenshuai.xi     //MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SYMIDX_BASE);
4286*53ee8cc1Swenshuai.xi 
4287*53ee8cc1Swenshuai.xi     if (_HeadCheck.DHT)
4288*53ee8cc1Swenshuai.xi     {
4289*53ee8cc1Swenshuai.xi         for(ci = 0; ci<_u8Comps_in_frame; ci++)
4290*53ee8cc1Swenshuai.xi         {
4291*53ee8cc1Swenshuai.xi             if(_u8LumaCi==_u8Comp_ident[ci])
4292*53ee8cc1Swenshuai.xi             {
4293*53ee8cc1Swenshuai.xi                 luma_ci = ci;
4294*53ee8cc1Swenshuai.xi                 break;
4295*53ee8cc1Swenshuai.xi             }
4296*53ee8cc1Swenshuai.xi         }
4297*53ee8cc1Swenshuai.xi 
4298*53ee8cc1Swenshuai.xi         for(ci = 0; ci<_u8Comps_in_frame; ci++)
4299*53ee8cc1Swenshuai.xi         {
4300*53ee8cc1Swenshuai.xi             if(_u8ChromaCi==_u8Comp_ident[ci])
4301*53ee8cc1Swenshuai.xi             {
4302*53ee8cc1Swenshuai.xi                 chroma_ci = ci;
4303*53ee8cc1Swenshuai.xi                 break;
4304*53ee8cc1Swenshuai.xi             }
4305*53ee8cc1Swenshuai.xi         }
4306*53ee8cc1Swenshuai.xi 
4307*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4308*53ee8cc1Swenshuai.xi         if(TRUE == bIs3HuffTbl)
4309*53ee8cc1Swenshuai.xi         {
4310*53ee8cc1Swenshuai.xi             for(ci = 0; ci<_u8Comps_in_frame; ci++)
4311*53ee8cc1Swenshuai.xi             {
4312*53ee8cc1Swenshuai.xi                 if(_u8Chroma2Ci==_u8Comp_ident[ci])
4313*53ee8cc1Swenshuai.xi                 {
4314*53ee8cc1Swenshuai.xi                     chroma2_ci = ci;
4315*53ee8cc1Swenshuai.xi                     break;
4316*53ee8cc1Swenshuai.xi                 }
4317*53ee8cc1Swenshuai.xi             }
4318*53ee8cc1Swenshuai.xi         }
4319*53ee8cc1Swenshuai.xi #endif
4320*53ee8cc1Swenshuai.xi 
4321*53ee8cc1Swenshuai.xi         //tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4322*53ee8cc1Swenshuai.xi         ac_tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4323*53ee8cc1Swenshuai.xi         //tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4324*53ee8cc1Swenshuai.xi         ac_tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4325*53ee8cc1Swenshuai.xi 
4326*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteSymidx()
4327*53ee8cc1Swenshuai.xi #if 0
4328*53ee8cc1Swenshuai.xi         for ( i = 0; i < 256; i++ )
4329*53ee8cc1Swenshuai.xi         {
4330*53ee8cc1Swenshuai.xi             MDrv_Write2Byte( BK_JPD_TID_DAT, ( _Huff_info[tbl_num_chroma].u8Huff_val[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Huff_val[i] ) );
4331*53ee8cc1Swenshuai.xi         }
4332*53ee8cc1Swenshuai.xi #endif
4333*53ee8cc1Swenshuai.xi 
4334*53ee8cc1Swenshuai.xi         dc_tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4335*53ee8cc1Swenshuai.xi         dc_tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4336*53ee8cc1Swenshuai.xi #if 0
4337*53ee8cc1Swenshuai.xi         for ( i = 0; i < 16; i++ )
4338*53ee8cc1Swenshuai.xi         {
4339*53ee8cc1Swenshuai.xi             MDrv_Write2Byte( BK_JPD_TID_DAT, ( _Huff_info[tbl_num_chroma].u8Huff_val[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Huff_val[i] ) );
4340*53ee8cc1Swenshuai.xi         }
4341*53ee8cc1Swenshuai.xi #endif
4342*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4343*53ee8cc1Swenshuai.xi         if(TRUE == bIs3HuffTbl)
4344*53ee8cc1Swenshuai.xi         {
4345*53ee8cc1Swenshuai.xi             ac_tbl_num_chroma2 = _u8Comp_ac_tab[chroma2_ci];
4346*53ee8cc1Swenshuai.xi             dc_tbl_num_chroma2 = _u8Comp_dc_tab[chroma2_ci];
4347*53ee8cc1Swenshuai.xi         }
4348*53ee8cc1Swenshuai.xi #endif
4349*53ee8cc1Swenshuai.xi     }
4350*53ee8cc1Swenshuai.xi     else
4351*53ee8cc1Swenshuai.xi     {
4352*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteSymidx()
4353*53ee8cc1Swenshuai.xi #if 0
4354*53ee8cc1Swenshuai.xi         for(i=0;i<272;i++)
4355*53ee8cc1Swenshuai.xi             MDrv_Write2Byte( BK_JPD_TID_DAT, g16SYMIDX_TBL[i]);
4356*53ee8cc1Swenshuai.xi #endif
4357*53ee8cc1Swenshuai.xi     }
4358*53ee8cc1Swenshuai.xi 
4359*53ee8cc1Swenshuai.xi     structSymidx.DHT = _HeadCheck.DHT;
4360*53ee8cc1Swenshuai.xi     structSymidx.bUVHuffman = bIs3HuffTbl;
4361*53ee8cc1Swenshuai.xi     structSymidx.u8DcLumaHuffVal = _Huff_info[dc_tbl_num_luma].u8Huff_val;
4362*53ee8cc1Swenshuai.xi     structSymidx.u8DcChromaHuffVal = _Huff_info[dc_tbl_num_chroma].u8Huff_val;
4363*53ee8cc1Swenshuai.xi     structSymidx.u8AcLumaHuffVal = _Huff_info[ac_tbl_num_luma].u8Huff_val;
4364*53ee8cc1Swenshuai.xi     structSymidx.u8AcChromaHuffVal = _Huff_info[ac_tbl_num_chroma].u8Huff_val;
4365*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4366*53ee8cc1Swenshuai.xi     if(TRUE == bIs3HuffTbl)
4367*53ee8cc1Swenshuai.xi     {
4368*53ee8cc1Swenshuai.xi         structSymidx.u8DcChroma2HuffVal = _Huff_info[dc_tbl_num_chroma2].u8Huff_val;
4369*53ee8cc1Swenshuai.xi         structSymidx.u8AcChroma2HuffVal = _Huff_info[ac_tbl_num_chroma2].u8Huff_val;
4370*53ee8cc1Swenshuai.xi     }
4371*53ee8cc1Swenshuai.xi #endif
4372*53ee8cc1Swenshuai.xi     MDrv_JPD_WriteSymidx(structSymidx);
4373*53ee8cc1Swenshuai.xi }
4374*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4375*53ee8cc1Swenshuai.xi //***************************************************
4376*53ee8cc1Swenshuai.xi //write quantization table
4377*53ee8cc1Swenshuai.xi //***************************************************
4378*53ee8cc1Swenshuai.xi #if 0
4379*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_write_Qtbl(void)
4380*53ee8cc1Swenshuai.xi {
4381*53ee8cc1Swenshuai.xi     MS_U8 i, j;
4382*53ee8cc1Swenshuai.xi     MS_U8 com_num = 0;
4383*53ee8cc1Swenshuai.xi     MS_U8 comp[JPEG_MAXCOMPONENTS];
4384*53ee8cc1Swenshuai.xi 
4385*53ee8cc1Swenshuai.xi     MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_QTBL_BASE);
4386*53ee8cc1Swenshuai.xi 
4387*53ee8cc1Swenshuai.xi     if (_HeadCheck.DQT)
4388*53ee8cc1Swenshuai.xi     {
4389*53ee8cc1Swenshuai.xi         // Calculate how many valid quantization tables
4390*53ee8cc1Swenshuai.xi         JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
4391*53ee8cc1Swenshuai.xi         for(i = 0; i<_u8Comps_in_frame; i++)
4392*53ee8cc1Swenshuai.xi         {
4393*53ee8cc1Swenshuai.xi             comp[_u8Comp_quant[i]] = 1;
4394*53ee8cc1Swenshuai.xi         }
4395*53ee8cc1Swenshuai.xi 
4396*53ee8cc1Swenshuai.xi         for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
4397*53ee8cc1Swenshuai.xi         {
4398*53ee8cc1Swenshuai.xi             if(comp[i]==1)
4399*53ee8cc1Swenshuai.xi                 com_num++;
4400*53ee8cc1Swenshuai.xi         }
4401*53ee8cc1Swenshuai.xi 
4402*53ee8cc1Swenshuai.xi         for ( i = 0; i < com_num; i++ )
4403*53ee8cc1Swenshuai.xi         {
4404*53ee8cc1Swenshuai.xi             for(j = 0; j<64; j++)
4405*53ee8cc1Swenshuai.xi             {
4406*53ee8cc1Swenshuai.xi                 MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4407*53ee8cc1Swenshuai.xi             }
4408*53ee8cc1Swenshuai.xi         }
4409*53ee8cc1Swenshuai.xi 
4410*53ee8cc1Swenshuai.xi         // if all compoents refer to the same Qtable, need to write Qtable twice
4411*53ee8cc1Swenshuai.xi         if(com_num==1)
4412*53ee8cc1Swenshuai.xi         {
4413*53ee8cc1Swenshuai.xi             for ( i = 0; i < com_num; i++ )
4414*53ee8cc1Swenshuai.xi             {
4415*53ee8cc1Swenshuai.xi                 for(j = 0; j<64; j++)
4416*53ee8cc1Swenshuai.xi                 {
4417*53ee8cc1Swenshuai.xi                     MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4418*53ee8cc1Swenshuai.xi                 }
4419*53ee8cc1Swenshuai.xi             }
4420*53ee8cc1Swenshuai.xi         }
4421*53ee8cc1Swenshuai.xi     }
4422*53ee8cc1Swenshuai.xi     else
4423*53ee8cc1Swenshuai.xi     {
4424*53ee8cc1Swenshuai.xi         for (i=0; i<128; i++)
4425*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, g16IQ_TBL[i]);
4426*53ee8cc1Swenshuai.xi     }
4427*53ee8cc1Swenshuai.xi }
4428*53ee8cc1Swenshuai.xi #endif
JPEG_WriteIQTbl(void)4429*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_WriteIQTbl(void)
4430*53ee8cc1Swenshuai.xi {
4431*53ee8cc1Swenshuai.xi     //MS_U8 i, j;
4432*53ee8cc1Swenshuai.xi     MS_U8 i;
4433*53ee8cc1Swenshuai.xi     MS_U8 com_num = 0;
4434*53ee8cc1Swenshuai.xi     MS_U8 comp[JPEG_MAXCOMPONENTS];
4435*53ee8cc1Swenshuai.xi     JPD_IQTbl structIqtbl;
4436*53ee8cc1Swenshuai.xi 
4437*53ee8cc1Swenshuai.xi     JPEG_memset((void *)&structIqtbl, 0, sizeof(structIqtbl));
4438*53ee8cc1Swenshuai.xi 
4439*53ee8cc1Swenshuai.xi     // Moved to MDrv_JPD_WriteIQTbl()
4440*53ee8cc1Swenshuai.xi     //MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_QTBL_BASE);
4441*53ee8cc1Swenshuai.xi 
4442*53ee8cc1Swenshuai.xi     if (_HeadCheck.DQT)
4443*53ee8cc1Swenshuai.xi     {
4444*53ee8cc1Swenshuai.xi         // Calculate how many valid quantization tables
4445*53ee8cc1Swenshuai.xi         JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
4446*53ee8cc1Swenshuai.xi         for(i = 0; i<_u8Comps_in_frame; i++)
4447*53ee8cc1Swenshuai.xi         {
4448*53ee8cc1Swenshuai.xi             comp[_u8Comp_quant[i]] = 1;
4449*53ee8cc1Swenshuai.xi         }
4450*53ee8cc1Swenshuai.xi 
4451*53ee8cc1Swenshuai.xi         for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
4452*53ee8cc1Swenshuai.xi         {
4453*53ee8cc1Swenshuai.xi             if(comp[i]==1)
4454*53ee8cc1Swenshuai.xi                 com_num++;
4455*53ee8cc1Swenshuai.xi         }
4456*53ee8cc1Swenshuai.xi 
4457*53ee8cc1Swenshuai.xi         // Moved to MDrv_JPD_WriteIQTbl
4458*53ee8cc1Swenshuai.xi #if 0
4459*53ee8cc1Swenshuai.xi         for ( i = 0; i < com_num; i++ )
4460*53ee8cc1Swenshuai.xi         {
4461*53ee8cc1Swenshuai.xi             for(j = 0; j<64; j++)
4462*53ee8cc1Swenshuai.xi             {
4463*53ee8cc1Swenshuai.xi                 MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4464*53ee8cc1Swenshuai.xi             }
4465*53ee8cc1Swenshuai.xi         }
4466*53ee8cc1Swenshuai.xi 
4467*53ee8cc1Swenshuai.xi         // if all compoents refer to the same Qtable, need to write Qtable twice
4468*53ee8cc1Swenshuai.xi         if(com_num==1)
4469*53ee8cc1Swenshuai.xi         {
4470*53ee8cc1Swenshuai.xi             for ( i = 0; i < com_num; i++ )
4471*53ee8cc1Swenshuai.xi             {
4472*53ee8cc1Swenshuai.xi                 for(j = 0; j<64; j++)
4473*53ee8cc1Swenshuai.xi                 {
4474*53ee8cc1Swenshuai.xi                     MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4475*53ee8cc1Swenshuai.xi                 }
4476*53ee8cc1Swenshuai.xi             }
4477*53ee8cc1Swenshuai.xi         }
4478*53ee8cc1Swenshuai.xi #endif
4479*53ee8cc1Swenshuai.xi     }
4480*53ee8cc1Swenshuai.xi     else
4481*53ee8cc1Swenshuai.xi     {
4482*53ee8cc1Swenshuai.xi         // Moved to MDrv_JPD_WriteIQTbl()
4483*53ee8cc1Swenshuai.xi #if 0
4484*53ee8cc1Swenshuai.xi         for (i=0; i<128; i++)
4485*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, g16IQ_TBL[i]);
4486*53ee8cc1Swenshuai.xi #endif
4487*53ee8cc1Swenshuai.xi     }
4488*53ee8cc1Swenshuai.xi 
4489*53ee8cc1Swenshuai.xi     structIqtbl.DQT = _HeadCheck.DQT;
4490*53ee8cc1Swenshuai.xi     structIqtbl.u8CompNum = com_num;
4491*53ee8cc1Swenshuai.xi     structIqtbl.u8CompQuant = _u8Comp_quant;
4492*53ee8cc1Swenshuai.xi     structIqtbl.QuantTables = (JPD_QuanTbl *)_QuantTables;
4493*53ee8cc1Swenshuai.xi     MDrv_JPD_WriteIQTbl(structIqtbl);
4494*53ee8cc1Swenshuai.xi }
4495*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4496*53ee8cc1Swenshuai.xi //*************************************************
4497*53ee8cc1Swenshuai.xi //write group information
4498*53ee8cc1Swenshuai.xi //*************************************************
4499*53ee8cc1Swenshuai.xi #if 0
4500*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_write_Scwgif(void) //type : luma=>0  chroma=>1
4501*53ee8cc1Swenshuai.xi {
4502*53ee8cc1Swenshuai.xi     MS_U32 reg_value;
4503*53ee8cc1Swenshuai.xi     MS_U16 i, ci, valid, tbl_num_luma, tbl_num_chroma;
4504*53ee8cc1Swenshuai.xi     MS_U8 luma_ci = 0, chroma_ci = 0;
4505*53ee8cc1Swenshuai.xi 
4506*53ee8cc1Swenshuai.xi     MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SCWGIF_BASE);
4507*53ee8cc1Swenshuai.xi     if (_HeadCheck.DHT)
4508*53ee8cc1Swenshuai.xi     {
4509*53ee8cc1Swenshuai.xi         for(ci = 0; ci<_u8Comps_in_frame; ci++)
4510*53ee8cc1Swenshuai.xi         {
4511*53ee8cc1Swenshuai.xi             if(_u8LumaCi==_u8Comp_ident[ci])
4512*53ee8cc1Swenshuai.xi             {
4513*53ee8cc1Swenshuai.xi                 luma_ci = ci;
4514*53ee8cc1Swenshuai.xi                 break;
4515*53ee8cc1Swenshuai.xi             }
4516*53ee8cc1Swenshuai.xi         }
4517*53ee8cc1Swenshuai.xi 
4518*53ee8cc1Swenshuai.xi         for(ci = 0; ci<_u8Comps_in_frame; ci++)
4519*53ee8cc1Swenshuai.xi         {
4520*53ee8cc1Swenshuai.xi             if(_u8ChromaCi==_u8Comp_ident[ci])
4521*53ee8cc1Swenshuai.xi             {
4522*53ee8cc1Swenshuai.xi                 chroma_ci = ci;
4523*53ee8cc1Swenshuai.xi                 break;
4524*53ee8cc1Swenshuai.xi             }
4525*53ee8cc1Swenshuai.xi         }
4526*53ee8cc1Swenshuai.xi 
4527*53ee8cc1Swenshuai.xi         tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4528*53ee8cc1Swenshuai.xi         tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4529*53ee8cc1Swenshuai.xi 
4530*53ee8cc1Swenshuai.xi         for ( i = 1; i <= 16; i++ )
4531*53ee8cc1Swenshuai.xi         {
4532*53ee8cc1Swenshuai.xi             if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4533*53ee8cc1Swenshuai.xi                 valid = 0;
4534*53ee8cc1Swenshuai.xi             else
4535*53ee8cc1Swenshuai.xi                 valid = 1;
4536*53ee8cc1Swenshuai.xi 
4537*53ee8cc1Swenshuai.xi             if ( valid )
4538*53ee8cc1Swenshuai.xi             {
4539*53ee8cc1Swenshuai.xi                 reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] << 4 );
4540*53ee8cc1Swenshuai.xi             }
4541*53ee8cc1Swenshuai.xi             else
4542*53ee8cc1Swenshuai.xi             {
4543*53ee8cc1Swenshuai.xi                 reg_value = 0;
4544*53ee8cc1Swenshuai.xi             }
4545*53ee8cc1Swenshuai.xi 
4546*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4547*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4548*53ee8cc1Swenshuai.xi         }
4549*53ee8cc1Swenshuai.xi 
4550*53ee8cc1Swenshuai.xi         for ( i = 1; i <= 16; i++ )
4551*53ee8cc1Swenshuai.xi         {
4552*53ee8cc1Swenshuai.xi             if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4553*53ee8cc1Swenshuai.xi                 valid = 0;
4554*53ee8cc1Swenshuai.xi             else
4555*53ee8cc1Swenshuai.xi                 valid = 1;
4556*53ee8cc1Swenshuai.xi 
4557*53ee8cc1Swenshuai.xi             if ( valid )
4558*53ee8cc1Swenshuai.xi             {
4559*53ee8cc1Swenshuai.xi                 reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] << 4 );
4560*53ee8cc1Swenshuai.xi             }
4561*53ee8cc1Swenshuai.xi             else
4562*53ee8cc1Swenshuai.xi             {
4563*53ee8cc1Swenshuai.xi                 reg_value = 0;
4564*53ee8cc1Swenshuai.xi             }
4565*53ee8cc1Swenshuai.xi 
4566*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4567*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4568*53ee8cc1Swenshuai.xi         }
4569*53ee8cc1Swenshuai.xi 
4570*53ee8cc1Swenshuai.xi         tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4571*53ee8cc1Swenshuai.xi         tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4572*53ee8cc1Swenshuai.xi 
4573*53ee8cc1Swenshuai.xi         for ( i = 1; i <= 16; i++ )
4574*53ee8cc1Swenshuai.xi         {
4575*53ee8cc1Swenshuai.xi             if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4576*53ee8cc1Swenshuai.xi                 valid = 0;
4577*53ee8cc1Swenshuai.xi             else
4578*53ee8cc1Swenshuai.xi                 valid = 1;
4579*53ee8cc1Swenshuai.xi 
4580*53ee8cc1Swenshuai.xi             if ( valid )
4581*53ee8cc1Swenshuai.xi             {
4582*53ee8cc1Swenshuai.xi                 reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] );
4583*53ee8cc1Swenshuai.xi             }
4584*53ee8cc1Swenshuai.xi             else
4585*53ee8cc1Swenshuai.xi             {
4586*53ee8cc1Swenshuai.xi                 reg_value = 0;
4587*53ee8cc1Swenshuai.xi             }
4588*53ee8cc1Swenshuai.xi 
4589*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4590*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4591*53ee8cc1Swenshuai.xi         }
4592*53ee8cc1Swenshuai.xi 
4593*53ee8cc1Swenshuai.xi         for ( i = 1; i <= 16; i++ )
4594*53ee8cc1Swenshuai.xi         {
4595*53ee8cc1Swenshuai.xi             if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4596*53ee8cc1Swenshuai.xi                 valid = 0;
4597*53ee8cc1Swenshuai.xi             else
4598*53ee8cc1Swenshuai.xi                 valid = 1;
4599*53ee8cc1Swenshuai.xi 
4600*53ee8cc1Swenshuai.xi             if ( valid )
4601*53ee8cc1Swenshuai.xi             {
4602*53ee8cc1Swenshuai.xi                 reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] );
4603*53ee8cc1Swenshuai.xi             }
4604*53ee8cc1Swenshuai.xi             else
4605*53ee8cc1Swenshuai.xi             {
4606*53ee8cc1Swenshuai.xi                 reg_value = 0;
4607*53ee8cc1Swenshuai.xi             }
4608*53ee8cc1Swenshuai.xi 
4609*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4610*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4611*53ee8cc1Swenshuai.xi         }
4612*53ee8cc1Swenshuai.xi     }
4613*53ee8cc1Swenshuai.xi     else
4614*53ee8cc1Swenshuai.xi     {
4615*53ee8cc1Swenshuai.xi         for( i = 0; i < 128; i++ )
4616*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, g16GRPINFO_TBL[i]);
4617*53ee8cc1Swenshuai.xi     }
4618*53ee8cc1Swenshuai.xi }
4619*53ee8cc1Swenshuai.xi #endif
JPEG_WriteGrpinf(void)4620*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_WriteGrpinf(void) //type : luma=>0  chroma=>1
4621*53ee8cc1Swenshuai.xi {
4622*53ee8cc1Swenshuai.xi     //MS_U32 reg_value;
4623*53ee8cc1Swenshuai.xi     //MS_U16 i, ci, valid, tbl_num_luma, tbl_num_chroma;
4624*53ee8cc1Swenshuai.xi     MS_U16 ci, dc_tbl_num_luma = 0, dc_tbl_num_chroma = 0;
4625*53ee8cc1Swenshuai.xi     MS_U16 ac_tbl_num_luma = 0, ac_tbl_num_chroma = 0;
4626*53ee8cc1Swenshuai.xi     MS_U8 luma_ci = 0, chroma_ci = 0;
4627*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4628*53ee8cc1Swenshuai.xi     MS_U16 dc_tbl_num_chroma2 = 0;
4629*53ee8cc1Swenshuai.xi     MS_U16 ac_tbl_num_chroma2 = 0;
4630*53ee8cc1Swenshuai.xi     MS_U8 chroma2_ci = 0;
4631*53ee8cc1Swenshuai.xi #endif
4632*53ee8cc1Swenshuai.xi     JPD_Grpinf structGrpinf;
4633*53ee8cc1Swenshuai.xi 
4634*53ee8cc1Swenshuai.xi     JPEG_memset((void *)&structGrpinf, 0, sizeof(structGrpinf));
4635*53ee8cc1Swenshuai.xi 
4636*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteGrpinf()
4637*53ee8cc1Swenshuai.xi #if 0
4638*53ee8cc1Swenshuai.xi     //MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SCWGIF_BASE);
4639*53ee8cc1Swenshuai.xi #endif
4640*53ee8cc1Swenshuai.xi     if (_HeadCheck.DHT)
4641*53ee8cc1Swenshuai.xi     {
4642*53ee8cc1Swenshuai.xi         for(ci = 0; ci<_u8Comps_in_frame; ci++)
4643*53ee8cc1Swenshuai.xi         {
4644*53ee8cc1Swenshuai.xi             if(_u8LumaCi==_u8Comp_ident[ci])
4645*53ee8cc1Swenshuai.xi             {
4646*53ee8cc1Swenshuai.xi                 luma_ci = ci;
4647*53ee8cc1Swenshuai.xi                 break;
4648*53ee8cc1Swenshuai.xi             }
4649*53ee8cc1Swenshuai.xi         }
4650*53ee8cc1Swenshuai.xi 
4651*53ee8cc1Swenshuai.xi         for(ci = 0; ci<_u8Comps_in_frame; ci++)
4652*53ee8cc1Swenshuai.xi         {
4653*53ee8cc1Swenshuai.xi             if(_u8ChromaCi==_u8Comp_ident[ci])
4654*53ee8cc1Swenshuai.xi             {
4655*53ee8cc1Swenshuai.xi                 chroma_ci = ci;
4656*53ee8cc1Swenshuai.xi                 break;
4657*53ee8cc1Swenshuai.xi             }
4658*53ee8cc1Swenshuai.xi         }
4659*53ee8cc1Swenshuai.xi 
4660*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4661*53ee8cc1Swenshuai.xi         if(TRUE == bIs3HuffTbl)
4662*53ee8cc1Swenshuai.xi         {
4663*53ee8cc1Swenshuai.xi             for(ci = 0; ci<_u8Comps_in_frame; ci++)
4664*53ee8cc1Swenshuai.xi             {
4665*53ee8cc1Swenshuai.xi                 if(_u8Chroma2Ci==_u8Comp_ident[ci])
4666*53ee8cc1Swenshuai.xi                 {
4667*53ee8cc1Swenshuai.xi                     chroma2_ci = ci;
4668*53ee8cc1Swenshuai.xi                     break;
4669*53ee8cc1Swenshuai.xi                 }
4670*53ee8cc1Swenshuai.xi             }
4671*53ee8cc1Swenshuai.xi         }
4672*53ee8cc1Swenshuai.xi #endif
4673*53ee8cc1Swenshuai.xi 
4674*53ee8cc1Swenshuai.xi         dc_tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4675*53ee8cc1Swenshuai.xi         dc_tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4676*53ee8cc1Swenshuai.xi 
4677*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteGrpinf()
4678*53ee8cc1Swenshuai.xi #if 0
4679*53ee8cc1Swenshuai.xi         for ( i = 1; i <= 16; i++ )
4680*53ee8cc1Swenshuai.xi         {
4681*53ee8cc1Swenshuai.xi             if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4682*53ee8cc1Swenshuai.xi                 valid = 0;
4683*53ee8cc1Swenshuai.xi             else
4684*53ee8cc1Swenshuai.xi                 valid = 1;
4685*53ee8cc1Swenshuai.xi 
4686*53ee8cc1Swenshuai.xi             if ( valid )
4687*53ee8cc1Swenshuai.xi             {
4688*53ee8cc1Swenshuai.xi                 reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] << 4 );
4689*53ee8cc1Swenshuai.xi             }
4690*53ee8cc1Swenshuai.xi             else
4691*53ee8cc1Swenshuai.xi             {
4692*53ee8cc1Swenshuai.xi                 reg_value = 0;
4693*53ee8cc1Swenshuai.xi             }
4694*53ee8cc1Swenshuai.xi 
4695*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4696*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4697*53ee8cc1Swenshuai.xi         }
4698*53ee8cc1Swenshuai.xi 
4699*53ee8cc1Swenshuai.xi         for ( i = 1; i <= 16; i++ )
4700*53ee8cc1Swenshuai.xi         {
4701*53ee8cc1Swenshuai.xi             if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4702*53ee8cc1Swenshuai.xi                 valid = 0;
4703*53ee8cc1Swenshuai.xi             else
4704*53ee8cc1Swenshuai.xi                 valid = 1;
4705*53ee8cc1Swenshuai.xi 
4706*53ee8cc1Swenshuai.xi             if ( valid )
4707*53ee8cc1Swenshuai.xi             {
4708*53ee8cc1Swenshuai.xi                 reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] << 4 );
4709*53ee8cc1Swenshuai.xi             }
4710*53ee8cc1Swenshuai.xi             else
4711*53ee8cc1Swenshuai.xi             {
4712*53ee8cc1Swenshuai.xi                 reg_value = 0;
4713*53ee8cc1Swenshuai.xi             }
4714*53ee8cc1Swenshuai.xi 
4715*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4716*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4717*53ee8cc1Swenshuai.xi         }
4718*53ee8cc1Swenshuai.xi #endif
4719*53ee8cc1Swenshuai.xi 
4720*53ee8cc1Swenshuai.xi         ac_tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4721*53ee8cc1Swenshuai.xi         ac_tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4722*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteGrpinf()
4723*53ee8cc1Swenshuai.xi #if 0
4724*53ee8cc1Swenshuai.xi         for ( i = 1; i <= 16; i++ )
4725*53ee8cc1Swenshuai.xi         {
4726*53ee8cc1Swenshuai.xi             if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4727*53ee8cc1Swenshuai.xi                 valid = 0;
4728*53ee8cc1Swenshuai.xi             else
4729*53ee8cc1Swenshuai.xi                 valid = 1;
4730*53ee8cc1Swenshuai.xi 
4731*53ee8cc1Swenshuai.xi             if ( valid )
4732*53ee8cc1Swenshuai.xi             {
4733*53ee8cc1Swenshuai.xi                 reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] );
4734*53ee8cc1Swenshuai.xi             }
4735*53ee8cc1Swenshuai.xi             else
4736*53ee8cc1Swenshuai.xi             {
4737*53ee8cc1Swenshuai.xi                 reg_value = 0;
4738*53ee8cc1Swenshuai.xi             }
4739*53ee8cc1Swenshuai.xi 
4740*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4741*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4742*53ee8cc1Swenshuai.xi         }
4743*53ee8cc1Swenshuai.xi 
4744*53ee8cc1Swenshuai.xi         for ( i = 1; i <= 16; i++ )
4745*53ee8cc1Swenshuai.xi         {
4746*53ee8cc1Swenshuai.xi             if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4747*53ee8cc1Swenshuai.xi                 valid = 0;
4748*53ee8cc1Swenshuai.xi             else
4749*53ee8cc1Swenshuai.xi                 valid = 1;
4750*53ee8cc1Swenshuai.xi 
4751*53ee8cc1Swenshuai.xi             if ( valid )
4752*53ee8cc1Swenshuai.xi             {
4753*53ee8cc1Swenshuai.xi                 reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] );
4754*53ee8cc1Swenshuai.xi             }
4755*53ee8cc1Swenshuai.xi             else
4756*53ee8cc1Swenshuai.xi             {
4757*53ee8cc1Swenshuai.xi                 reg_value = 0;
4758*53ee8cc1Swenshuai.xi             }
4759*53ee8cc1Swenshuai.xi 
4760*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4761*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4762*53ee8cc1Swenshuai.xi         }
4763*53ee8cc1Swenshuai.xi #endif
4764*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4765*53ee8cc1Swenshuai.xi         if(TRUE == bIs3HuffTbl)
4766*53ee8cc1Swenshuai.xi         {
4767*53ee8cc1Swenshuai.xi             dc_tbl_num_chroma2 = _u8Comp_dc_tab[chroma2_ci];
4768*53ee8cc1Swenshuai.xi             ac_tbl_num_chroma2 = _u8Comp_ac_tab[chroma2_ci];
4769*53ee8cc1Swenshuai.xi         }
4770*53ee8cc1Swenshuai.xi #endif
4771*53ee8cc1Swenshuai.xi     }
4772*53ee8cc1Swenshuai.xi     else
4773*53ee8cc1Swenshuai.xi     {
4774*53ee8cc1Swenshuai.xi #if 0
4775*53ee8cc1Swenshuai.xi         for( i = 0; i < 128; i++ )
4776*53ee8cc1Swenshuai.xi             MDrv_Write2Byte(BK_JPD_TID_DAT, g16GRPINFO_TBL[i]);
4777*53ee8cc1Swenshuai.xi #endif
4778*53ee8cc1Swenshuai.xi     }
4779*53ee8cc1Swenshuai.xi 
4780*53ee8cc1Swenshuai.xi     structGrpinf.DHT = _HeadCheck.DHT;
4781*53ee8cc1Swenshuai.xi     structGrpinf.bUVHuffman = bIs3HuffTbl;
4782*53ee8cc1Swenshuai.xi     structGrpinf.u8DcLumaSymbol = _Huff_info[dc_tbl_num_luma].u8Symbol;
4783*53ee8cc1Swenshuai.xi     structGrpinf.u16DcLumaCode = _Huff_info[dc_tbl_num_luma].u16Code;
4784*53ee8cc1Swenshuai.xi     structGrpinf.u8DcChromaSymbol = _Huff_info[dc_tbl_num_chroma].u8Symbol;
4785*53ee8cc1Swenshuai.xi     structGrpinf.u16DcChromaCode = _Huff_info[dc_tbl_num_chroma].u16Code;
4786*53ee8cc1Swenshuai.xi     structGrpinf.u8AcLumaSymbol = _Huff_info[ac_tbl_num_luma].u8Symbol;
4787*53ee8cc1Swenshuai.xi     structGrpinf.u16AcLumaCode = _Huff_info[ac_tbl_num_luma].u16Code;
4788*53ee8cc1Swenshuai.xi     structGrpinf.u8AcChromaSymbol = _Huff_info[ac_tbl_num_chroma].u8Symbol;
4789*53ee8cc1Swenshuai.xi     structGrpinf.u16AcChromaCode = _Huff_info[ac_tbl_num_chroma].u16Code;
4790*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4791*53ee8cc1Swenshuai.xi     if(TRUE == bIs3HuffTbl)
4792*53ee8cc1Swenshuai.xi     {
4793*53ee8cc1Swenshuai.xi         structGrpinf.u8DcChroma2Symbol = _Huff_info[dc_tbl_num_chroma2].u8Symbol;
4794*53ee8cc1Swenshuai.xi         structGrpinf.u16DcChroma2Code = _Huff_info[dc_tbl_num_chroma2].u16Code;
4795*53ee8cc1Swenshuai.xi         structGrpinf.u8AcChroma2Symbol = _Huff_info[ac_tbl_num_chroma2].u8Symbol;
4796*53ee8cc1Swenshuai.xi         structGrpinf.u16AcChroma2Code = _Huff_info[ac_tbl_num_chroma2].u16Code;
4797*53ee8cc1Swenshuai.xi     }
4798*53ee8cc1Swenshuai.xi #endif
4799*53ee8cc1Swenshuai.xi     MDrv_JPD_WriteGrpinf(structGrpinf);
4800*53ee8cc1Swenshuai.xi }
4801*53ee8cc1Swenshuai.xi #endif /* #ifndef CMODEL */
4802*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4803*53ee8cc1Swenshuai.xi // Write RLE result
JPEG_write_RLE(JPEG_SVLD * pVld,MS_BOOL bDecodeNow)4804*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_write_RLE(JPEG_SVLD *pVld, MS_BOOL bDecodeNow)
4805*53ee8cc1Swenshuai.xi {
4806*53ee8cc1Swenshuai.xi #ifdef CMODEL
4807*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%02x%02x%02x%02x\n",(MS_U8)pVld->byte3, (MS_U8)pVld->byte2, (MS_U8)pVld->byte1, (MS_U8)pVld->byte0);
4808*53ee8cc1Swenshuai.xi #else
4809*53ee8cc1Swenshuai.xi     MS_U8 *mrc_buffer = (MS_U8 *) MRC_BUFFER_ADDR;
4810*53ee8cc1Swenshuai.xi     MS_U16 status;
4811*53ee8cc1Swenshuai.xi     MS_U32 start_time;
4812*53ee8cc1Swenshuai.xi     MS_U16 cur_vIdx;
4813*53ee8cc1Swenshuai.xi 
4814*53ee8cc1Swenshuai.xi     JPEG_memcpy((void *)(mrc_buffer + _u32RLEOffset), (void *)pVld, 4);
4815*53ee8cc1Swenshuai.xi     _u32RLEOffset += 4;
4816*53ee8cc1Swenshuai.xi 
4817*53ee8cc1Swenshuai.xi     // Check if buffer full
4818*53ee8cc1Swenshuai.xi     if((MRC_BUFFER_SIZE == _u32RLEOffset)
4819*53ee8cc1Swenshuai.xi     || (TRUE == bDecodeNow))
4820*53ee8cc1Swenshuai.xi     {
4821*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("Do RLE, LENG 0x%lx, bDecodeNow = %d\n", _u32RLEOffset, bDecodeNow);
4822*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("CPU Sync and Flush Memory~~~~\n");
4823*53ee8cc1Swenshuai.xi         MAsm_CPU_Sync();
4824*53ee8cc1Swenshuai.xi         MsOS_FlushMemory();
4825*53ee8cc1Swenshuai.xi 
4826*53ee8cc1Swenshuai.xi         if(_bFirstRLE == TRUE)
4827*53ee8cc1Swenshuai.xi         {
4828*53ee8cc1Swenshuai.xi             // Trigger JPD decoding
4829*53ee8cc1Swenshuai.xi             if(!JPEG_StartDecode())
4830*53ee8cc1Swenshuai.xi                 return FALSE;
4831*53ee8cc1Swenshuai.xi             _bFirstRLE = FALSE;
4832*53ee8cc1Swenshuai.xi         }
4833*53ee8cc1Swenshuai.xi         else
4834*53ee8cc1Swenshuai.xi         {
4835*53ee8cc1Swenshuai.xi             // clear MRC low/high portion read complete event
4836*53ee8cc1Swenshuai.xi             //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE | E_JPD_EVENT_MRBL_DONE);
4837*53ee8cc1Swenshuai.xi             MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE | E_JPD_EVENT_MRBL_DONE);
4838*53ee8cc1Swenshuai.xi             // mark low/high buffer valid
4839*53ee8cc1Swenshuai.xi             //MDrv_Write2Byte( BK_JPD_MCONFIG, (MDrv_Read2Byte(BK_JPD_MCONFIG) & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
4840*53ee8cc1Swenshuai.xi             MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
4841*53ee8cc1Swenshuai.xi         }
4842*53ee8cc1Swenshuai.xi 
4843*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
4844*53ee8cc1Swenshuai.xi         start_time = MsOS_GetSystemTime();
4845*53ee8cc1Swenshuai.xi #else
4846*53ee8cc1Swenshuai.xi         start_time = 0;
4847*53ee8cc1Swenshuai.xi #endif
4848*53ee8cc1Swenshuai.xi         //cur_vIdx = MDrv_Read2Byte(BK_JPD_CUR_VIDX);
4849*53ee8cc1Swenshuai.xi         cur_vIdx = MDrv_JPD_GetCurVidx();
4850*53ee8cc1Swenshuai.xi 
4851*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("cur_vIdx = 0x%04X\n",cur_vIdx);
4852*53ee8cc1Swenshuai.xi 
4853*53ee8cc1Swenshuai.xi         if( bDecodeNow )
4854*53ee8cc1Swenshuai.xi         {
4855*53ee8cc1Swenshuai.xi             return TRUE;  //wait done in main loop
4856*53ee8cc1Swenshuai.xi         }
4857*53ee8cc1Swenshuai.xi 
4858*53ee8cc1Swenshuai.xi         while(1)
4859*53ee8cc1Swenshuai.xi         {
4860*53ee8cc1Swenshuai.xi             //status = MDrv_JPD_ReadJPDStatus();
4861*53ee8cc1Swenshuai.xi             status = MDrv_JPD_GetEventFlag();
4862*53ee8cc1Swenshuai.xi 
4863*53ee8cc1Swenshuai.xi             if(status & E_JPD_EVENT_DEC_DONE)
4864*53ee8cc1Swenshuai.xi             {
4865*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("P deocde done\n");
4866*53ee8cc1Swenshuai.xi                 break;
4867*53ee8cc1Swenshuai.xi             }
4868*53ee8cc1Swenshuai.xi 
4869*53ee8cc1Swenshuai.xi             if((status & E_JPD_EVENT_ECS_ERROR) || (status & E_JPD_EVENT_IS_ERROR) || (status & E_JPD_EVENT_RST_ERROR)
4870*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_AUTO_PROTECT==true)
4871*53ee8cc1Swenshuai.xi                 || (status & E_JPD_EVENT_MWB_FULL)
4872*53ee8cc1Swenshuai.xi #endif
4873*53ee8cc1Swenshuai.xi                 )
4874*53ee8cc1Swenshuai.xi             {
4875*53ee8cc1Swenshuai.xi                 // temp patch for protect JPD from writing to illegal memory
4876*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("CurVidx = %d, CurRow = %d, CurCol = %d ",
4877*53ee8cc1Swenshuai.xi                         MDrv_JPD_GetCurVidx(),
4878*53ee8cc1Swenshuai.xi                         MDrv_JPD_GetCurRow(),
4879*53ee8cc1Swenshuai.xi                         MDrv_JPD_GetCurCol());
4880*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%lx\n", MDrv_JPD_GetCurMRCAddr());
4881*53ee8cc1Swenshuai.xi                 //MDrv_JPD_SW_Pause_Reset();
4882*53ee8cc1Swenshuai.xi                 MDrv_JPD_Rst();
4883*53ee8cc1Swenshuai.xi 
4884*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_JPD_DECODE_ERROR );
4885*53ee8cc1Swenshuai.xi                 return FALSE;
4886*53ee8cc1Swenshuai.xi             }
4887*53ee8cc1Swenshuai.xi 
4888*53ee8cc1Swenshuai.xi             if((status & E_JPD_EVENT_MRBH_DONE) && (status & E_JPD_EVENT_MRBL_DONE))
4889*53ee8cc1Swenshuai.xi             {
4890*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("Partial SVLD decode done\n");
4891*53ee8cc1Swenshuai.xi                 break;
4892*53ee8cc1Swenshuai.xi             }
4893*53ee8cc1Swenshuai.xi 
4894*53ee8cc1Swenshuai.xi             // Check the V index. If it is not changed withing 500ms, it means that the JPD has some problem.
4895*53ee8cc1Swenshuai.xi             // We need to break the infinite loop
4896*53ee8cc1Swenshuai.xi             //if(cur_vIdx!=MDrv_Read2Byte(BK_JPD_CUR_VIDX))
4897*53ee8cc1Swenshuai.xi             if(cur_vIdx != MDrv_JPD_GetCurVidx())
4898*53ee8cc1Swenshuai.xi             {
4899*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
4900*53ee8cc1Swenshuai.xi                 start_time = MsOS_GetSystemTime();
4901*53ee8cc1Swenshuai.xi #else
4902*53ee8cc1Swenshuai.xi                 start_time = 0;
4903*53ee8cc1Swenshuai.xi #endif
4904*53ee8cc1Swenshuai.xi                 //cur_vIdx = MDrv_Read2Byte(BK_JPD_CUR_VIDX);
4905*53ee8cc1Swenshuai.xi                 cur_vIdx = MDrv_JPD_GetCurVidx();
4906*53ee8cc1Swenshuai.xi             }
4907*53ee8cc1Swenshuai.xi             else
4908*53ee8cc1Swenshuai.xi             {
4909*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
4910*53ee8cc1Swenshuai.xi                 if((MsOS_GetSystemTime() - start_time) >= DEFAULT_DECODE_TIMEOUT)
4911*53ee8cc1Swenshuai.xi #else
4912*53ee8cc1Swenshuai.xi                 if(start_time++ >= DEFAULT_DECODE_TIMEOUT * 100)
4913*53ee8cc1Swenshuai.xi #endif
4914*53ee8cc1Swenshuai.xi                 {
4915*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_ERR("ERROR: SVLD deocde time out, VIdx %d\n", cur_vIdx);
4916*53ee8cc1Swenshuai.xi                     return FALSE;
4917*53ee8cc1Swenshuai.xi                 }
4918*53ee8cc1Swenshuai.xi             }
4919*53ee8cc1Swenshuai.xi         }
4920*53ee8cc1Swenshuai.xi 
4921*53ee8cc1Swenshuai.xi         _u32RLEOffset = 0;
4922*53ee8cc1Swenshuai.xi     }
4923*53ee8cc1Swenshuai.xi #endif
4924*53ee8cc1Swenshuai.xi     return TRUE;
4925*53ee8cc1Swenshuai.xi }
4926*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4927*53ee8cc1Swenshuai.xi // Do run length encode of coefficient buffer
4928*53ee8cc1Swenshuai.xi //JPEG_STATIC void JPEG_do_RLE(JPEG_BLOCK_TYPE *p, MS_BOOL eop, MS_U8 comp_id)
JPEG_do_RLE(JPEG_BLOCK_TYPE * p,MS_BOOL eop,MS_U8 comp_id,MS_BOOL BlockInRange)4929*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_do_RLE(JPEG_BLOCK_TYPE *p, MS_BOOL eop, MS_U8 comp_id, MS_BOOL BlockInRange)
4930*53ee8cc1Swenshuai.xi {
4931*53ee8cc1Swenshuai.xi     JPEG_SVLD my_vld;
4932*53ee8cc1Swenshuai.xi     MS_U8 counter;
4933*53ee8cc1Swenshuai.xi     MS_S16 value;
4934*53ee8cc1Swenshuai.xi     MS_U16 run;
4935*53ee8cc1Swenshuai.xi     MS_U8 cur_blk;
4936*53ee8cc1Swenshuai.xi     JPEG_BLOCK_TYPE predictor;
4937*53ee8cc1Swenshuai.xi 
4938*53ee8cc1Swenshuai.xi     if(comp_id==0)
4939*53ee8cc1Swenshuai.xi         cur_blk = 1;     // Y
4940*53ee8cc1Swenshuai.xi     else if(comp_id==1)
4941*53ee8cc1Swenshuai.xi         cur_blk = 3;    // U
4942*53ee8cc1Swenshuai.xi     else
4943*53ee8cc1Swenshuai.xi         cur_blk = 2;    // V
4944*53ee8cc1Swenshuai.xi 
4945*53ee8cc1Swenshuai.xi     predictor = _s16dc_pred[cur_blk - 1];
4946*53ee8cc1Swenshuai.xi 
4947*53ee8cc1Swenshuai.xi     run = 0;
4948*53ee8cc1Swenshuai.xi     my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4949*53ee8cc1Swenshuai.xi     my_vld.blk_type = cur_blk;
4950*53ee8cc1Swenshuai.xi 
4951*53ee8cc1Swenshuai.xi     //sent DC info
4952*53ee8cc1Swenshuai.xi ////    my_vld.run = 8;
4953*53ee8cc1Swenshuai.xi     if( BlockInRange )//Current block is within display range.
4954*53ee8cc1Swenshuai.xi         my_vld.run = 8;
4955*53ee8cc1Swenshuai.xi     else
4956*53ee8cc1Swenshuai.xi         my_vld.run = 0;
4957*53ee8cc1Swenshuai.xi 
4958*53ee8cc1Swenshuai.xi     value = (p[0] - predictor);
4959*53ee8cc1Swenshuai.xi     my_vld.sign = (value<0)?1:0;
4960*53ee8cc1Swenshuai.xi     my_vld.amp = JPEG_ABS(value);
4961*53ee8cc1Swenshuai.xi     my_vld.sym_type = E_RLE_DC;
4962*53ee8cc1Swenshuai.xi     if(!JPEG_write_RLE(&my_vld, FALSE))
4963*53ee8cc1Swenshuai.xi         return FALSE;
4964*53ee8cc1Swenshuai.xi 
4965*53ee8cc1Swenshuai.xi     if( BlockInRange == FALSE )//Current block is not within display range.
4966*53ee8cc1Swenshuai.xi         return TRUE;
4967*53ee8cc1Swenshuai.xi 
4968*53ee8cc1Swenshuai.xi     my_vld.byte0 = my_vld.byte1 =my_vld.byte2 = my_vld.byte3= 0;
4969*53ee8cc1Swenshuai.xi     my_vld.blk_type = cur_blk;
4970*53ee8cc1Swenshuai.xi 
4971*53ee8cc1Swenshuai.xi     for(counter = 1;counter<64; counter++)
4972*53ee8cc1Swenshuai.xi     {
4973*53ee8cc1Swenshuai.xi         if(p[counter]==0)
4974*53ee8cc1Swenshuai.xi         {
4975*53ee8cc1Swenshuai.xi             run++;
4976*53ee8cc1Swenshuai.xi         }
4977*53ee8cc1Swenshuai.xi         else
4978*53ee8cc1Swenshuai.xi         {
4979*53ee8cc1Swenshuai.xi             while(run>15)
4980*53ee8cc1Swenshuai.xi             {
4981*53ee8cc1Swenshuai.xi                 my_vld.sign = 0;
4982*53ee8cc1Swenshuai.xi                 my_vld.amp = 0;
4983*53ee8cc1Swenshuai.xi                 my_vld.sym_type = E_RLE_ZRL;
4984*53ee8cc1Swenshuai.xi                 my_vld.run = 15;
4985*53ee8cc1Swenshuai.xi                 if(!JPEG_write_RLE(&my_vld, FALSE))
4986*53ee8cc1Swenshuai.xi                     return FALSE;
4987*53ee8cc1Swenshuai.xi                 my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4988*53ee8cc1Swenshuai.xi                 my_vld.blk_type = cur_blk;
4989*53ee8cc1Swenshuai.xi                 run -= 16;
4990*53ee8cc1Swenshuai.xi             }
4991*53ee8cc1Swenshuai.xi 
4992*53ee8cc1Swenshuai.xi             my_vld.sign = (p[counter]<0)?1:0;
4993*53ee8cc1Swenshuai.xi             my_vld.amp = JPEG_ABS(p[counter]);
4994*53ee8cc1Swenshuai.xi             my_vld.sym_type = E_RLE_AC;
4995*53ee8cc1Swenshuai.xi             my_vld.run = run;
4996*53ee8cc1Swenshuai.xi 
4997*53ee8cc1Swenshuai.xi             // Check if the last byte is non-zero. If it's non-zero & EOP, add the EOP flag
4998*53ee8cc1Swenshuai.xi             if(counter==63&&eop&&p[63]!=0)
4999*53ee8cc1Swenshuai.xi             {
5000*53ee8cc1Swenshuai.xi                 my_vld.EOP = 1;
5001*53ee8cc1Swenshuai.xi                 if(!JPEG_write_RLE(&my_vld, TRUE))
5002*53ee8cc1Swenshuai.xi                     return FALSE;
5003*53ee8cc1Swenshuai.xi 
5004*53ee8cc1Swenshuai.xi                 _s16dc_pred[cur_blk - 1] = p[0];//update predictor
5005*53ee8cc1Swenshuai.xi                 return TRUE;
5006*53ee8cc1Swenshuai.xi             }
5007*53ee8cc1Swenshuai.xi             else
5008*53ee8cc1Swenshuai.xi             {
5009*53ee8cc1Swenshuai.xi                 if(!JPEG_write_RLE(&my_vld, FALSE))
5010*53ee8cc1Swenshuai.xi                     return FALSE;
5011*53ee8cc1Swenshuai.xi             }
5012*53ee8cc1Swenshuai.xi 
5013*53ee8cc1Swenshuai.xi             my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
5014*53ee8cc1Swenshuai.xi             my_vld.blk_type = cur_blk;
5015*53ee8cc1Swenshuai.xi             run = 0;
5016*53ee8cc1Swenshuai.xi         }
5017*53ee8cc1Swenshuai.xi     }
5018*53ee8cc1Swenshuai.xi 
5019*53ee8cc1Swenshuai.xi     counter = 63;
5020*53ee8cc1Swenshuai.xi 
5021*53ee8cc1Swenshuai.xi     if(p[counter]==0)
5022*53ee8cc1Swenshuai.xi     {
5023*53ee8cc1Swenshuai.xi         my_vld.amp = JPEG_ABS(p[counter]);
5024*53ee8cc1Swenshuai.xi         my_vld.sign = p[counter]<0?1:0;
5025*53ee8cc1Swenshuai.xi         my_vld.sym_type = E_RLE_EOB;
5026*53ee8cc1Swenshuai.xi         my_vld.run = 0;
5027*53ee8cc1Swenshuai.xi         if(eop)
5028*53ee8cc1Swenshuai.xi         {
5029*53ee8cc1Swenshuai.xi             my_vld.EOP = 1;
5030*53ee8cc1Swenshuai.xi             if(!JPEG_write_RLE(&my_vld, TRUE))
5031*53ee8cc1Swenshuai.xi                 return FALSE;
5032*53ee8cc1Swenshuai.xi         }
5033*53ee8cc1Swenshuai.xi         else
5034*53ee8cc1Swenshuai.xi         {
5035*53ee8cc1Swenshuai.xi             if(!JPEG_write_RLE(&my_vld, FALSE))
5036*53ee8cc1Swenshuai.xi                 return FALSE;
5037*53ee8cc1Swenshuai.xi         }
5038*53ee8cc1Swenshuai.xi     }
5039*53ee8cc1Swenshuai.xi 
5040*53ee8cc1Swenshuai.xi     _s16dc_pred[cur_blk - 1] = p[0];//update predictor
5041*53ee8cc1Swenshuai.xi     return TRUE;
5042*53ee8cc1Swenshuai.xi }
5043*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5044*53ee8cc1Swenshuai.xi // Starts a new scan.
JPEG_init_scan(void)5045*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_scan(void)
5046*53ee8cc1Swenshuai.xi {
5047*53ee8cc1Swenshuai.xi     if (!JPEG_locate_sos_marker())
5048*53ee8cc1Swenshuai.xi         return FALSE;
5049*53ee8cc1Swenshuai.xi 
5050*53ee8cc1Swenshuai.xi     JPEG_calc_mcu_block_order();
5051*53ee8cc1Swenshuai.xi 
5052*53ee8cc1Swenshuai.xi     if (_HeadCheck.DHT)
5053*53ee8cc1Swenshuai.xi     {
5054*53ee8cc1Swenshuai.xi         if(!JPEG_check_huff_tables())
5055*53ee8cc1Swenshuai.xi             return FALSE;
5056*53ee8cc1Swenshuai.xi     }
5057*53ee8cc1Swenshuai.xi 
5058*53ee8cc1Swenshuai.xi     if (_HeadCheck.DQT)
5059*53ee8cc1Swenshuai.xi     {
5060*53ee8cc1Swenshuai.xi         if(!JPEG_check_quant_tables())
5061*53ee8cc1Swenshuai.xi             return FALSE;
5062*53ee8cc1Swenshuai.xi     }
5063*53ee8cc1Swenshuai.xi 
5064*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
5065*53ee8cc1Swenshuai.xi     JPEG_memset((void *)_u32Last_dc_val, 0, _u8Comps_in_frame * sizeof( MS_U32 ) );
5066*53ee8cc1Swenshuai.xi 
5067*53ee8cc1Swenshuai.xi     _u32EOB_run = 0;
5068*53ee8cc1Swenshuai.xi #endif
5069*53ee8cc1Swenshuai.xi 
5070*53ee8cc1Swenshuai.xi     if ( _u16Restart_interval )
5071*53ee8cc1Swenshuai.xi     {
5072*53ee8cc1Swenshuai.xi         _u16Restarts_left = _u16Restart_interval;
5073*53ee8cc1Swenshuai.xi         _u16Next_restart_num = 0;
5074*53ee8cc1Swenshuai.xi     }
5075*53ee8cc1Swenshuai.xi 
5076*53ee8cc1Swenshuai.xi ////    _Total_Decoded_Size = (MS_S32)JPEG_GetECS();
5077*53ee8cc1Swenshuai.xi 
5078*53ee8cc1Swenshuai.xi #ifdef CMODEL
5079*53ee8cc1Swenshuai.xi     {
5080*53ee8cc1Swenshuai.xi         // pre-fill bit buffer for later decoding
5081*53ee8cc1Swenshuai.xi         _s16Bits_left = 16;
5082*53ee8cc1Swenshuai.xi         JPEG_get_bits_2( 16 );
5083*53ee8cc1Swenshuai.xi         JPEG_get_bits_2( 16 );
5084*53ee8cc1Swenshuai.xi     }
5085*53ee8cc1Swenshuai.xi #else
5086*53ee8cc1Swenshuai.xi     {
5087*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5088*53ee8cc1Swenshuai.xi         if(_bProgressive_flag
5089*53ee8cc1Swenshuai.xi         || (E_JPEG_CMYK == gu8Scan_type)
5090*53ee8cc1Swenshuai.xi         || (E_JPEG_RGB == gu8Scan_type))
5091*53ee8cc1Swenshuai.xi #else
5092*53ee8cc1Swenshuai.xi         if(_bProgressive_flag)
5093*53ee8cc1Swenshuai.xi #endif
5094*53ee8cc1Swenshuai.xi         {
5095*53ee8cc1Swenshuai.xi             // pre-fill bit buffer for later decoding
5096*53ee8cc1Swenshuai.xi             _s16Bits_left = 16;
5097*53ee8cc1Swenshuai.xi             JPEG_get_bits_2( 16 );
5098*53ee8cc1Swenshuai.xi             JPEG_get_bits_2( 16 );
5099*53ee8cc1Swenshuai.xi         }
5100*53ee8cc1Swenshuai.xi     }
5101*53ee8cc1Swenshuai.xi #endif
5102*53ee8cc1Swenshuai.xi 
5103*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG_init_scan:ECS 0x%08lx\n", JPEG_GetECS());
5104*53ee8cc1Swenshuai.xi 
5105*53ee8cc1Swenshuai.xi     return TRUE;
5106*53ee8cc1Swenshuai.xi }
5107*53ee8cc1Swenshuai.xi 
5108*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5109*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5110*53ee8cc1Swenshuai.xi // Create a few tables that allow us to quickly convert YCbCr to RGB.
msAPI_JPEG_create_look_ups(void)5111*53ee8cc1Swenshuai.xi JPEG_STATIC void msAPI_JPEG_create_look_ups( void )
5112*53ee8cc1Swenshuai.xi {
5113*53ee8cc1Swenshuai.xi     MS_S16 i, k;
5114*53ee8cc1Swenshuai.xi     //kevinhuang, modify
5115*53ee8cc1Swenshuai.xi     /*
5116*53ee8cc1Swenshuai.xi     for (i = 0; i <= 255; i++)
5117*53ee8cc1Swenshuai.xi     {
5118*53ee8cc1Swenshuai.xi       //k = (i * 2) - 255;
5119*53ee8cc1Swenshuai.xi         k = (i * 2) - 256; // Dec. 28 2001- change so table[128] == 0
5120*53ee8cc1Swenshuai.xi       gs32Crr[i] = ( FIX(1.40200/2)  * k + ONE_HALF) >> SCALEBITS;
5121*53ee8cc1Swenshuai.xi       gs32Cbb[i] = ( FIX(1.77200/2)  * k + ONE_HALF) >> SCALEBITS;
5122*53ee8cc1Swenshuai.xi       gs32Crg[i] = (-FIX(0.71414/2)) * k;
5123*53ee8cc1Swenshuai.xi       gs32Cbg[i] = (-FIX(0.34414/2)) * k + ONE_HALF;
5124*53ee8cc1Swenshuai.xi     }
5125*53ee8cc1Swenshuai.xi     */
5126*53ee8cc1Swenshuai.xi     for ( i = 0; i <= 255; i++ )
5127*53ee8cc1Swenshuai.xi     {
5128*53ee8cc1Swenshuai.xi         k = i - 128;
5129*53ee8cc1Swenshuai.xi 
5130*53ee8cc1Swenshuai.xi         gs32Crr[i] = ( FIX( 1.40200 ) * k + ONE_HALF ) >> SCALEBITS;
5131*53ee8cc1Swenshuai.xi         gs32Cbb[i] = ( FIX( 1.77200 ) * k + ONE_HALF ) >> SCALEBITS;
5132*53ee8cc1Swenshuai.xi 
5133*53ee8cc1Swenshuai.xi         gs32Crg[i] = ( -FIX( 0.71414 ) ) * k ; //+ ONE_HALF) >> SCALEBITS;???
5134*53ee8cc1Swenshuai.xi         gs32Cbg[i] = ( -FIX( 0.34414 ) ) * k + ONE_HALF; //>> SCALEBITS;???
5135*53ee8cc1Swenshuai.xi 
5136*53ee8cc1Swenshuai.xi     }
5137*53ee8cc1Swenshuai.xi }
5138*53ee8cc1Swenshuai.xi 
5139*53ee8cc1Swenshuai.xi #endif //SW_JPD_RGB_CMYK
5140*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5141*53ee8cc1Swenshuai.xi // Starts a frame. Determines if the number of components or sampling factors
5142*53ee8cc1Swenshuai.xi // are supported.
JPEG_init_frame(void)5143*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_frame(void) //ok
5144*53ee8cc1Swenshuai.xi {
5145*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5146*53ee8cc1Swenshuai.xi     MS_U32 i;
5147*53ee8cc1Swenshuai.xi     MS_U8 *q;
5148*53ee8cc1Swenshuai.xi #endif
5149*53ee8cc1Swenshuai.xi 
5150*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG_init_frame:\n");
5151*53ee8cc1Swenshuai.xi     if ( _u8Comps_in_frame == 1 )
5152*53ee8cc1Swenshuai.xi     {
5153*53ee8cc1Swenshuai.xi         gu8Scan_type = E_JPEG_GRAYSCALE;
5154*53ee8cc1Swenshuai.xi 
5155*53ee8cc1Swenshuai.xi         _u16Max_blocks_per_mcu = 1;
5156*53ee8cc1Swenshuai.xi 
5157*53ee8cc1Swenshuai.xi         gu8Max_mcu_x_size = 8;
5158*53ee8cc1Swenshuai.xi         gu8Max_mcu_y_size = 8;
5159*53ee8cc1Swenshuai.xi     }
5160*53ee8cc1Swenshuai.xi     else if ( _u8Comps_in_frame == 3 )
5161*53ee8cc1Swenshuai.xi     {
5162*53ee8cc1Swenshuai.xi         if ( ( ( _u8Comp_h_samp[1] != 1 ) || ( _u8Comp_v_samp[1] != 1 ) ) ||   //support only U_H1V1 & V_H1V1
5163*53ee8cc1Swenshuai.xi             ( ( _u8Comp_h_samp[2] != 1 ) || ( _u8Comp_v_samp[2] != 1 ) ) )
5164*53ee8cc1Swenshuai.xi         {
5165*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5166*53ee8cc1Swenshuai.xi             return FALSE;
5167*53ee8cc1Swenshuai.xi         }
5168*53ee8cc1Swenshuai.xi 
5169*53ee8cc1Swenshuai.xi         if ( ( _u8Comp_h_samp[0] == 1 ) && ( _u8Comp_v_samp[0] == 1 ) )
5170*53ee8cc1Swenshuai.xi         {
5171*53ee8cc1Swenshuai.xi             //set RGB based jpeg flag
5172*53ee8cc1Swenshuai.xi             if(_u8Comp_ident[0] == 82 || _u8Comp_ident[0] == 71 || _u8Comp_ident[0] == 66)
5173*53ee8cc1Swenshuai.xi             {
5174*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5175*53ee8cc1Swenshuai.xi                 if( FALSE == bEnableRGB )
5176*53ee8cc1Swenshuai.xi                 {
5177*53ee8cc1Swenshuai.xi                     JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5178*53ee8cc1Swenshuai.xi                     return FALSE;
5179*53ee8cc1Swenshuai.xi                 }
5180*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("Get JPEG_RGB\n");
5181*53ee8cc1Swenshuai.xi                 gu8Scan_type = E_JPEG_RGB; //RGB
5182*53ee8cc1Swenshuai.xi #else
5183*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5184*53ee8cc1Swenshuai.xi                 return FALSE;
5185*53ee8cc1Swenshuai.xi #endif
5186*53ee8cc1Swenshuai.xi             }
5187*53ee8cc1Swenshuai.xi             else
5188*53ee8cc1Swenshuai.xi             {
5189*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("Get JPEG_YH1V1\n");
5190*53ee8cc1Swenshuai.xi                 gu8Scan_type = E_JPEG_YH1V1; //4:4:4
5191*53ee8cc1Swenshuai.xi             }
5192*53ee8cc1Swenshuai.xi 
5193*53ee8cc1Swenshuai.xi             _u16Max_blocks_per_mcu = 3;
5194*53ee8cc1Swenshuai.xi 
5195*53ee8cc1Swenshuai.xi             gu8Max_mcu_x_size = 8;
5196*53ee8cc1Swenshuai.xi             gu8Max_mcu_y_size = 8;
5197*53ee8cc1Swenshuai.xi         }
5198*53ee8cc1Swenshuai.xi         else if ( ( _u8Comp_h_samp[0] == 2 ) && ( _u8Comp_v_samp[0] == 1 ) )
5199*53ee8cc1Swenshuai.xi         {
5200*53ee8cc1Swenshuai.xi             gu8Scan_type = E_JPEG_YH2V1; //4:2:2
5201*53ee8cc1Swenshuai.xi 
5202*53ee8cc1Swenshuai.xi             _u16Max_blocks_per_mcu = 4;
5203*53ee8cc1Swenshuai.xi 
5204*53ee8cc1Swenshuai.xi             gu8Max_mcu_x_size = 16;
5205*53ee8cc1Swenshuai.xi             gu8Max_mcu_y_size = 8;
5206*53ee8cc1Swenshuai.xi         }
5207*53ee8cc1Swenshuai.xi         else if ( ( _u8Comp_h_samp[0] == 1 ) && ( _u8Comp_v_samp[0] == 2 ) )
5208*53ee8cc1Swenshuai.xi         {
5209*53ee8cc1Swenshuai.xi             gu8Scan_type = E_JPEG_YH1V2;
5210*53ee8cc1Swenshuai.xi 
5211*53ee8cc1Swenshuai.xi             _u16Max_blocks_per_mcu = 4;
5212*53ee8cc1Swenshuai.xi 
5213*53ee8cc1Swenshuai.xi             gu8Max_mcu_x_size = 8;
5214*53ee8cc1Swenshuai.xi             gu8Max_mcu_y_size = 16;
5215*53ee8cc1Swenshuai.xi         }
5216*53ee8cc1Swenshuai.xi         else if ( ( _u8Comp_h_samp[0] == 2 ) && ( _u8Comp_v_samp[0] == 2 ) )
5217*53ee8cc1Swenshuai.xi         {
5218*53ee8cc1Swenshuai.xi             gu8Scan_type = E_JPEG_YH2V2; //4:2:0
5219*53ee8cc1Swenshuai.xi 
5220*53ee8cc1Swenshuai.xi             _u16Max_blocks_per_mcu = 6;
5221*53ee8cc1Swenshuai.xi 
5222*53ee8cc1Swenshuai.xi             gu8Max_mcu_x_size = 16;
5223*53ee8cc1Swenshuai.xi             gu8Max_mcu_y_size = 16;
5224*53ee8cc1Swenshuai.xi         }
5225*53ee8cc1Swenshuai.xi         else if ( ( _u8Comp_h_samp[0] == 4 ) && ( _u8Comp_v_samp[0] == 1 ) )
5226*53ee8cc1Swenshuai.xi         {
5227*53ee8cc1Swenshuai.xi             // 4:1:1
5228*53ee8cc1Swenshuai.xi             gu8Scan_type = E_JPEG_YH4V1;
5229*53ee8cc1Swenshuai.xi 
5230*53ee8cc1Swenshuai.xi             _u16Max_blocks_per_mcu = 6;
5231*53ee8cc1Swenshuai.xi 
5232*53ee8cc1Swenshuai.xi             gu8Max_mcu_x_size = 32;
5233*53ee8cc1Swenshuai.xi             gu8Max_mcu_y_size = 8;
5234*53ee8cc1Swenshuai.xi             //#if CMODEL
5235*53ee8cc1Swenshuai.xi             //JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5236*53ee8cc1Swenshuai.xi             //#endif
5237*53ee8cc1Swenshuai.xi         }
5238*53ee8cc1Swenshuai.xi         else
5239*53ee8cc1Swenshuai.xi         {
5240*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5241*53ee8cc1Swenshuai.xi             return FALSE;
5242*53ee8cc1Swenshuai.xi         }
5243*53ee8cc1Swenshuai.xi     }
5244*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5245*53ee8cc1Swenshuai.xi     else if(_u8Comps_in_frame == 4) //handle YCCK & CMYK case, must distinguish YCCK and CMYK later
5246*53ee8cc1Swenshuai.xi     {
5247*53ee8cc1Swenshuai.xi         if( FALSE == bEnableCMYK )
5248*53ee8cc1Swenshuai.xi         {
5249*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5250*53ee8cc1Swenshuai.xi             return FALSE;
5251*53ee8cc1Swenshuai.xi         }
5252*53ee8cc1Swenshuai.xi 
5253*53ee8cc1Swenshuai.xi         if ( ( _u8Comp_h_samp[0] == 1 ) && ( _u8Comp_v_samp[0] == 1 ) )
5254*53ee8cc1Swenshuai.xi         {
5255*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("Get JPEG_CMYK\n");
5256*53ee8cc1Swenshuai.xi             gu8Scan_type = E_JPEG_CMYK;
5257*53ee8cc1Swenshuai.xi 
5258*53ee8cc1Swenshuai.xi             _u16Max_blocks_per_mcu = 4;
5259*53ee8cc1Swenshuai.xi 
5260*53ee8cc1Swenshuai.xi             gu8Max_mcu_x_size = 8;
5261*53ee8cc1Swenshuai.xi             gu8Max_mcu_y_size = 8;
5262*53ee8cc1Swenshuai.xi         }
5263*53ee8cc1Swenshuai.xi         else
5264*53ee8cc1Swenshuai.xi         {
5265*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5266*53ee8cc1Swenshuai.xi             return FALSE;
5267*53ee8cc1Swenshuai.xi         }
5268*53ee8cc1Swenshuai.xi     }
5269*53ee8cc1Swenshuai.xi #endif
5270*53ee8cc1Swenshuai.xi     else
5271*53ee8cc1Swenshuai.xi     {
5272*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5273*53ee8cc1Swenshuai.xi         return FALSE;
5274*53ee8cc1Swenshuai.xi     }
5275*53ee8cc1Swenshuai.xi 
5276*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG_init_frame:gu8Scan_type = %d\n", gu8Scan_type);
5277*53ee8cc1Swenshuai.xi 
5278*53ee8cc1Swenshuai.xi     gu16Max_mcus_per_row = ( _u16Image_x_size + ( gu8Max_mcu_x_size - 1 ) ) / gu8Max_mcu_x_size;
5279*53ee8cc1Swenshuai.xi     _u16Max_mcus_per_col = ( _u16Image_y_size + ( gu8Max_mcu_y_size - 1 ) ) / gu8Max_mcu_y_size;
5280*53ee8cc1Swenshuai.xi 
5281*53ee8cc1Swenshuai.xi #ifdef CMODEL
5282*53ee8cc1Swenshuai.xi     /* these values are for the *destination* pixels: after conversion */
5283*53ee8cc1Swenshuai.xi 
5284*53ee8cc1Swenshuai.xi     if ( E_JPEG_GRAYSCALE == gu8Scan_type )
5285*53ee8cc1Swenshuai.xi     {
5286*53ee8cc1Swenshuai.xi         gu8Dest_bytes_per_pixel = 1;
5287*53ee8cc1Swenshuai.xi     }
5288*53ee8cc1Swenshuai.xi     else
5289*53ee8cc1Swenshuai.xi         //kevinhuang, ToDo 4 -> 3 later
5290*53ee8cc1Swenshuai.xi     {
5291*53ee8cc1Swenshuai.xi         gu8Dest_bytes_per_pixel = 4;
5292*53ee8cc1Swenshuai.xi     }
5293*53ee8cc1Swenshuai.xi 
5294*53ee8cc1Swenshuai.xi     gu16Dest_bytes_per_scan_line = ( ( _u16Image_x_size + 15 ) & 0xFFF0 ) * gu8Dest_bytes_per_pixel;
5295*53ee8cc1Swenshuai.xi     gu16Real_dest_bytes_per_scan_line = ( _u16Image_x_size * gu8Dest_bytes_per_pixel );
5296*53ee8cc1Swenshuai.xi 
5297*53ee8cc1Swenshuai.xi     // Initialize two scan line buffers.
5298*53ee8cc1Swenshuai.xi     // FIXME: Only the V2 sampling factors need two buffers.
5299*53ee8cc1Swenshuai.xi     #define DC_ALIGNMENT    16
5300*53ee8cc1Swenshuai.xi     //pgu8Scan_line_0         = (MS_U8 *)JPEG_alloc(gu16Dest_bytes_per_scan_line + 8);
5301*53ee8cc1Swenshuai.xi     pgu8Scan_line_0 = ( MS_U8 * )JPEG_alloc( gu16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5302*53ee8cc1Swenshuai.xi     if(pgu8Scan_line_0 == NULL)
5303*53ee8cc1Swenshuai.xi         return FALSE;
5304*53ee8cc1Swenshuai.xi     JPEG_memset((void *)pgu8Scan_line_0, 0x7F, gu16Dest_bytes_per_scan_line ); //kevinhuang, write dummy bytes for DC pitch alignment to display right border in certain color thru VE
5305*53ee8cc1Swenshuai.xi 
5306*53ee8cc1Swenshuai.xi     //pgu8scan_line_1         = (MS_U8 *)JPEG_alloc(gu16Dest_bytes_per_scan_line + 8);
5307*53ee8cc1Swenshuai.xi     pgu8scan_line_1 = ( MS_U8 * )JPEG_alloc( gu16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5308*53ee8cc1Swenshuai.xi     if(pgu8scan_line_1 == NULL)
5309*53ee8cc1Swenshuai.xi         return FALSE;
5310*53ee8cc1Swenshuai.xi     JPEG_memset((void *)pgu8scan_line_1, 0x7F, gu16Dest_bytes_per_scan_line ); //kevinhuang, write dummy bytes for DC pitch alignment to display right border in certain color thru VE
5311*53ee8cc1Swenshuai.xi #endif
5312*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5313*53ee8cc1Swenshuai.xi     if((E_JPEG_CMYK == gu8Scan_type)
5314*53ee8cc1Swenshuai.xi     || (E_JPEG_RGB == gu8Scan_type))
5315*53ee8cc1Swenshuai.xi     {
5316*53ee8cc1Swenshuai.xi         /* these values are for the *destination* pixels: after conversion */
5317*53ee8cc1Swenshuai.xi 
5318*53ee8cc1Swenshuai.xi         //Reset image x size by new Max_mcus
5319*53ee8cc1Swenshuai.xi         _u16Image_x_size = gu16Max_mcus_per_row*gu8Max_mcu_x_size;
5320*53ee8cc1Swenshuai.xi 
5321*53ee8cc1Swenshuai.xi         _u16NonAlignmentImage_x_size = _u16Image_x_size;
5322*53ee8cc1Swenshuai.xi 
5323*53ee8cc1Swenshuai.xi         if ( E_JPEG_GRAYSCALE == gu8Scan_type )
5324*53ee8cc1Swenshuai.xi         {
5325*53ee8cc1Swenshuai.xi             _u8Dest_bytes_per_pixel = 1;
5326*53ee8cc1Swenshuai.xi         }
5327*53ee8cc1Swenshuai.xi         else
5328*53ee8cc1Swenshuai.xi             //kevinhuang, ToDo 4 -> 3 later
5329*53ee8cc1Swenshuai.xi         {
5330*53ee8cc1Swenshuai.xi             _u8Dest_bytes_per_pixel = 4;
5331*53ee8cc1Swenshuai.xi         }
5332*53ee8cc1Swenshuai.xi 
5333*53ee8cc1Swenshuai.xi         _u16Dest_bytes_per_scan_line = ( ( _u16Image_x_size + 15 ) & 0xFFF0 ) * _u8Dest_bytes_per_pixel;
5334*53ee8cc1Swenshuai.xi //        _u16Real_dest_bytes_per_scan_line = ( _u16Image_x_size * _u8Dest_bytes_per_pixel );
5335*53ee8cc1Swenshuai.xi 
5336*53ee8cc1Swenshuai.xi         // Initialize two scan line buffers.
5337*53ee8cc1Swenshuai.xi         // FIXME: Only the V2 sampling factors need two buffers.
5338*53ee8cc1Swenshuai.xi         #define DC_ALIGNMENT    16
5339*53ee8cc1Swenshuai.xi         //pgu8Scan_line_0         = (U8 *)alloc(_u16Dest_bytes_per_scan_line + 8);
5340*53ee8cc1Swenshuai.xi         pgu8Scan_line_0 = ( MS_U8 * )JPEG_alloc( _u16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5341*53ee8cc1Swenshuai.xi         if(pgu8Scan_line_0 == NULL)
5342*53ee8cc1Swenshuai.xi             return FALSE;
5343*53ee8cc1Swenshuai.xi         JPEG_memset( pgu8Scan_line_0, 0x7F, _u16Dest_bytes_per_scan_line ); //kevinhuang, write dummy bytes for DC pitch alignment to display right border in certain color thru VE
5344*53ee8cc1Swenshuai.xi 
5345*53ee8cc1Swenshuai.xi         //pgu8scan_line_1         = (U8 *)alloc(_u16Dest_bytes_per_scan_line + 8);
5346*53ee8cc1Swenshuai.xi         pgu8scan_line_1 = ( MS_U8 * )JPEG_alloc( _u16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5347*53ee8cc1Swenshuai.xi         if(pgu8scan_line_1 == NULL)
5348*53ee8cc1Swenshuai.xi             return FALSE;
5349*53ee8cc1Swenshuai.xi         JPEG_memset( pgu8scan_line_1, 0x7F, _u16Dest_bytes_per_scan_line ); //kevinhuang, write dummy bytes for DC pitch alignment to display right border in certain color thru VE
5350*53ee8cc1Swenshuai.xi     }
5351*53ee8cc1Swenshuai.xi #endif
5352*53ee8cc1Swenshuai.xi 
5353*53ee8cc1Swenshuai.xi     _u32Max_blocks_per_row = gu16Max_mcus_per_row * _u16Max_blocks_per_mcu;
5354*53ee8cc1Swenshuai.xi 
5355*53ee8cc1Swenshuai.xi     // Should never happen
5356*53ee8cc1Swenshuai.xi     if ( _u32Max_blocks_per_row > JPEG_MAXBLOCKSPERROW )
5357*53ee8cc1Swenshuai.xi     {
5358*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_ASSERTION_ERROR );
5359*53ee8cc1Swenshuai.xi         return FALSE;
5360*53ee8cc1Swenshuai.xi     }
5361*53ee8cc1Swenshuai.xi 
5362*53ee8cc1Swenshuai.xi #ifdef CMODEL
5363*53ee8cc1Swenshuai.xi     {
5364*53ee8cc1Swenshuai.xi         MS_U32 i;
5365*53ee8cc1Swenshuai.xi         MS_U8 *q;
5366*53ee8cc1Swenshuai.xi 
5367*53ee8cc1Swenshuai.xi         // Allocate the coefficient buffer, enough for one row's worth of MCU's
5368*53ee8cc1Swenshuai.xi         q = ( MS_U8 * )JPEG_alloc( _u32Max_blocks_per_row * 64 * sizeof( JPEG_BLOCK_TYPE ) + 8 );
5369*53ee8cc1Swenshuai.xi         if(q == NULL)
5370*53ee8cc1Swenshuai.xi             return FALSE;
5371*53ee8cc1Swenshuai.xi 
5372*53ee8cc1Swenshuai.xi         // Align to 8-byte boundry, for MMX code
5373*53ee8cc1Swenshuai.xi         q = ( MS_U8 * )( ( ( MS_U32 )q + 7 ) & ~7 );
5374*53ee8cc1Swenshuai.xi         if(q == NULL)
5375*53ee8cc1Swenshuai.xi             return FALSE;
5376*53ee8cc1Swenshuai.xi 
5377*53ee8cc1Swenshuai.xi         // The gps16Block_seg[] array's name dates back to the
5378*53ee8cc1Swenshuai.xi         // 16-bit assembler implementation. "seg" stood for "segment".
5379*53ee8cc1Swenshuai.xi         for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5380*53ee8cc1Swenshuai.xi         {
5381*53ee8cc1Swenshuai.xi             gps16Block_seg[i] = ( JPEG_BLOCK_TYPE * )( q + i * 64 * sizeof( JPEG_BLOCK_TYPE ) );
5382*53ee8cc1Swenshuai.xi         }
5383*53ee8cc1Swenshuai.xi 
5384*53ee8cc1Swenshuai.xi         for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5385*53ee8cc1Swenshuai.xi         {
5386*53ee8cc1Swenshuai.xi             gu8Block_max_zag_set[i] = 64;
5387*53ee8cc1Swenshuai.xi         }
5388*53ee8cc1Swenshuai.xi 
5389*53ee8cc1Swenshuai.xi         gpu8Sample_buf = ( MS_U8 * )( ( ( MS_U32 )JPEG_alloc( _u32Max_blocks_per_row * 64 + 8 ) + 7 ) & ~7 );
5390*53ee8cc1Swenshuai.xi         if(gpu8Sample_buf == NULL)
5391*53ee8cc1Swenshuai.xi             return FALSE;
5392*53ee8cc1Swenshuai.xi 
5393*53ee8cc1Swenshuai.xi         JPEG_CMODEL_create_look_ups();
5394*53ee8cc1Swenshuai.xi     }
5395*53ee8cc1Swenshuai.xi #endif
5396*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5397*53ee8cc1Swenshuai.xi     if((E_JPEG_CMYK == gu8Scan_type)
5398*53ee8cc1Swenshuai.xi     || (E_JPEG_RGB == gu8Scan_type))
5399*53ee8cc1Swenshuai.xi     {
5400*53ee8cc1Swenshuai.xi         // Allocate the coefficient buffer, enough for one row's worth of MCU's
5401*53ee8cc1Swenshuai.xi         q = ( MS_U8 * )JPEG_alloc( _u32Max_blocks_per_row * 64 * sizeof( JPEG_BLOCK_TYPE ) + 8 );
5402*53ee8cc1Swenshuai.xi         if(q == NULL)
5403*53ee8cc1Swenshuai.xi             return FALSE;
5404*53ee8cc1Swenshuai.xi 
5405*53ee8cc1Swenshuai.xi         // Align to 8-byte boundry, for MMX code
5406*53ee8cc1Swenshuai.xi         q = ( MS_U8 * )( ( ( MS_U32 )q + 7 ) & ~7 );
5407*53ee8cc1Swenshuai.xi 
5408*53ee8cc1Swenshuai.xi         // The _ps16Block_seg[] array's name dates back to the
5409*53ee8cc1Swenshuai.xi         // 16-bit assembler implementation. "seg" stood for "segment".
5410*53ee8cc1Swenshuai.xi         for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5411*53ee8cc1Swenshuai.xi         {
5412*53ee8cc1Swenshuai.xi             _ps16Block_seg[i] = ( JPEG_BLOCK_TYPE * )( (MS_U32)q + i * 64 * sizeof( JPEG_BLOCK_TYPE ) );
5413*53ee8cc1Swenshuai.xi         }
5414*53ee8cc1Swenshuai.xi 
5415*53ee8cc1Swenshuai.xi         for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5416*53ee8cc1Swenshuai.xi         {
5417*53ee8cc1Swenshuai.xi             _u8Block_max_zag_set[i] = 64;
5418*53ee8cc1Swenshuai.xi         }
5419*53ee8cc1Swenshuai.xi 
5420*53ee8cc1Swenshuai.xi         gpu8Sample_buf = ( MS_U8 * )( ( ( MS_U32 )JPEG_alloc( _u32Max_blocks_per_row * 64 + 8 ) + 7 ) & ~7 );
5421*53ee8cc1Swenshuai.xi         if(gpu8Sample_buf == NULL)
5422*53ee8cc1Swenshuai.xi             return FALSE;
5423*53ee8cc1Swenshuai.xi 
5424*53ee8cc1Swenshuai.xi         _u16Total_lines_left = _u16Image_y_size;
5425*53ee8cc1Swenshuai.xi 
5426*53ee8cc1Swenshuai.xi #ifdef CMODEL
5427*53ee8cc1Swenshuai.xi         gu16Mcu_lines_left = 0;
5428*53ee8cc1Swenshuai.xi #endif
5429*53ee8cc1Swenshuai.xi 
5430*53ee8cc1Swenshuai.xi         msAPI_JPEG_create_look_ups();
5431*53ee8cc1Swenshuai.xi     }
5432*53ee8cc1Swenshuai.xi #endif
5433*53ee8cc1Swenshuai.xi 
5434*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
5435*53ee8cc1Swenshuai.xi     _u16Total_lines_left = _u16Max_mcus_per_col * gu8Max_mcu_y_size;
5436*53ee8cc1Swenshuai.xi #ifdef CMODEL
5437*53ee8cc1Swenshuai.xi     gu16Mcu_lines_left = 0;
5438*53ee8cc1Swenshuai.xi #endif
5439*53ee8cc1Swenshuai.xi #endif
5440*53ee8cc1Swenshuai.xi     return TRUE;
5441*53ee8cc1Swenshuai.xi }
5442*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5443*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
5444*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5445*53ee8cc1Swenshuai.xi // Restart interval processing.
JPEG_process_restart(void)5446*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_process_restart(void)
5447*53ee8cc1Swenshuai.xi {
5448*53ee8cc1Swenshuai.xi     MS_U16 i, c = 0;
5449*53ee8cc1Swenshuai.xi 
5450*53ee8cc1Swenshuai.xi     // Let's scan a little bit to find the marker, but not _too_ far.
5451*53ee8cc1Swenshuai.xi     // 1536 is a "fudge factor" that determines how much to scan.
5452*53ee8cc1Swenshuai.xi     for ( i = 1536; i > 0; i-- )
5453*53ee8cc1Swenshuai.xi     {
5454*53ee8cc1Swenshuai.xi         if ( JPEG_get_char() == 0xFF )
5455*53ee8cc1Swenshuai.xi         {
5456*53ee8cc1Swenshuai.xi             break;
5457*53ee8cc1Swenshuai.xi         }
5458*53ee8cc1Swenshuai.xi     }
5459*53ee8cc1Swenshuai.xi 
5460*53ee8cc1Swenshuai.xi     if ( i == 0 )
5461*53ee8cc1Swenshuai.xi     {
5462*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5463*53ee8cc1Swenshuai.xi         return FALSE;
5464*53ee8cc1Swenshuai.xi     }
5465*53ee8cc1Swenshuai.xi 
5466*53ee8cc1Swenshuai.xi     for ( ; i > 0; i-- )
5467*53ee8cc1Swenshuai.xi     {
5468*53ee8cc1Swenshuai.xi         c = JPEG_get_char();
5469*53ee8cc1Swenshuai.xi         if ( c != 0xFF )
5470*53ee8cc1Swenshuai.xi         {
5471*53ee8cc1Swenshuai.xi             break;
5472*53ee8cc1Swenshuai.xi         }
5473*53ee8cc1Swenshuai.xi     }
5474*53ee8cc1Swenshuai.xi 
5475*53ee8cc1Swenshuai.xi     if ( i == 0 )
5476*53ee8cc1Swenshuai.xi     {
5477*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5478*53ee8cc1Swenshuai.xi         return FALSE;
5479*53ee8cc1Swenshuai.xi     }
5480*53ee8cc1Swenshuai.xi 
5481*53ee8cc1Swenshuai.xi     // Is it the expected marker? If not, something bad happened.
5482*53ee8cc1Swenshuai.xi     if ( c != ( _u16Next_restart_num + E_JPEG_RST0 ) )
5483*53ee8cc1Swenshuai.xi     {
5484*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5485*53ee8cc1Swenshuai.xi         return FALSE;
5486*53ee8cc1Swenshuai.xi     }
5487*53ee8cc1Swenshuai.xi 
5488*53ee8cc1Swenshuai.xi     // Reset each component's DC prediction values.
5489*53ee8cc1Swenshuai.xi     JPEG_memset((void *)&_u32Last_dc_val, 0, _u8Comps_in_frame * sizeof( MS_U32 ) );
5490*53ee8cc1Swenshuai.xi 
5491*53ee8cc1Swenshuai.xi     _u32EOB_run = 0;
5492*53ee8cc1Swenshuai.xi 
5493*53ee8cc1Swenshuai.xi     _u16Restarts_left = _u16Restart_interval;
5494*53ee8cc1Swenshuai.xi 
5495*53ee8cc1Swenshuai.xi     _u16Next_restart_num = ( _u16Next_restart_num + 1 ) & 7;
5496*53ee8cc1Swenshuai.xi 
5497*53ee8cc1Swenshuai.xi     // Get the bit buffer going again...
5498*53ee8cc1Swenshuai.xi     {
5499*53ee8cc1Swenshuai.xi         _s16Bits_left = 16;
5500*53ee8cc1Swenshuai.xi         JPEG_get_bits_2( 16 );
5501*53ee8cc1Swenshuai.xi         JPEG_get_bits_2( 16 );
5502*53ee8cc1Swenshuai.xi     }
5503*53ee8cc1Swenshuai.xi     return TRUE;
5504*53ee8cc1Swenshuai.xi }
5505*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5506*53ee8cc1Swenshuai.xi // The following methods decode the various types of blocks encountered
5507*53ee8cc1Swenshuai.xi // in progressively encoded images.
JPEG_decode_block_dc_first(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5508*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_dc_first(//JPEG_DECODER *Pd,
5509*53ee8cc1Swenshuai.xi   MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5510*53ee8cc1Swenshuai.xi {
5511*53ee8cc1Swenshuai.xi     MS_S32 s, r;
5512*53ee8cc1Swenshuai.xi     JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( _DC_Coeffs[component_id], block_x, block_y );
5513*53ee8cc1Swenshuai.xi 
5514*53ee8cc1Swenshuai.xi     if(p == NULL)
5515*53ee8cc1Swenshuai.xi     {
5516*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5517*53ee8cc1Swenshuai.xi         return FALSE;
5518*53ee8cc1Swenshuai.xi     }
5519*53ee8cc1Swenshuai.xi 
5520*53ee8cc1Swenshuai.xi     s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_dc_tab[component_id]] );
5521*53ee8cc1Swenshuai.xi     if ( s != 0 )
5522*53ee8cc1Swenshuai.xi     {
5523*53ee8cc1Swenshuai.xi         r = JPEG_get_bits_2( s );
5524*53ee8cc1Swenshuai.xi         s = HUFF_EXTEND_P( r, s );
5525*53ee8cc1Swenshuai.xi     }
5526*53ee8cc1Swenshuai.xi 
5527*53ee8cc1Swenshuai.xi     // In JPD mode, the DC coefficient is the difference of nearest DC
5528*53ee8cc1Swenshuai.xi     _u32Last_dc_val[component_id] = ( s += _u32Last_dc_val[component_id] );
5529*53ee8cc1Swenshuai.xi 
5530*53ee8cc1Swenshuai.xi     p[0] = s << _u8Successive_low;
5531*53ee8cc1Swenshuai.xi     return TRUE;
5532*53ee8cc1Swenshuai.xi }
5533*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_decode_block_dc_refine(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5534*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_dc_refine(//JPEG_DECODER *Pd,
5535*53ee8cc1Swenshuai.xi   MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5536*53ee8cc1Swenshuai.xi {
5537*53ee8cc1Swenshuai.xi     if ( JPEG_get_bits_2( 1 ) )
5538*53ee8cc1Swenshuai.xi     {
5539*53ee8cc1Swenshuai.xi         JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( _DC_Coeffs[component_id], block_x, block_y );
5540*53ee8cc1Swenshuai.xi 
5541*53ee8cc1Swenshuai.xi         if(p == NULL)
5542*53ee8cc1Swenshuai.xi         {
5543*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5544*53ee8cc1Swenshuai.xi             return FALSE;
5545*53ee8cc1Swenshuai.xi         }
5546*53ee8cc1Swenshuai.xi 
5547*53ee8cc1Swenshuai.xi         p[0] |= ( 1 << _u8Successive_low );
5548*53ee8cc1Swenshuai.xi     }
5549*53ee8cc1Swenshuai.xi     return TRUE;
5550*53ee8cc1Swenshuai.xi }
5551*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_decode_block_ac_first(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5552*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_ac_first(//JPEG_DECODER *Pd,
5553*53ee8cc1Swenshuai.xi   MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5554*53ee8cc1Swenshuai.xi {
5555*53ee8cc1Swenshuai.xi     JPEG_BLOCK_TYPE *p;
5556*53ee8cc1Swenshuai.xi     MS_S32 k, s, r;
5557*53ee8cc1Swenshuai.xi 
5558*53ee8cc1Swenshuai.xi     if ( _u32EOB_run )
5559*53ee8cc1Swenshuai.xi     {
5560*53ee8cc1Swenshuai.xi         _u32EOB_run--;
5561*53ee8cc1Swenshuai.xi         return TRUE;
5562*53ee8cc1Swenshuai.xi     }
5563*53ee8cc1Swenshuai.xi 
5564*53ee8cc1Swenshuai.xi     p = JPEG_coeff_buf_getp( _AC_Coeffs[component_id], block_x, block_y );
5565*53ee8cc1Swenshuai.xi 
5566*53ee8cc1Swenshuai.xi     if(p == NULL)
5567*53ee8cc1Swenshuai.xi     {
5568*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5569*53ee8cc1Swenshuai.xi         return FALSE;
5570*53ee8cc1Swenshuai.xi     }
5571*53ee8cc1Swenshuai.xi 
5572*53ee8cc1Swenshuai.xi     for ( k = _u8Spectral_start; k <= _u8Spectral_end; k++ )
5573*53ee8cc1Swenshuai.xi     {
5574*53ee8cc1Swenshuai.xi         s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_ac_tab[component_id]] );
5575*53ee8cc1Swenshuai.xi 
5576*53ee8cc1Swenshuai.xi         r = s >> 4;
5577*53ee8cc1Swenshuai.xi         s &= 15;
5578*53ee8cc1Swenshuai.xi 
5579*53ee8cc1Swenshuai.xi         if ( s )
5580*53ee8cc1Swenshuai.xi         {
5581*53ee8cc1Swenshuai.xi             k += r;
5582*53ee8cc1Swenshuai.xi             if ( k > 63 )
5583*53ee8cc1Swenshuai.xi             {
5584*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_DECODE_ERROR );
5585*53ee8cc1Swenshuai.xi                 return FALSE;
5586*53ee8cc1Swenshuai.xi             }
5587*53ee8cc1Swenshuai.xi 
5588*53ee8cc1Swenshuai.xi             r = JPEG_get_bits_2( s );
5589*53ee8cc1Swenshuai.xi             s = HUFF_EXTEND_P( r, s );
5590*53ee8cc1Swenshuai.xi 
5591*53ee8cc1Swenshuai.xi             // No need to do ZAG order in JPD mode
5592*53ee8cc1Swenshuai.xi #ifdef CMODEL
5593*53ee8cc1Swenshuai.xi             //p[_u8ZAG[k]] = s << _u8Successive_low;
5594*53ee8cc1Swenshuai.xi             p[k] = s << _u8Successive_low;
5595*53ee8cc1Swenshuai.xi #else
5596*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5597*53ee8cc1Swenshuai.xi             if((E_JPEG_CMYK == gu8Scan_type)
5598*53ee8cc1Swenshuai.xi             || (E_JPEG_RGB == gu8Scan_type))
5599*53ee8cc1Swenshuai.xi             {
5600*53ee8cc1Swenshuai.xi                 p[_u8ZAG[k]] = s << _u8Successive_low;
5601*53ee8cc1Swenshuai.xi             }
5602*53ee8cc1Swenshuai.xi             else
5603*53ee8cc1Swenshuai.xi #endif
5604*53ee8cc1Swenshuai.xi             {
5605*53ee8cc1Swenshuai.xi                 p[k] = s << _u8Successive_low;
5606*53ee8cc1Swenshuai.xi             }
5607*53ee8cc1Swenshuai.xi #endif
5608*53ee8cc1Swenshuai.xi         }
5609*53ee8cc1Swenshuai.xi         else
5610*53ee8cc1Swenshuai.xi         {
5611*53ee8cc1Swenshuai.xi             if ( r == 15 )
5612*53ee8cc1Swenshuai.xi             {
5613*53ee8cc1Swenshuai.xi                 k += 15;
5614*53ee8cc1Swenshuai.xi                 if ( k > 63 )
5615*53ee8cc1Swenshuai.xi                 {
5616*53ee8cc1Swenshuai.xi                     JPEG_terminate( E_JPEG_DECODE_ERROR );
5617*53ee8cc1Swenshuai.xi                     return FALSE;
5618*53ee8cc1Swenshuai.xi                 }
5619*53ee8cc1Swenshuai.xi             }
5620*53ee8cc1Swenshuai.xi             else
5621*53ee8cc1Swenshuai.xi             {
5622*53ee8cc1Swenshuai.xi                 _u32EOB_run = 1 << r;
5623*53ee8cc1Swenshuai.xi 
5624*53ee8cc1Swenshuai.xi                 if ( r )
5625*53ee8cc1Swenshuai.xi                 {
5626*53ee8cc1Swenshuai.xi                     _u32EOB_run += JPEG_get_bits_2( r );
5627*53ee8cc1Swenshuai.xi                 }
5628*53ee8cc1Swenshuai.xi 
5629*53ee8cc1Swenshuai.xi                 _u32EOB_run--;
5630*53ee8cc1Swenshuai.xi 
5631*53ee8cc1Swenshuai.xi                 break;
5632*53ee8cc1Swenshuai.xi             }
5633*53ee8cc1Swenshuai.xi         }
5634*53ee8cc1Swenshuai.xi     }
5635*53ee8cc1Swenshuai.xi     return TRUE;
5636*53ee8cc1Swenshuai.xi }
5637*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_decode_block_ac_refine(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5638*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_ac_refine(//JPEG_DECODER *Pd,
5639*53ee8cc1Swenshuai.xi   MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5640*53ee8cc1Swenshuai.xi {
5641*53ee8cc1Swenshuai.xi     MS_S32 s, k, r;
5642*53ee8cc1Swenshuai.xi     MS_S32 p1 = 1 << _u8Successive_low;
5643*53ee8cc1Swenshuai.xi     MS_S32 m1 = ( -1 ) << _u8Successive_low;
5644*53ee8cc1Swenshuai.xi     JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( _AC_Coeffs[component_id], block_x, block_y );
5645*53ee8cc1Swenshuai.xi 
5646*53ee8cc1Swenshuai.xi     if(p == NULL)
5647*53ee8cc1Swenshuai.xi     {
5648*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5649*53ee8cc1Swenshuai.xi         return FALSE;
5650*53ee8cc1Swenshuai.xi     }
5651*53ee8cc1Swenshuai.xi 
5652*53ee8cc1Swenshuai.xi     k = _u8Spectral_start;
5653*53ee8cc1Swenshuai.xi 
5654*53ee8cc1Swenshuai.xi     if ( _u32EOB_run == 0 )
5655*53ee8cc1Swenshuai.xi     {
5656*53ee8cc1Swenshuai.xi         for ( ; (k <= _u8Spectral_end) && ( k < 64 ); k++ )
5657*53ee8cc1Swenshuai.xi         {
5658*53ee8cc1Swenshuai.xi             s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_ac_tab[component_id]] );
5659*53ee8cc1Swenshuai.xi 
5660*53ee8cc1Swenshuai.xi             r = s >> 4;
5661*53ee8cc1Swenshuai.xi             s &= 15;
5662*53ee8cc1Swenshuai.xi 
5663*53ee8cc1Swenshuai.xi             if ( s )
5664*53ee8cc1Swenshuai.xi             {
5665*53ee8cc1Swenshuai.xi                 if ( s != 1 )
5666*53ee8cc1Swenshuai.xi                 {
5667*53ee8cc1Swenshuai.xi                     JPEG_terminate( E_JPEG_DECODE_ERROR );
5668*53ee8cc1Swenshuai.xi                     return FALSE;
5669*53ee8cc1Swenshuai.xi                 }
5670*53ee8cc1Swenshuai.xi 
5671*53ee8cc1Swenshuai.xi                 if ( JPEG_get_bits_2( 1 ) )
5672*53ee8cc1Swenshuai.xi                 {
5673*53ee8cc1Swenshuai.xi                     s = p1;
5674*53ee8cc1Swenshuai.xi                 }
5675*53ee8cc1Swenshuai.xi                 else
5676*53ee8cc1Swenshuai.xi                 {
5677*53ee8cc1Swenshuai.xi                     s = m1;
5678*53ee8cc1Swenshuai.xi                 }
5679*53ee8cc1Swenshuai.xi             }
5680*53ee8cc1Swenshuai.xi             else
5681*53ee8cc1Swenshuai.xi             {
5682*53ee8cc1Swenshuai.xi                 if ( r != 15 )
5683*53ee8cc1Swenshuai.xi                 {
5684*53ee8cc1Swenshuai.xi                     _u32EOB_run = 1 << r;
5685*53ee8cc1Swenshuai.xi 
5686*53ee8cc1Swenshuai.xi                     if ( r )
5687*53ee8cc1Swenshuai.xi                     {
5688*53ee8cc1Swenshuai.xi                         _u32EOB_run += JPEG_get_bits_2( r );
5689*53ee8cc1Swenshuai.xi                     }
5690*53ee8cc1Swenshuai.xi 
5691*53ee8cc1Swenshuai.xi                     break;
5692*53ee8cc1Swenshuai.xi                 }
5693*53ee8cc1Swenshuai.xi             }
5694*53ee8cc1Swenshuai.xi 
5695*53ee8cc1Swenshuai.xi             do
5696*53ee8cc1Swenshuai.xi             {
5697*53ee8cc1Swenshuai.xi                 // No need to do ZAG order in JPD mode
5698*53ee8cc1Swenshuai.xi #ifdef CMODEL
5699*53ee8cc1Swenshuai.xi                 //JPEG_BLOCK_TYPE *this_coef = p + _u8ZAG[k];
5700*53ee8cc1Swenshuai.xi                 JPEG_BLOCK_TYPE *this_coef = p + k;
5701*53ee8cc1Swenshuai.xi #else
5702*53ee8cc1Swenshuai.xi                 JPEG_BLOCK_TYPE *this_coef;
5703*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5704*53ee8cc1Swenshuai.xi                 if((E_JPEG_CMYK == gu8Scan_type)
5705*53ee8cc1Swenshuai.xi                 || (E_JPEG_RGB == gu8Scan_type))
5706*53ee8cc1Swenshuai.xi                 {
5707*53ee8cc1Swenshuai.xi                     this_coef = p + _u8ZAG[k];
5708*53ee8cc1Swenshuai.xi                 }
5709*53ee8cc1Swenshuai.xi                 else
5710*53ee8cc1Swenshuai.xi #endif
5711*53ee8cc1Swenshuai.xi                 {
5712*53ee8cc1Swenshuai.xi                     this_coef = p + k;
5713*53ee8cc1Swenshuai.xi                 }
5714*53ee8cc1Swenshuai.xi #endif
5715*53ee8cc1Swenshuai.xi 
5716*53ee8cc1Swenshuai.xi                 if ( *this_coef != 0 )
5717*53ee8cc1Swenshuai.xi                 {
5718*53ee8cc1Swenshuai.xi                     if ( JPEG_get_bits_2( 1 ) )
5719*53ee8cc1Swenshuai.xi                     {
5720*53ee8cc1Swenshuai.xi                         if ( ( *this_coef & p1 ) == 0 )
5721*53ee8cc1Swenshuai.xi                         {
5722*53ee8cc1Swenshuai.xi                             if ( *this_coef >= 0 )
5723*53ee8cc1Swenshuai.xi                             {
5724*53ee8cc1Swenshuai.xi                                 *this_coef += p1;
5725*53ee8cc1Swenshuai.xi                             }
5726*53ee8cc1Swenshuai.xi                             else
5727*53ee8cc1Swenshuai.xi                             {
5728*53ee8cc1Swenshuai.xi                                 *this_coef += m1;
5729*53ee8cc1Swenshuai.xi                             }
5730*53ee8cc1Swenshuai.xi                         }
5731*53ee8cc1Swenshuai.xi                     }
5732*53ee8cc1Swenshuai.xi                 }
5733*53ee8cc1Swenshuai.xi                 else
5734*53ee8cc1Swenshuai.xi                 {
5735*53ee8cc1Swenshuai.xi                     if ( --r < 0 )
5736*53ee8cc1Swenshuai.xi                     {
5737*53ee8cc1Swenshuai.xi                         break;
5738*53ee8cc1Swenshuai.xi                     }
5739*53ee8cc1Swenshuai.xi                 }
5740*53ee8cc1Swenshuai.xi 
5741*53ee8cc1Swenshuai.xi                 k++;
5742*53ee8cc1Swenshuai.xi             }
5743*53ee8cc1Swenshuai.xi             while ( (k <= _u8Spectral_end) && ( k < 64 ) );
5744*53ee8cc1Swenshuai.xi 
5745*53ee8cc1Swenshuai.xi             if ( ( s ) && ( k < 64 ) )
5746*53ee8cc1Swenshuai.xi             {
5747*53ee8cc1Swenshuai.xi                 // No need to do ZAG order in JPD mode
5748*53ee8cc1Swenshuai.xi #ifdef CMODEL
5749*53ee8cc1Swenshuai.xi                 //p[_u8ZAG[k]] = s;
5750*53ee8cc1Swenshuai.xi                 p[k] = s;
5751*53ee8cc1Swenshuai.xi #else
5752*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5753*53ee8cc1Swenshuai.xi                 if((E_JPEG_CMYK == gu8Scan_type)
5754*53ee8cc1Swenshuai.xi                 || (E_JPEG_RGB == gu8Scan_type))
5755*53ee8cc1Swenshuai.xi                 {
5756*53ee8cc1Swenshuai.xi                     p[_u8ZAG[k]] = s;
5757*53ee8cc1Swenshuai.xi                 }
5758*53ee8cc1Swenshuai.xi                 else
5759*53ee8cc1Swenshuai.xi #endif
5760*53ee8cc1Swenshuai.xi                 {
5761*53ee8cc1Swenshuai.xi                     p[k] = s;
5762*53ee8cc1Swenshuai.xi                 }
5763*53ee8cc1Swenshuai.xi #endif
5764*53ee8cc1Swenshuai.xi             }
5765*53ee8cc1Swenshuai.xi         }
5766*53ee8cc1Swenshuai.xi     }
5767*53ee8cc1Swenshuai.xi 
5768*53ee8cc1Swenshuai.xi     if ( _u32EOB_run > 0 )
5769*53ee8cc1Swenshuai.xi     {
5770*53ee8cc1Swenshuai.xi         for ( ; (k <= _u8Spectral_end) && ( k < 64 ); k++ )
5771*53ee8cc1Swenshuai.xi         {
5772*53ee8cc1Swenshuai.xi             // No need to do ZAG order in JPD mode
5773*53ee8cc1Swenshuai.xi #ifdef CMODEL
5774*53ee8cc1Swenshuai.xi             //JPEG_BLOCK_TYPE *this_coef = p + _u8ZAG[k];
5775*53ee8cc1Swenshuai.xi             JPEG_BLOCK_TYPE *this_coef = p + k;
5776*53ee8cc1Swenshuai.xi #else
5777*53ee8cc1Swenshuai.xi             JPEG_BLOCK_TYPE *this_coef;
5778*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5779*53ee8cc1Swenshuai.xi             if((E_JPEG_CMYK == gu8Scan_type)
5780*53ee8cc1Swenshuai.xi             || (E_JPEG_RGB == gu8Scan_type))
5781*53ee8cc1Swenshuai.xi             {
5782*53ee8cc1Swenshuai.xi                 this_coef = p + _u8ZAG[k];
5783*53ee8cc1Swenshuai.xi             }
5784*53ee8cc1Swenshuai.xi             else
5785*53ee8cc1Swenshuai.xi #endif
5786*53ee8cc1Swenshuai.xi             {
5787*53ee8cc1Swenshuai.xi                 this_coef = p + k;
5788*53ee8cc1Swenshuai.xi             }
5789*53ee8cc1Swenshuai.xi #endif
5790*53ee8cc1Swenshuai.xi 
5791*53ee8cc1Swenshuai.xi             if ( *this_coef != 0 )
5792*53ee8cc1Swenshuai.xi             {
5793*53ee8cc1Swenshuai.xi                 if ( JPEG_get_bits_2( 1 ) )
5794*53ee8cc1Swenshuai.xi                 {
5795*53ee8cc1Swenshuai.xi                     if ( ( *this_coef & p1 ) == 0 )
5796*53ee8cc1Swenshuai.xi                     {
5797*53ee8cc1Swenshuai.xi                         if ( *this_coef >= 0 )
5798*53ee8cc1Swenshuai.xi                         {
5799*53ee8cc1Swenshuai.xi                             *this_coef += p1;
5800*53ee8cc1Swenshuai.xi                         }
5801*53ee8cc1Swenshuai.xi                         else
5802*53ee8cc1Swenshuai.xi                         {
5803*53ee8cc1Swenshuai.xi                             *this_coef += m1;
5804*53ee8cc1Swenshuai.xi                         }
5805*53ee8cc1Swenshuai.xi                     }
5806*53ee8cc1Swenshuai.xi                 }
5807*53ee8cc1Swenshuai.xi             }
5808*53ee8cc1Swenshuai.xi         }
5809*53ee8cc1Swenshuai.xi 
5810*53ee8cc1Swenshuai.xi         _u32EOB_run--;
5811*53ee8cc1Swenshuai.xi     }
5812*53ee8cc1Swenshuai.xi     return TRUE;
5813*53ee8cc1Swenshuai.xi }
5814*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5815*53ee8cc1Swenshuai.xi // Decode a scan in a progressively encoded image.
JPEG_decode_scan(Pdecode_block_func decode_block_func)5816*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_scan(Pdecode_block_func decode_block_func)
5817*53ee8cc1Swenshuai.xi {
5818*53ee8cc1Swenshuai.xi     MS_U16 mcu_row, mcu_col, mcu_block;
5819*53ee8cc1Swenshuai.xi     MS_U32 block_x_mcu[JPEG_MAXCOMPONENTS], block_y_mcu[JPEG_MAXCOMPONENTS];
5820*53ee8cc1Swenshuai.xi 
5821*53ee8cc1Swenshuai.xi     JPEG_memset((void *)block_y_mcu, 0, sizeof( block_y_mcu ) );
5822*53ee8cc1Swenshuai.xi 
5823*53ee8cc1Swenshuai.xi     for ( mcu_col = 0; mcu_col < _u16Mcus_per_col; mcu_col++ )
5824*53ee8cc1Swenshuai.xi     {
5825*53ee8cc1Swenshuai.xi         int component_num, component_id;
5826*53ee8cc1Swenshuai.xi 
5827*53ee8cc1Swenshuai.xi         JPEG_memset((void *)block_x_mcu, 0, sizeof( block_x_mcu ) );
5828*53ee8cc1Swenshuai.xi 
5829*53ee8cc1Swenshuai.xi         for ( mcu_row = 0; mcu_row < _u16Mcus_per_row; mcu_row++ )
5830*53ee8cc1Swenshuai.xi         {
5831*53ee8cc1Swenshuai.xi             MS_U8 block_x_mcu_ofs = 0, block_y_mcu_ofs = 0;
5832*53ee8cc1Swenshuai.xi 
5833*53ee8cc1Swenshuai.xi             if ( ( _u16Restart_interval ) && ( _u16Restarts_left == 0 ) )
5834*53ee8cc1Swenshuai.xi             {
5835*53ee8cc1Swenshuai.xi                 if(!JPEG_process_restart())
5836*53ee8cc1Swenshuai.xi                     return FALSE;
5837*53ee8cc1Swenshuai.xi             }
5838*53ee8cc1Swenshuai.xi 
5839*53ee8cc1Swenshuai.xi             for ( mcu_block = 0; mcu_block < _u8Blocks_per_mcu; mcu_block++ )
5840*53ee8cc1Swenshuai.xi             {
5841*53ee8cc1Swenshuai.xi                 component_id = _u8Mcu_org[mcu_block];
5842*53ee8cc1Swenshuai.xi 
5843*53ee8cc1Swenshuai.xi                 if(!decode_block_func( component_id, block_x_mcu[component_id] + block_x_mcu_ofs, block_y_mcu[component_id] + block_y_mcu_ofs ))
5844*53ee8cc1Swenshuai.xi                 {
5845*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5846*53ee8cc1Swenshuai.xi                     return FALSE;
5847*53ee8cc1Swenshuai.xi                 }
5848*53ee8cc1Swenshuai.xi 
5849*53ee8cc1Swenshuai.xi                 if ( _u8Comps_in_scan == 1 )
5850*53ee8cc1Swenshuai.xi                 {
5851*53ee8cc1Swenshuai.xi                     block_x_mcu[component_id]++;
5852*53ee8cc1Swenshuai.xi                 }
5853*53ee8cc1Swenshuai.xi                 else
5854*53ee8cc1Swenshuai.xi                 {
5855*53ee8cc1Swenshuai.xi                     if ( ++block_x_mcu_ofs == _u8Comp_h_samp[component_id] )
5856*53ee8cc1Swenshuai.xi                     {
5857*53ee8cc1Swenshuai.xi                         block_x_mcu_ofs = 0;
5858*53ee8cc1Swenshuai.xi 
5859*53ee8cc1Swenshuai.xi                         if ( ++block_y_mcu_ofs == _u8Comp_v_samp[component_id] )
5860*53ee8cc1Swenshuai.xi                         {
5861*53ee8cc1Swenshuai.xi                             block_y_mcu_ofs = 0;
5862*53ee8cc1Swenshuai.xi 
5863*53ee8cc1Swenshuai.xi                             block_x_mcu[component_id] += _u8Comp_h_samp[component_id];
5864*53ee8cc1Swenshuai.xi                         }
5865*53ee8cc1Swenshuai.xi                     }
5866*53ee8cc1Swenshuai.xi                 }
5867*53ee8cc1Swenshuai.xi             }
5868*53ee8cc1Swenshuai.xi 
5869*53ee8cc1Swenshuai.xi             _u16Restarts_left--;
5870*53ee8cc1Swenshuai.xi         }
5871*53ee8cc1Swenshuai.xi 
5872*53ee8cc1Swenshuai.xi         if ( _u8Comps_in_scan == 1 )
5873*53ee8cc1Swenshuai.xi         {
5874*53ee8cc1Swenshuai.xi             block_y_mcu[_u8Comp_list[0]]++;
5875*53ee8cc1Swenshuai.xi         }
5876*53ee8cc1Swenshuai.xi         else
5877*53ee8cc1Swenshuai.xi         {
5878*53ee8cc1Swenshuai.xi             for ( component_num = 0; component_num < _u8Comps_in_scan; component_num++ )
5879*53ee8cc1Swenshuai.xi             {
5880*53ee8cc1Swenshuai.xi                 component_id = _u8Comp_list[component_num];
5881*53ee8cc1Swenshuai.xi 
5882*53ee8cc1Swenshuai.xi                 block_y_mcu[component_id] += _u8Comp_v_samp[component_id];
5883*53ee8cc1Swenshuai.xi             }
5884*53ee8cc1Swenshuai.xi         }
5885*53ee8cc1Swenshuai.xi     }
5886*53ee8cc1Swenshuai.xi     return TRUE;
5887*53ee8cc1Swenshuai.xi }
5888*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5889*53ee8cc1Swenshuai.xi // Decode a progressively encoded image.
JPEG_init_progressive(void)5890*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_progressive(void)
5891*53ee8cc1Swenshuai.xi {
5892*53ee8cc1Swenshuai.xi     MS_U8 i;
5893*53ee8cc1Swenshuai.xi 
5894*53ee8cc1Swenshuai.xi     if ( _u8Comps_in_frame == 4 )
5895*53ee8cc1Swenshuai.xi     {
5896*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5897*53ee8cc1Swenshuai.xi         return FALSE;
5898*53ee8cc1Swenshuai.xi     }
5899*53ee8cc1Swenshuai.xi 
5900*53ee8cc1Swenshuai.xi     // Allocate the coefficient buffers.
5901*53ee8cc1Swenshuai.xi     for ( i = 0; i < _u8Comps_in_frame; i++ )
5902*53ee8cc1Swenshuai.xi     {
5903*53ee8cc1Swenshuai.xi         _DC_Coeffs[i] = JPEG_coeff_buf_open( ((gu16Max_mcus_per_row+0x1)& ~0x1) * _u8Comp_h_samp[i], ((_u16Max_mcus_per_col+0x1)& ~0x1) * _u8Comp_v_samp[i], 1, 1 );
5904*53ee8cc1Swenshuai.xi         if(_DC_Coeffs[i] == NULL)
5905*53ee8cc1Swenshuai.xi         {
5906*53ee8cc1Swenshuai.xi             return FALSE;
5907*53ee8cc1Swenshuai.xi         }
5908*53ee8cc1Swenshuai.xi 
5909*53ee8cc1Swenshuai.xi         _AC_Coeffs[i] = JPEG_coeff_buf_open( ((gu16Max_mcus_per_row+0x1)& ~0x1) * _u8Comp_h_samp[i], ((_u16Max_mcus_per_col+0x1)& ~0x1) * _u8Comp_v_samp[i], 8, 8 );
5910*53ee8cc1Swenshuai.xi         if(_AC_Coeffs[i] == NULL)
5911*53ee8cc1Swenshuai.xi         {
5912*53ee8cc1Swenshuai.xi             return FALSE;
5913*53ee8cc1Swenshuai.xi         }
5914*53ee8cc1Swenshuai.xi     }
5915*53ee8cc1Swenshuai.xi 
5916*53ee8cc1Swenshuai.xi     for ( ; ; )
5917*53ee8cc1Swenshuai.xi     {
5918*53ee8cc1Swenshuai.xi         MS_BOOL dc_only_scan, refinement_scan;
5919*53ee8cc1Swenshuai.xi         Pdecode_block_func decode_block_func;
5920*53ee8cc1Swenshuai.xi 
5921*53ee8cc1Swenshuai.xi         if (!JPEG_init_scan())
5922*53ee8cc1Swenshuai.xi         {
5923*53ee8cc1Swenshuai.xi             break;
5924*53ee8cc1Swenshuai.xi         }
5925*53ee8cc1Swenshuai.xi 
5926*53ee8cc1Swenshuai.xi         dc_only_scan = ( _u8Spectral_start == 0 );
5927*53ee8cc1Swenshuai.xi         refinement_scan = ( _u8Successive_high != 0 );
5928*53ee8cc1Swenshuai.xi 
5929*53ee8cc1Swenshuai.xi         if ( ( _u8Spectral_start > _u8Spectral_end ) || ( _u8Spectral_end > 63 ) )
5930*53ee8cc1Swenshuai.xi         {
5931*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5932*53ee8cc1Swenshuai.xi             return FALSE;
5933*53ee8cc1Swenshuai.xi         }
5934*53ee8cc1Swenshuai.xi 
5935*53ee8cc1Swenshuai.xi         if ( dc_only_scan )
5936*53ee8cc1Swenshuai.xi         {
5937*53ee8cc1Swenshuai.xi             if ( _u8Spectral_end )
5938*53ee8cc1Swenshuai.xi             {
5939*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5940*53ee8cc1Swenshuai.xi                 return FALSE;
5941*53ee8cc1Swenshuai.xi             }
5942*53ee8cc1Swenshuai.xi         }
5943*53ee8cc1Swenshuai.xi         else if ( _u8Comps_in_scan != 1 )  /* AC scans can only contain one component */
5944*53ee8cc1Swenshuai.xi         {
5945*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5946*53ee8cc1Swenshuai.xi             return FALSE;
5947*53ee8cc1Swenshuai.xi         }
5948*53ee8cc1Swenshuai.xi 
5949*53ee8cc1Swenshuai.xi         if ( ( refinement_scan ) && ( _u8Successive_low != _u8Successive_high - 1 ) )
5950*53ee8cc1Swenshuai.xi         {
5951*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_BAD_SOS_SUCCESSIVE );
5952*53ee8cc1Swenshuai.xi             return FALSE;
5953*53ee8cc1Swenshuai.xi         }
5954*53ee8cc1Swenshuai.xi 
5955*53ee8cc1Swenshuai.xi         if ( dc_only_scan )
5956*53ee8cc1Swenshuai.xi         {
5957*53ee8cc1Swenshuai.xi             if ( refinement_scan )
5958*53ee8cc1Swenshuai.xi             {
5959*53ee8cc1Swenshuai.xi                 decode_block_func = JPEG_decode_block_dc_refine;
5960*53ee8cc1Swenshuai.xi             }
5961*53ee8cc1Swenshuai.xi             else
5962*53ee8cc1Swenshuai.xi             {
5963*53ee8cc1Swenshuai.xi                 decode_block_func = JPEG_decode_block_dc_first;
5964*53ee8cc1Swenshuai.xi             }
5965*53ee8cc1Swenshuai.xi         }
5966*53ee8cc1Swenshuai.xi         else
5967*53ee8cc1Swenshuai.xi         {
5968*53ee8cc1Swenshuai.xi             if ( refinement_scan )
5969*53ee8cc1Swenshuai.xi             {
5970*53ee8cc1Swenshuai.xi                 decode_block_func = JPEG_decode_block_ac_refine;
5971*53ee8cc1Swenshuai.xi             }
5972*53ee8cc1Swenshuai.xi             else
5973*53ee8cc1Swenshuai.xi             {
5974*53ee8cc1Swenshuai.xi                 decode_block_func = JPEG_decode_block_ac_first;
5975*53ee8cc1Swenshuai.xi             }
5976*53ee8cc1Swenshuai.xi         }
5977*53ee8cc1Swenshuai.xi 
5978*53ee8cc1Swenshuai.xi         if(!JPEG_decode_scan( decode_block_func ))
5979*53ee8cc1Swenshuai.xi             return FALSE;
5980*53ee8cc1Swenshuai.xi 
5981*53ee8cc1Swenshuai.xi         _s16Bits_left = 0;
5982*53ee8cc1Swenshuai.xi     }
5983*53ee8cc1Swenshuai.xi 
5984*53ee8cc1Swenshuai.xi     _u8Comps_in_scan = _u8Comps_in_frame;
5985*53ee8cc1Swenshuai.xi 
5986*53ee8cc1Swenshuai.xi     for ( i = 0; i < _u8Comps_in_frame; i++ )
5987*53ee8cc1Swenshuai.xi     {
5988*53ee8cc1Swenshuai.xi         _u8Comp_list[i] = i;
5989*53ee8cc1Swenshuai.xi     }
5990*53ee8cc1Swenshuai.xi 
5991*53ee8cc1Swenshuai.xi     JPEG_calc_mcu_block_order();
5992*53ee8cc1Swenshuai.xi     return TRUE;
5993*53ee8cc1Swenshuai.xi }
5994*53ee8cc1Swenshuai.xi #endif
5995*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_init_sequential(void)5996*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_sequential(void)
5997*53ee8cc1Swenshuai.xi {
5998*53ee8cc1Swenshuai.xi     if ( !JPEG_init_scan() )
5999*53ee8cc1Swenshuai.xi     {
6000*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("JPEG_init_scan - E_JPEG_UNEXPECTED_MARKER\n");
6001*53ee8cc1Swenshuai.xi         JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
6002*53ee8cc1Swenshuai.xi         return FALSE;
6003*53ee8cc1Swenshuai.xi     }
6004*53ee8cc1Swenshuai.xi     return TRUE;
6005*53ee8cc1Swenshuai.xi }
6006*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6007*53ee8cc1Swenshuai.xi #if 0
6008*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_decode_start(void)
6009*53ee8cc1Swenshuai.xi {
6010*53ee8cc1Swenshuai.xi     JPEG_init_frame();
6011*53ee8cc1Swenshuai.xi 
6012*53ee8cc1Swenshuai.xi     if ( _bProgressive_flag )
6013*53ee8cc1Swenshuai.xi     {
6014*53ee8cc1Swenshuai.xi         JPEG_init_progressive();
6015*53ee8cc1Swenshuai.xi     }
6016*53ee8cc1Swenshuai.xi     else
6017*53ee8cc1Swenshuai.xi     {
6018*53ee8cc1Swenshuai.xi         JPEG_init_sequential();
6019*53ee8cc1Swenshuai.xi     }
6020*53ee8cc1Swenshuai.xi }
6021*53ee8cc1Swenshuai.xi #endif
6022*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6023*53ee8cc1Swenshuai.xi // Find the start of the JPEG file and reads enough data to determine
6024*53ee8cc1Swenshuai.xi // its size, number of components, etc.
JPEG_decode_init(void)6025*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_init(void)
6026*53ee8cc1Swenshuai.xi {
6027*53ee8cc1Swenshuai.xi     MS_U16 pic_width, pic_height;
6028*53ee8cc1Swenshuai.xi 
6029*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6030*53ee8cc1Swenshuai.xi 
6031*53ee8cc1Swenshuai.xi     _HeadCheck.result = 0;
6032*53ee8cc1Swenshuai.xi 
6033*53ee8cc1Swenshuai.xi     if(!JPEG_init())
6034*53ee8cc1Swenshuai.xi         return FALSE;
6035*53ee8cc1Swenshuai.xi 
6036*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
6037*53ee8cc1Swenshuai.xi     _pu8In_buf_ofs = _pu8In_buf_MPO_ofs;
6038*53ee8cc1Swenshuai.xi     _u32In_buf_left = _u32In_buf_MPO_left;
6039*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG_decode_init(), set _pu8In_buf_ofs=0x%lx, _u32In_buf_left=0x%lx========\n", (MS_U32)_pu8In_buf_ofs, (MS_U32)_u32In_buf_left);
6040*53ee8cc1Swenshuai.xi #endif
6041*53ee8cc1Swenshuai.xi 
6042*53ee8cc1Swenshuai.xi     if(!JPEG_locate_sof_marker())
6043*53ee8cc1Swenshuai.xi         return FALSE;
6044*53ee8cc1Swenshuai.xi 
6045*53ee8cc1Swenshuai.xi     if (bMHEG5)
6046*53ee8cc1Swenshuai.xi     {
6047*53ee8cc1Swenshuai.xi     if(_Error_code == E_JPEG_UNSUPPORTED_MARKER)
6048*53ee8cc1Swenshuai.xi         {
6049*53ee8cc1Swenshuai.xi             return TRUE;
6050*53ee8cc1Swenshuai.xi         }
6051*53ee8cc1Swenshuai.xi     }
6052*53ee8cc1Swenshuai.xi 
6053*53ee8cc1Swenshuai.xi     if(_u8DecodeType == E_JPEG_TYPE_THUMBNAIL)
6054*53ee8cc1Swenshuai.xi     {
6055*53ee8cc1Swenshuai.xi         if(_bThumbnailFound)
6056*53ee8cc1Swenshuai.xi         {
6057*53ee8cc1Swenshuai.xi             _bThumbnailAccessMode = TRUE;
6058*53ee8cc1Swenshuai.xi             ////MApi_JPEG_Finalize(); //replace with JPEG_free_all_blocks()
6059*53ee8cc1Swenshuai.xi             JPEG_free_all_blocks();
6060*53ee8cc1Swenshuai.xi 
6061*53ee8cc1Swenshuai.xi             if(!JPEG_init())
6062*53ee8cc1Swenshuai.xi                 return FALSE;
6063*53ee8cc1Swenshuai.xi 
6064*53ee8cc1Swenshuai.xi             // save the original image size, because msAPI_JPEG_init will reset all variables to 0
6065*53ee8cc1Swenshuai.xi             if(!JPEG_locate_sof_marker())
6066*53ee8cc1Swenshuai.xi                 return FALSE;
6067*53ee8cc1Swenshuai.xi 
6068*53ee8cc1Swenshuai.xi             if(_bProgressive_flag)
6069*53ee8cc1Swenshuai.xi             {
6070*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_ERR("Progressive image in thumbnail... do not handle it\n");
6071*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
6072*53ee8cc1Swenshuai.xi                 return FALSE;
6073*53ee8cc1Swenshuai.xi             }
6074*53ee8cc1Swenshuai.xi         }
6075*53ee8cc1Swenshuai.xi         else
6076*53ee8cc1Swenshuai.xi         {
6077*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_NO_THUMBNAIL );
6078*53ee8cc1Swenshuai.xi             return FALSE;
6079*53ee8cc1Swenshuai.xi         }
6080*53ee8cc1Swenshuai.xi     }
6081*53ee8cc1Swenshuai.xi 
6082*53ee8cc1Swenshuai.xi     // calculate aligned resolution
6083*53ee8cc1Swenshuai.xi     JPEG_GetAlignedResolution(&pic_width, &pic_height);
6084*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("pic_width = %d, pic_height = %d\n",pic_width, pic_height);
6085*53ee8cc1Swenshuai.xi 
6086*53ee8cc1Swenshuai.xi     _u16AlignedImagePitch = pic_width;
6087*53ee8cc1Swenshuai.xi     _u16AlignedImagePitch_H = pic_height;
6088*53ee8cc1Swenshuai.xi     _u16AlignedImageWidth = _u16Image_x_size;
6089*53ee8cc1Swenshuai.xi     _u16AlignedImageHeight = _u16Image_y_size;
6090*53ee8cc1Swenshuai.xi 
6091*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
6092*53ee8cc1Swenshuai.xi     if(bIsMPOFormat)
6093*53ee8cc1Swenshuai.xi     {
6094*53ee8cc1Swenshuai.xi         JPEG_PRO_MAX_WIDTH = JPEG_MPO_PRO_MAX_WIDTH;
6095*53ee8cc1Swenshuai.xi         JPEG_PRO_MAX_HEIGHT = JPEG_MPO_PRO_MAX_HEIGHT;
6096*53ee8cc1Swenshuai.xi         JPEG_MAX_WIDTH  = JPEG_MPO_MAX_WIDTH;
6097*53ee8cc1Swenshuai.xi         JPEG_MAX_HEIGHT   = JPEG_MPO_MAX_HEIGHT;
6098*53ee8cc1Swenshuai.xi     }
6099*53ee8cc1Swenshuai.xi #endif
6100*53ee8cc1Swenshuai.xi 
6101*53ee8cc1Swenshuai.xi     if(_bProgressive_flag)
6102*53ee8cc1Swenshuai.xi     {
6103*53ee8cc1Swenshuai.xi         MAX_JPEG_WIDTH_HD = JPEG_PRO_MAX_WIDTH;
6104*53ee8cc1Swenshuai.xi         MAX_JPEG_HEIGHT_HD = JPEG_PRO_MAX_HEIGHT;
6105*53ee8cc1Swenshuai.xi     }
6106*53ee8cc1Swenshuai.xi     else
6107*53ee8cc1Swenshuai.xi     {
6108*53ee8cc1Swenshuai.xi         MAX_JPEG_WIDTH_HD = JPEG_MAX_WIDTH;
6109*53ee8cc1Swenshuai.xi         MAX_JPEG_HEIGHT_HD = JPEG_MAX_HEIGHT;
6110*53ee8cc1Swenshuai.xi     }
6111*53ee8cc1Swenshuai.xi 
6112*53ee8cc1Swenshuai.xi #ifndef CMODEL
6113*53ee8cc1Swenshuai.xi     // calculate down scale factor
6114*53ee8cc1Swenshuai.xi     if ((_u16Image_x_size > MAX_JPEG_WIDTH_HD * 4) || (_u16Image_y_size > MAX_JPEG_HEIGHT_HD * 4))
6115*53ee8cc1Swenshuai.xi     {
6116*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("down scale 1/8!!\n");
6117*53ee8cc1Swenshuai.xi         _u8DownScaleRatio = E_JPD_DOWNSCALE_EIGHTH;
6118*53ee8cc1Swenshuai.xi         _u8ScaleDownFactor = 8;
6119*53ee8cc1Swenshuai.xi     }
6120*53ee8cc1Swenshuai.xi     else if ((_u16Image_x_size > MAX_JPEG_WIDTH_HD * 2) || (_u16Image_y_size > MAX_JPEG_HEIGHT_HD * 2))
6121*53ee8cc1Swenshuai.xi     {
6122*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("down scale 1/4!!\n");
6123*53ee8cc1Swenshuai.xi         _u8DownScaleRatio = E_JPD_DOWNSCALE_FOURTH;
6124*53ee8cc1Swenshuai.xi         _u8ScaleDownFactor = 4;
6125*53ee8cc1Swenshuai.xi     }
6126*53ee8cc1Swenshuai.xi     else if ((_u16Image_x_size > MAX_JPEG_WIDTH_HD) || (_u16Image_y_size > MAX_JPEG_HEIGHT_HD))
6127*53ee8cc1Swenshuai.xi     {
6128*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("down scale 1/2!!\n");
6129*53ee8cc1Swenshuai.xi         _u8DownScaleRatio = E_JPD_DOWNSCALE_HALF;
6130*53ee8cc1Swenshuai.xi         _u8ScaleDownFactor = 2;
6131*53ee8cc1Swenshuai.xi     }
6132*53ee8cc1Swenshuai.xi     else
6133*53ee8cc1Swenshuai.xi     {
6134*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("down scale 1/1!!\n");
6135*53ee8cc1Swenshuai.xi         _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
6136*53ee8cc1Swenshuai.xi         _u8ScaleDownFactor = 1;
6137*53ee8cc1Swenshuai.xi     }
6138*53ee8cc1Swenshuai.xi 
6139*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_11_JPEGScaleDownFunctionTest_2==true) \
6140*53ee8cc1Swenshuai.xi     || (ENABLE_TEST_11_JPEGScaleDownFunctionTest_4==true) \
6141*53ee8cc1Swenshuai.xi     || (ENABLE_TEST_11_JPEGScaleDownFunctionTest_8==true)
6142*53ee8cc1Swenshuai.xi     //downscale test(only for unit test)
6143*53ee8cc1Swenshuai.xi 
6144*53ee8cc1Swenshuai.xi     #if (ENABLE_TEST_11_JPEGScaleDownFunctionTest_2==true)
6145*53ee8cc1Swenshuai.xi     _u8DownScaleRatio = E_JPD_DOWNSCALE_HALF;
6146*53ee8cc1Swenshuai.xi     #elif (ENABLE_TEST_11_JPEGScaleDownFunctionTest_4==true)
6147*53ee8cc1Swenshuai.xi     _u8DownScaleRatio = E_JPD_DOWNSCALE_FOURTH;
6148*53ee8cc1Swenshuai.xi     #elif (ENABLE_TEST_11_JPEGScaleDownFunctionTest_8==true)
6149*53ee8cc1Swenshuai.xi     _u8DownScaleRatio = E_JPD_DOWNSCALE_EIGHTH;
6150*53ee8cc1Swenshuai.xi     #else
6151*53ee8cc1Swenshuai.xi     _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
6152*53ee8cc1Swenshuai.xi     #endif
6153*53ee8cc1Swenshuai.xi 
6154*53ee8cc1Swenshuai.xi     if(_u8DownScaleRatio == E_JPD_DOWNSCALE_HALF)
6155*53ee8cc1Swenshuai.xi     {
6156*53ee8cc1Swenshuai.xi         _u8ScaleDownFactor = 2;
6157*53ee8cc1Swenshuai.xi     }
6158*53ee8cc1Swenshuai.xi     else if(_u8DownScaleRatio == E_JPD_DOWNSCALE_FOURTH)
6159*53ee8cc1Swenshuai.xi     {
6160*53ee8cc1Swenshuai.xi         _u8ScaleDownFactor = 4;
6161*53ee8cc1Swenshuai.xi     }
6162*53ee8cc1Swenshuai.xi     else if(_u8DownScaleRatio == E_JPD_DOWNSCALE_EIGHTH)
6163*53ee8cc1Swenshuai.xi     {
6164*53ee8cc1Swenshuai.xi         _u8ScaleDownFactor = 8;
6165*53ee8cc1Swenshuai.xi     }
6166*53ee8cc1Swenshuai.xi #endif
6167*53ee8cc1Swenshuai.xi 
6168*53ee8cc1Swenshuai.xi     if (E_JPD_DOWNSCALE_ORG != _u8DownScaleRatio)
6169*53ee8cc1Swenshuai.xi     {
6170*53ee8cc1Swenshuai.xi         _u16AlignedImagePitch = pic_width / _u8ScaleDownFactor;
6171*53ee8cc1Swenshuai.xi         _u16AlignedImagePitch_H =
6172*53ee8cc1Swenshuai.xi             ((pic_height + ((MS_U32)_u8ScaleDownFactor - 1)) & (~((MS_U32)_u8ScaleDownFactor - 1)))/ _u8ScaleDownFactor;
6173*53ee8cc1Swenshuai.xi         _u16AlignedImageWidth = _u16Image_x_size / _u8ScaleDownFactor;
6174*53ee8cc1Swenshuai.xi         _u16AlignedImageHeight =
6175*53ee8cc1Swenshuai.xi                 ((_u16AlignedImageHeight + ((MS_U32)_u8ScaleDownFactor - 1)) & (~((MS_U32)_u8ScaleDownFactor - 1))) / _u8ScaleDownFactor;
6176*53ee8cc1Swenshuai.xi     }
6177*53ee8cc1Swenshuai.xi 
6178*53ee8cc1Swenshuai.xi     switch (_u8DownScaleRatio)
6179*53ee8cc1Swenshuai.xi     {
6180*53ee8cc1Swenshuai.xi         case E_JPD_DOWNSCALE_HALF:
6181*53ee8cc1Swenshuai.xi             ROI_width = (pic_width / 16) * 16;
6182*53ee8cc1Swenshuai.xi             break;
6183*53ee8cc1Swenshuai.xi 
6184*53ee8cc1Swenshuai.xi         case E_JPD_DOWNSCALE_FOURTH:
6185*53ee8cc1Swenshuai.xi             ROI_width = (pic_width / 32) * 32;
6186*53ee8cc1Swenshuai.xi             break;
6187*53ee8cc1Swenshuai.xi 
6188*53ee8cc1Swenshuai.xi         case E_JPD_DOWNSCALE_EIGHTH:
6189*53ee8cc1Swenshuai.xi             ROI_width = (pic_width / 64) * 64;
6190*53ee8cc1Swenshuai.xi             break;
6191*53ee8cc1Swenshuai.xi 
6192*53ee8cc1Swenshuai.xi         default:
6193*53ee8cc1Swenshuai.xi             ROI_width = pic_width;
6194*53ee8cc1Swenshuai.xi             break;
6195*53ee8cc1Swenshuai.xi     }
6196*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("Original ROI_width = %d \n", ROI_width);
6197*53ee8cc1Swenshuai.xi 
6198*53ee8cc1Swenshuai.xi     if (ROI_width != pic_width)
6199*53ee8cc1Swenshuai.xi     {
6200*53ee8cc1Swenshuai.xi         _u16AlignedImagePitch = _u16AlignedImageWidth = ROI_width / _u8ScaleDownFactor;
6201*53ee8cc1Swenshuai.xi 
6202*53ee8cc1Swenshuai.xi         if(_bProgressive_flag)
6203*53ee8cc1Swenshuai.xi             _Progressive_ROI_flag = TRUE;
6204*53ee8cc1Swenshuai.xi     }
6205*53ee8cc1Swenshuai.xi #endif //#ifndef CMODEL
6206*53ee8cc1Swenshuai.xi     return TRUE;
6207*53ee8cc1Swenshuai.xi }
6208*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI - harold
6209*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6210*53ee8cc1Swenshuai.xi JPEG_STATIC void msAPI_MJPEG_decode_init(PJPEG_FILE_FileSystem_t Pstream)
6211*53ee8cc1Swenshuai.xi {
6212*53ee8cc1Swenshuai.xi     JPEG_init( Pstream );
6213*53ee8cc1Swenshuai.xi     MSAPI_MJPEG_Get_Pics();
6214*53ee8cc1Swenshuai.xi     JPEG_locate_sof_marker();
6215*53ee8cc1Swenshuai.xi 
6216*53ee8cc1Swenshuai.xi     if(_u8DecodeType == E_JPEG_TYPE_THUMBNAIL)
6217*53ee8cc1Swenshuai.xi     {
6218*53ee8cc1Swenshuai.xi         if(_bThumbnailFound)
6219*53ee8cc1Swenshuai.xi         {
6220*53ee8cc1Swenshuai.xi             _bThumbnailAccessMode = TRUE;
6221*53ee8cc1Swenshuai.xi             ////MApi_JPEG_Finalize(); //replace with JPEG_free_all_blocks()
6222*53ee8cc1Swenshuai.xi             JPEG_free_all_blocks();
6223*53ee8cc1Swenshuai.xi             JPEG_init( Pstream );
6224*53ee8cc1Swenshuai.xi 
6225*53ee8cc1Swenshuai.xi             JPEG_locate_sof_marker();
6226*53ee8cc1Swenshuai.xi 
6227*53ee8cc1Swenshuai.xi             if(_bProgressive_flag)
6228*53ee8cc1Swenshuai.xi             {
6229*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("Progressive image in thumbnail... do not handle it\n");
6230*53ee8cc1Swenshuai.xi                 JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
6231*53ee8cc1Swenshuai.xi             }
6232*53ee8cc1Swenshuai.xi         }
6233*53ee8cc1Swenshuai.xi         else
6234*53ee8cc1Swenshuai.xi         {
6235*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_NO_THUMBNAIL );
6236*53ee8cc1Swenshuai.xi         }
6237*53ee8cc1Swenshuai.xi     }
6238*53ee8cc1Swenshuai.xi }
6239*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6240*53ee8cc1Swenshuai.xi // Parse header of MJPEG to get total num of pics in the file
6241*53ee8cc1Swenshuai.xi JPEG_STATIC void MSAPI_MJPEG_Get_Pics(void)
6242*53ee8cc1Swenshuai.xi {
6243*53ee8cc1Swenshuai.xi     //Num of pics located at Byte 49~52, hence we need to offset 48 bytes
6244*53ee8cc1Swenshuai.xi     MS_U8 ByteOffset, ByteSkip = 48;
6245*53ee8cc1Swenshuai.xi 
6246*53ee8cc1Swenshuai.xi     //Total num of pics
6247*53ee8cc1Swenshuai.xi     NumPics = 0;
6248*53ee8cc1Swenshuai.xi 
6249*53ee8cc1Swenshuai.xi     for(ByteOffset = 0; ByteOffset < ByteSkip; ByteOffset++)
6250*53ee8cc1Swenshuai.xi     {
6251*53ee8cc1Swenshuai.xi         JPEG_get_char();
6252*53ee8cc1Swenshuai.xi     }
6253*53ee8cc1Swenshuai.xi 
6254*53ee8cc1Swenshuai.xi     //Handle Little-Ending
6255*53ee8cc1Swenshuai.xi     NumPics += (JPEG_get_char());
6256*53ee8cc1Swenshuai.xi     NumPics += (JPEG_get_char() << 8);
6257*53ee8cc1Swenshuai.xi     NumPics += (JPEG_get_char() << 16);
6258*53ee8cc1Swenshuai.xi     NumPics += (JPEG_get_char() << 24);
6259*53ee8cc1Swenshuai.xi 
6260*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("NumPics = %ld\n",NumPics);
6261*53ee8cc1Swenshuai.xi }
6262*53ee8cc1Swenshuai.xi #endif // not implement for new MDDI - harold
6263*53ee8cc1Swenshuai.xi 
6264*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
6265*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6266*53ee8cc1Swenshuai.xi // Loads and dequantizes the next row of (already decoded) coefficients.
6267*53ee8cc1Swenshuai.xi // Progressive images only.
JPEG_load_next_row(void)6268*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_load_next_row(void)
6269*53ee8cc1Swenshuai.xi {
6270*53ee8cc1Swenshuai.xi #ifndef CMODEL
6271*53ee8cc1Swenshuai.xi     JPEG_BLOCK_TYPE p[64];
6272*53ee8cc1Swenshuai.xi     MS_BOOL EOF_Flag = FALSE; //CL82399
6273*53ee8cc1Swenshuai.xi #else
6274*53ee8cc1Swenshuai.xi     MS_S16 i;
6275*53ee8cc1Swenshuai.xi     JPEG_BLOCK_TYPE *p;
6276*53ee8cc1Swenshuai.xi     MS_U16 row_block = 0;
6277*53ee8cc1Swenshuai.xi     JPEG_QUANT_TYPE *q;
6278*53ee8cc1Swenshuai.xi #endif
6279*53ee8cc1Swenshuai.xi 
6280*53ee8cc1Swenshuai.xi     MS_U16 mcu_row, mcu_block;
6281*53ee8cc1Swenshuai.xi     MS_U8 component_num, component_id;
6282*53ee8cc1Swenshuai.xi     MS_U16 block_x_mcu[JPEG_MAXCOMPONENTS];
6283*53ee8cc1Swenshuai.xi 
6284*53ee8cc1Swenshuai.xi     JPEG_memset((void *)block_x_mcu, 0, JPEG_MAXCOMPONENTS * sizeof( MS_U16 ) );
6285*53ee8cc1Swenshuai.xi 
6286*53ee8cc1Swenshuai.xi     for ( mcu_row = 0; mcu_row < _u16Mcus_per_row; mcu_row++ )
6287*53ee8cc1Swenshuai.xi     {
6288*53ee8cc1Swenshuai.xi         MS_U16 block_x_mcu_ofs = 0, block_y_mcu_ofs = 0;
6289*53ee8cc1Swenshuai.xi 
6290*53ee8cc1Swenshuai.xi         for ( mcu_block = 0; mcu_block < _u8Blocks_per_mcu; mcu_block++ )
6291*53ee8cc1Swenshuai.xi         {
6292*53ee8cc1Swenshuai.xi             JPEG_BLOCK_TYPE *pAC;
6293*53ee8cc1Swenshuai.xi             JPEG_BLOCK_TYPE *pDC;
6294*53ee8cc1Swenshuai.xi 
6295*53ee8cc1Swenshuai.xi             component_id = _u8Mcu_org[mcu_block];
6296*53ee8cc1Swenshuai.xi 
6297*53ee8cc1Swenshuai.xi #ifdef CMODEL
6298*53ee8cc1Swenshuai.xi             p = gps16Block_seg[row_block];
6299*53ee8cc1Swenshuai.xi             q = _QuantTables[_u8Comp_quant[component_id]].s16Value;
6300*53ee8cc1Swenshuai.xi #endif
6301*53ee8cc1Swenshuai.xi 
6302*53ee8cc1Swenshuai.xi             pAC = JPEG_coeff_buf_getp( _AC_Coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, _u32Block_y_mcu[component_id] + block_y_mcu_ofs );
6303*53ee8cc1Swenshuai.xi             if(pAC == NULL)
6304*53ee8cc1Swenshuai.xi             {
6305*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
6306*53ee8cc1Swenshuai.xi                 return FALSE;
6307*53ee8cc1Swenshuai.xi             }
6308*53ee8cc1Swenshuai.xi 
6309*53ee8cc1Swenshuai.xi             pDC = JPEG_coeff_buf_getp( _DC_Coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, _u32Block_y_mcu[component_id] + block_y_mcu_ofs );
6310*53ee8cc1Swenshuai.xi             if(pDC == NULL)
6311*53ee8cc1Swenshuai.xi             {
6312*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
6313*53ee8cc1Swenshuai.xi                 return FALSE;
6314*53ee8cc1Swenshuai.xi             }
6315*53ee8cc1Swenshuai.xi             p[0] = pDC[0];
6316*53ee8cc1Swenshuai.xi             JPEG_memcpy((void *)&p[1], (void *)&pAC[1], 63 * sizeof( JPEG_BLOCK_TYPE ) );
6317*53ee8cc1Swenshuai.xi 
6318*53ee8cc1Swenshuai.xi #ifdef CMODEL //cmodel do not support scale down feature.
6319*53ee8cc1Swenshuai.xi             if(mcu_block==(_u8Blocks_per_mcu -1)&&mcu_row==(_u16Mcus_per_row - 1)&&(_u16Total_lines_left - gu8Max_mcu_y_size)==0)
6320*53ee8cc1Swenshuai.xi             {
6321*53ee8cc1Swenshuai.xi                 if(!JPEG_do_RLE(p, TRUE, component_id, TRUE))   // means it is end of picture
6322*53ee8cc1Swenshuai.xi                     return FALSE;
6323*53ee8cc1Swenshuai.xi             }
6324*53ee8cc1Swenshuai.xi             else
6325*53ee8cc1Swenshuai.xi             {
6326*53ee8cc1Swenshuai.xi                 if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6327*53ee8cc1Swenshuai.xi                     return FALSE;
6328*53ee8cc1Swenshuai.xi             }
6329*53ee8cc1Swenshuai.xi #else //CL82399
6330*53ee8cc1Swenshuai.xi             if( _Progressive_ROI_flag == FALSE )
6331*53ee8cc1Swenshuai.xi             {
6332*53ee8cc1Swenshuai.xi                 if((mcu_block == (_u8Blocks_per_mcu - 1))
6333*53ee8cc1Swenshuai.xi                 && (mcu_row == (_u16Mcus_per_row - 1))
6334*53ee8cc1Swenshuai.xi                 && (_u16Total_lines_left == gu8Max_mcu_y_size))
6335*53ee8cc1Swenshuai.xi                 {
6336*53ee8cc1Swenshuai.xi                     JPEG_DEBUG_API_MSG("EOF!!!!!ROI enable!!!\n");
6337*53ee8cc1Swenshuai.xi                     if(!JPEG_do_RLE(p, TRUE, component_id, TRUE))   // means it is end of picture
6338*53ee8cc1Swenshuai.xi                         return FALSE;
6339*53ee8cc1Swenshuai.xi                 }
6340*53ee8cc1Swenshuai.xi                 else
6341*53ee8cc1Swenshuai.xi                 {
6342*53ee8cc1Swenshuai.xi                     if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6343*53ee8cc1Swenshuai.xi                         return FALSE;
6344*53ee8cc1Swenshuai.xi                 }
6345*53ee8cc1Swenshuai.xi             }
6346*53ee8cc1Swenshuai.xi             else
6347*53ee8cc1Swenshuai.xi             {
6348*53ee8cc1Swenshuai.xi                 if( _u16Total_lines_left == gu8Max_mcu_y_size )//Last Line
6349*53ee8cc1Swenshuai.xi                 {
6350*53ee8cc1Swenshuai.xi                     //JPEG_DEBUG_API_MSG("_u16Total_lines_left ==%d,%d,%d \n", gu8Max_mcu_y_size, mcu_block, mcu_row);
6351*53ee8cc1Swenshuai.xi 
6352*53ee8cc1Swenshuai.xi                     if((mcu_block == (_u8Blocks_per_mcu - 1))
6353*53ee8cc1Swenshuai.xi                     && ((mcu_row + 2) * gu8Max_mcu_x_size >  ROI_width))//Last line last block within rang
6354*53ee8cc1Swenshuai.xi                     {
6355*53ee8cc1Swenshuai.xi                         if( EOF_Flag == FALSE )
6356*53ee8cc1Swenshuai.xi                         {
6357*53ee8cc1Swenshuai.xi                             EOF_Flag = TRUE;
6358*53ee8cc1Swenshuai.xi                             JPEG_DEBUG_API_MSG("EOF!!!!!No ROI!!!\n");
6359*53ee8cc1Swenshuai.xi                             if(!JPEG_do_RLE(p, TRUE, component_id, TRUE))   // means it is end of picture
6360*53ee8cc1Swenshuai.xi                                 return FALSE;
6361*53ee8cc1Swenshuai.xi                         }
6362*53ee8cc1Swenshuai.xi                     }
6363*53ee8cc1Swenshuai.xi                     else
6364*53ee8cc1Swenshuai.xi                     {
6365*53ee8cc1Swenshuai.xi                          if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6366*53ee8cc1Swenshuai.xi                             return FALSE;
6367*53ee8cc1Swenshuai.xi                     }
6368*53ee8cc1Swenshuai.xi                 }
6369*53ee8cc1Swenshuai.xi                 else
6370*53ee8cc1Swenshuai.xi                 {
6371*53ee8cc1Swenshuai.xi                     if((mcu_row + 1) * gu8Max_mcu_x_size >  ROI_width)//ever line out rang block
6372*53ee8cc1Swenshuai.xi                     {
6373*53ee8cc1Swenshuai.xi                         //JPEG_do_RLE(p, FALSE, component_id, FALSE);
6374*53ee8cc1Swenshuai.xi                     }
6375*53ee8cc1Swenshuai.xi                     else
6376*53ee8cc1Swenshuai.xi                     {
6377*53ee8cc1Swenshuai.xi                         if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6378*53ee8cc1Swenshuai.xi                             return FALSE;
6379*53ee8cc1Swenshuai.xi                     }
6380*53ee8cc1Swenshuai.xi                 }
6381*53ee8cc1Swenshuai.xi             }
6382*53ee8cc1Swenshuai.xi #endif
6383*53ee8cc1Swenshuai.xi 
6384*53ee8cc1Swenshuai.xi 
6385*53ee8cc1Swenshuai.xi #ifdef CMODEL
6386*53ee8cc1Swenshuai.xi             {
6387*53ee8cc1Swenshuai.xi                 for ( i = 63; i > 0; i-- )
6388*53ee8cc1Swenshuai.xi                 {
6389*53ee8cc1Swenshuai.xi                     if ( p[_u8ZAG[i]] )
6390*53ee8cc1Swenshuai.xi                     {
6391*53ee8cc1Swenshuai.xi                         break;
6392*53ee8cc1Swenshuai.xi                     }
6393*53ee8cc1Swenshuai.xi                 }
6394*53ee8cc1Swenshuai.xi 
6395*53ee8cc1Swenshuai.xi                 //block_num[row_block++] = i + 1;
6396*53ee8cc1Swenshuai.xi 
6397*53ee8cc1Swenshuai.xi                 for ( ; i >= 0; i-- )
6398*53ee8cc1Swenshuai.xi                 {
6399*53ee8cc1Swenshuai.xi                     if ( p[_u8ZAG[i]] )
6400*53ee8cc1Swenshuai.xi                     {
6401*53ee8cc1Swenshuai.xi                         p[_u8ZAG[i]] *= q[i];
6402*53ee8cc1Swenshuai.xi                     }
6403*53ee8cc1Swenshuai.xi                 }
6404*53ee8cc1Swenshuai.xi             }
6405*53ee8cc1Swenshuai.xi 
6406*53ee8cc1Swenshuai.xi             row_block++;
6407*53ee8cc1Swenshuai.xi #endif
6408*53ee8cc1Swenshuai.xi 
6409*53ee8cc1Swenshuai.xi             if ( _u8Comps_in_scan == 1 )
6410*53ee8cc1Swenshuai.xi             {
6411*53ee8cc1Swenshuai.xi                 block_x_mcu[component_id]++;
6412*53ee8cc1Swenshuai.xi             }
6413*53ee8cc1Swenshuai.xi             else
6414*53ee8cc1Swenshuai.xi             {
6415*53ee8cc1Swenshuai.xi                 if ( ++block_x_mcu_ofs == _u8Comp_h_samp[component_id] )
6416*53ee8cc1Swenshuai.xi                 {
6417*53ee8cc1Swenshuai.xi                     block_x_mcu_ofs = 0;
6418*53ee8cc1Swenshuai.xi 
6419*53ee8cc1Swenshuai.xi                     if ( ++block_y_mcu_ofs == _u8Comp_v_samp[component_id] )
6420*53ee8cc1Swenshuai.xi                     {
6421*53ee8cc1Swenshuai.xi                         block_y_mcu_ofs = 0;
6422*53ee8cc1Swenshuai.xi 
6423*53ee8cc1Swenshuai.xi                         block_x_mcu[component_id] += _u8Comp_h_samp[component_id];
6424*53ee8cc1Swenshuai.xi                     }
6425*53ee8cc1Swenshuai.xi                 }
6426*53ee8cc1Swenshuai.xi             }
6427*53ee8cc1Swenshuai.xi         }
6428*53ee8cc1Swenshuai.xi     }
6429*53ee8cc1Swenshuai.xi 
6430*53ee8cc1Swenshuai.xi     if ( _u8Comps_in_scan == 1 )
6431*53ee8cc1Swenshuai.xi     {
6432*53ee8cc1Swenshuai.xi         _u32Block_y_mcu[_u8Comp_list[0]]++;
6433*53ee8cc1Swenshuai.xi     }
6434*53ee8cc1Swenshuai.xi     else
6435*53ee8cc1Swenshuai.xi     {
6436*53ee8cc1Swenshuai.xi         for ( component_num = 0; component_num < _u8Comps_in_scan; component_num++ )
6437*53ee8cc1Swenshuai.xi         {
6438*53ee8cc1Swenshuai.xi             component_id = _u8Comp_list[component_num];
6439*53ee8cc1Swenshuai.xi 
6440*53ee8cc1Swenshuai.xi             _u32Block_y_mcu[component_id] += _u8Comp_v_samp[component_id];
6441*53ee8cc1Swenshuai.xi         }
6442*53ee8cc1Swenshuai.xi     }
6443*53ee8cc1Swenshuai.xi     return TRUE;
6444*53ee8cc1Swenshuai.xi }
6445*53ee8cc1Swenshuai.xi #endif
6446*53ee8cc1Swenshuai.xi 
6447*53ee8cc1Swenshuai.xi #ifndef CMODEL
6448*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6449*53ee8cc1Swenshuai.xi /******************************************************************************/
6450*53ee8cc1Swenshuai.xi ///Start JPEG decoding
6451*53ee8cc1Swenshuai.xi /******************************************************************************/
JPEG_StartDecode(void)6452*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_StartDecode(void)
6453*53ee8cc1Swenshuai.xi {
6454*53ee8cc1Swenshuai.xi     MS_U16 pic_width, pic_height;
6455*53ee8cc1Swenshuai.xi     MS_U8 Y_VSF = _u8Comp_v_samp[0];
6456*53ee8cc1Swenshuai.xi     MS_U8 Y_HSF = _u8Comp_h_samp[0];
6457*53ee8cc1Swenshuai.xi     MS_BOOL bUV_en;
6458*53ee8cc1Swenshuai.xi     MS_U32 reg_value;
6459*53ee8cc1Swenshuai.xi     MS_U8 i;
6460*53ee8cc1Swenshuai.xi     MS_U8 com_num = 0;
6461*53ee8cc1Swenshuai.xi     MS_U8 comp[JPEG_MAXCOMPONENTS];
6462*53ee8cc1Swenshuai.xi     JPD_BufCfg structBuf;
6463*53ee8cc1Swenshuai.xi 
6464*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6465*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
6466*53ee8cc1Swenshuai.xi     if ( setjmp( _jmp_state ) )
6467*53ee8cc1Swenshuai.xi     {
6468*53ee8cc1Swenshuai.xi         return FALSE;
6469*53ee8cc1Swenshuai.xi     }
6470*53ee8cc1Swenshuai.xi #endif
6471*53ee8cc1Swenshuai.xi 
6472*53ee8cc1Swenshuai.xi #if ENABLE_JPEG_NO_SIZE_LOWER_BOUND
6473*53ee8cc1Swenshuai.xi     MDrv_JPD_SetPicDimension(0xFF, 0xFF);
6474*53ee8cc1Swenshuai.xi #endif
6475*53ee8cc1Swenshuai.xi 
6476*53ee8cc1Swenshuai.xi     // reset JPD hardware
6477*53ee8cc1Swenshuai.xi     //MDrv_JPD_Reset();
6478*53ee8cc1Swenshuai.xi     if(_bProgressive_flag)
6479*53ee8cc1Swenshuai.xi     {
6480*53ee8cc1Swenshuai.xi         MDrv_JPD_Rst_SVLD();
6481*53ee8cc1Swenshuai.xi     }
6482*53ee8cc1Swenshuai.xi     else
6483*53ee8cc1Swenshuai.xi     {
6484*53ee8cc1Swenshuai.xi         MDrv_JPD_Rst();
6485*53ee8cc1Swenshuai.xi     }
6486*53ee8cc1Swenshuai.xi 
6487*53ee8cc1Swenshuai.xi 
6488*53ee8cc1Swenshuai.xi     // Calculate how many valid quantization tables for components
6489*53ee8cc1Swenshuai.xi     JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
6490*53ee8cc1Swenshuai.xi     for(i = 0; i<_u8Comps_in_frame; i++)
6491*53ee8cc1Swenshuai.xi     {
6492*53ee8cc1Swenshuai.xi         comp[_u8Comp_quant[i]] = 1;
6493*53ee8cc1Swenshuai.xi     }
6494*53ee8cc1Swenshuai.xi 
6495*53ee8cc1Swenshuai.xi     for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
6496*53ee8cc1Swenshuai.xi     {
6497*53ee8cc1Swenshuai.xi         if(comp[i]==1)
6498*53ee8cc1Swenshuai.xi             com_num++;
6499*53ee8cc1Swenshuai.xi     }
6500*53ee8cc1Swenshuai.xi 
6501*53ee8cc1Swenshuai.xi     if(_u8Comps_in_frame>1)
6502*53ee8cc1Swenshuai.xi         bUV_en = TRUE;
6503*53ee8cc1Swenshuai.xi     else
6504*53ee8cc1Swenshuai.xi         bUV_en = FALSE;
6505*53ee8cc1Swenshuai.xi 
6506*53ee8cc1Swenshuai.xi     //Get Aligned width & height
6507*53ee8cc1Swenshuai.xi     JPEG_GetAlignedResolution(&pic_width, &pic_height);
6508*53ee8cc1Swenshuai.xi 
6509*53ee8cc1Swenshuai.xi #if 1
6510*53ee8cc1Swenshuai.xi     structBuf.bProgressive = _bProgressive_flag;
6511*53ee8cc1Swenshuai.xi     structBuf.bThumbnailAccessMode = _bThumbnailAccessMode;
6512*53ee8cc1Swenshuai.xi     structBuf.u32ThumbnailBufAddr = MS_VA2PA((MS_U32)INTERNAL_BUFFER_ADDR);
6513*53ee8cc1Swenshuai.xi     structBuf.u32ThumbnailBufSize = JPEG_DEFAULT_EXIF_SIZE;
6514*53ee8cc1Swenshuai.xi     structBuf.u32ThumbnailBufOffset = _u32ThumbnailOffset + JPEG_GetECS();
6515*53ee8cc1Swenshuai.xi     structBuf.u32MRCBufAddr = MS_VA2PA((MS_U32)MRC_BUFFER_ADDR);
6516*53ee8cc1Swenshuai.xi     structBuf.u32MRCBufSize = MRC_BUFFER_SIZE;
6517*53ee8cc1Swenshuai.xi     structBuf.u32MRCBufOffset = JPEG_GetECS();
6518*53ee8cc1Swenshuai.xi     structBuf.u32MWCBufAddr = MS_VA2PA((MS_U32)MWC_BUFFER_ADDR);
6519*53ee8cc1Swenshuai.xi     //HW limitation:if we don't enable write-protect mode, set this value to zero.
6520*53ee8cc1Swenshuai.xi 
6521*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_09_JPEGWriteProtectTest==false)
6522*53ee8cc1Swenshuai.xi     structBuf.u16MWCBufLineNum = 0;
6523*53ee8cc1Swenshuai.xi //    structBuf.u16MWCBufLineNum = ((pic_height/_u8ScaleDownFactor + 8) < 0x07FF)?(pic_height/_u8ScaleDownFactor + 8):0x7FF;
6524*53ee8cc1Swenshuai.xi #else
6525*53ee8cc1Swenshuai.xi     structBuf.u16MWCBufLineNum = 32;
6526*53ee8cc1Swenshuai.xi #endif
6527*53ee8cc1Swenshuai.xi 
6528*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("bProgressive = %d, bThumbnailAccessMode = %d\n"
6529*53ee8cc1Swenshuai.xi     , structBuf.bProgressive, structBuf.bThumbnailAccessMode);
6530*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("u32ThumbnailBufAddr = 0x%lX, u32ThumbnailBufSize = 0x%lX, u32ThumbnailBufOffset = 0x%lX\n"
6531*53ee8cc1Swenshuai.xi     , structBuf.u32ThumbnailBufAddr, structBuf.u32ThumbnailBufSize, structBuf.u32ThumbnailBufOffset);
6532*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("u32MRCBufAddr = 0x%lX, u32MRCBufSize = 0x%lX, u32MRCBufOffset = 0x%lX\n"
6533*53ee8cc1Swenshuai.xi     , structBuf.u32MRCBufAddr, structBuf.u32MRCBufSize, structBuf.u32MRCBufOffset);
6534*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("u32MWCBufAddr = 0x%lX, u16MWCBufLineNum = %d\n"
6535*53ee8cc1Swenshuai.xi     , structBuf.u32MWCBufAddr, structBuf.u16MWCBufLineNum);
6536*53ee8cc1Swenshuai.xi 
6537*53ee8cc1Swenshuai.xi     u32DataOffset += JPEG_GetECS();
6538*53ee8cc1Swenshuai.xi 
6539*53ee8cc1Swenshuai.xi     MDrv_JPD_InitBuf(structBuf);
6540*53ee8cc1Swenshuai.xi 
6541*53ee8cc1Swenshuai.xi //    JPEG_DEBUG_API_MSG("MWCLineNum = %d, pic_height = %d, DwnScaleRatio = %d\n"
6542*53ee8cc1Swenshuai.xi //            , structBuf.u16MWCBufLineNum, pic_height, _u8ScaleDownFactor);
6543*53ee8cc1Swenshuai.xi #else
6544*53ee8cc1Swenshuai.xi     if(_bThumbnailAccessMode)
6545*53ee8cc1Swenshuai.xi     {
6546*53ee8cc1Swenshuai.xi         // Set MRC buffer for JPD
6547*53ee8cc1Swenshuai.xi         MDrv_JPD_SetReadBuffer(INTERNAL_BUFFER_ADDR, JPEG_DEFAULT_EXIF_SIZE);
6548*53ee8cc1Swenshuai.xi         // Set MRC start access byte address
6549*53ee8cc1Swenshuai.xi         MDrv_JPD_SetMRCStartAddr(INTERNAL_BUFFER_ADDR + _u32ThumbnailOffset + JPEG_GetECS());
6550*53ee8cc1Swenshuai.xi     }
6551*53ee8cc1Swenshuai.xi     else
6552*53ee8cc1Swenshuai.xi     {
6553*53ee8cc1Swenshuai.xi         if(_bProgressive_flag)
6554*53ee8cc1Swenshuai.xi         {
6555*53ee8cc1Swenshuai.xi             // Set MRC buffer for JPD
6556*53ee8cc1Swenshuai.xi             MDrv_JPD_SetReadBuffer(MRC_BUFFER_ADDR, MRC_BUFFER_SIZE);
6557*53ee8cc1Swenshuai.xi             // Set MRC start access byte address
6558*53ee8cc1Swenshuai.xi             MDrv_JPD_SetMRCStartAddr(MRC_BUFFER_ADDR);
6559*53ee8cc1Swenshuai.xi         }
6560*53ee8cc1Swenshuai.xi         else
6561*53ee8cc1Swenshuai.xi         {
6562*53ee8cc1Swenshuai.xi             // Set MRC buffer for JPD
6563*53ee8cc1Swenshuai.xi             MDrv_JPD_SetReadBuffer(MRC_BUFFER_ADDR, MRC_BUFFER_SIZE);
6564*53ee8cc1Swenshuai.xi             // Set MRC start access byte address
6565*53ee8cc1Swenshuai.xi             MDrv_JPD_SetMRCStartAddr(MRC_BUFFER_ADDR + JPEG_GetECS());
6566*53ee8cc1Swenshuai.xi         }
6567*53ee8cc1Swenshuai.xi     }
6568*53ee8cc1Swenshuai.xi 
6569*53ee8cc1Swenshuai.xi     // Set MWC buffer for JPD
6570*53ee8cc1Swenshuai.xi     MDrv_JPD_SetOutputFrameBuffer(MWC_BUFFER_ADDR);
6571*53ee8cc1Swenshuai.xi #endif
6572*53ee8cc1Swenshuai.xi 
6573*53ee8cc1Swenshuai.xi     // Set picture width and height
6574*53ee8cc1Swenshuai.xi #if (ENABLE_JPEG_NO_SIZE_LOWER_BOUND == 0)
6575*53ee8cc1Swenshuai.xi     MDrv_JPD_SetPicDimension(pic_width, pic_height);
6576*53ee8cc1Swenshuai.xi #endif
6577*53ee8cc1Swenshuai.xi 
6578*53ee8cc1Swenshuai.xi     _u16NonAlignmentImage_x_size = pic_width;
6579*53ee8cc1Swenshuai.xi     _u16NonAlignmentImage_y_size = _u16Image_y_size;
6580*53ee8cc1Swenshuai.xi 
6581*53ee8cc1Swenshuai.xi     _u16Image_x_size = pic_width/_u8ScaleDownFactor;
6582*53ee8cc1Swenshuai.xi     _u16Image_y_size = pic_height/_u8ScaleDownFactor;
6583*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("ScaleDownFactor = %d\n", _u8ScaleDownFactor);
6584*53ee8cc1Swenshuai.xi 
6585*53ee8cc1Swenshuai.xi     // In JPD, software VLD mode, we don't need to write huff & symbol tables
6586*53ee8cc1Swenshuai.xi     if(_bProgressive_flag==FALSE)
6587*53ee8cc1Swenshuai.xi     {
6588*53ee8cc1Swenshuai.xi         //JPEG_write_Scwgif();
6589*53ee8cc1Swenshuai.xi         JPEG_WriteGrpinf();
6590*53ee8cc1Swenshuai.xi         //JPEG_write_symidx();
6591*53ee8cc1Swenshuai.xi         JPEG_WriteSymidx();
6592*53ee8cc1Swenshuai.xi     }
6593*53ee8cc1Swenshuai.xi 
6594*53ee8cc1Swenshuai.xi     //JPEG_write_Qtbl();
6595*53ee8cc1Swenshuai.xi     JPEG_WriteIQTbl();
6596*53ee8cc1Swenshuai.xi 
6597*53ee8cc1Swenshuai.xi     Y_VSF -= 1;
6598*53ee8cc1Swenshuai.xi     if ( Y_HSF == 4 )
6599*53ee8cc1Swenshuai.xi     {
6600*53ee8cc1Swenshuai.xi         Y_HSF = 3;
6601*53ee8cc1Swenshuai.xi     }
6602*53ee8cc1Swenshuai.xi 
6603*53ee8cc1Swenshuai.xi     if(_u16Restart_interval)
6604*53ee8cc1Swenshuai.xi     {
6605*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("RST found! Enable JPD_RST_EN! Restart_interval = %d\n", _u16Restart_interval);
6606*53ee8cc1Swenshuai.xi         //MDrv_Write2Byte(BK_JPD_RSTINTV, _u16Restart_interval - 1);
6607*53ee8cc1Swenshuai.xi         MDrv_JPD_SetRSTIntv(_u16Restart_interval - 1);
6608*53ee8cc1Swenshuai.xi         reg_value = ( JPD_TBL_RDY | JPD_RST_EN | ((MS_U32) _u8DownScaleRatio) << 4 | ((MS_U32) bUV_en) << 3 | ( Y_VSF << 2 ) | Y_HSF );
6609*53ee8cc1Swenshuai.xi     }
6610*53ee8cc1Swenshuai.xi     else
6611*53ee8cc1Swenshuai.xi     {
6612*53ee8cc1Swenshuai.xi         reg_value = ( JPD_TBL_RDY | ((MS_U32) _u8DownScaleRatio) << 4 | ((MS_U32) bUV_en) << 3 | ( Y_VSF << 2 ) | Y_HSF );
6613*53ee8cc1Swenshuai.xi     }
6614*53ee8cc1Swenshuai.xi 
6615*53ee8cc1Swenshuai.xi     // There're Q tables for U & V, respectively.
6616*53ee8cc1Swenshuai.xi     if(com_num>2)
6617*53ee8cc1Swenshuai.xi     {
6618*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("More than two Q tables! Enable JPD_SUVQ! comnum = %d\n", com_num);
6619*53ee8cc1Swenshuai.xi         reg_value = reg_value | JPD_SUVQ;
6620*53ee8cc1Swenshuai.xi     }
6621*53ee8cc1Swenshuai.xi 
6622*53ee8cc1Swenshuai.xi     /* Check the read pointer. If it is in HIGH buffer, we need
6623*53ee8cc1Swenshuai.xi        to preload data to LOW buffer and then start decode.
6624*53ee8cc1Swenshuai.xi        Progressive mode & thumbnail don't need to check it. */
6625*53ee8cc1Swenshuai.xi     if((FALSE == _bProgressive_flag)
6626*53ee8cc1Swenshuai.xi     && (FALSE == _bThumbnailAccessMode))
6627*53ee8cc1Swenshuai.xi     {
6628*53ee8cc1Swenshuai.xi         MS_U32 start_offset = JPEG_GetECS();
6629*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("start offset = 0x%lx\n", start_offset);
6630*53ee8cc1Swenshuai.xi         if ( start_offset >= (MRC_BUFFER_SIZE/2) )
6631*53ee8cc1Swenshuai.xi         {
6632*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("ReadPtr is in HIGH, Load LOW!!\n");
6633*53ee8cc1Swenshuai.xi             if(_pFillHdrFunc)
6634*53ee8cc1Swenshuai.xi             {
6635*53ee8cc1Swenshuai.xi                 MS_S32 byte_read = _pFillHdrFunc((MS_PHYADDR)MS_VA2PA((MS_U32)_pu8In_buf), (MRC_BUFFER_SIZE/2));
6636*53ee8cc1Swenshuai.xi                 if(byte_read < 0)
6637*53ee8cc1Swenshuai.xi                 {
6638*53ee8cc1Swenshuai.xi                     JPEG_terminate(E_JPEG_STREAM_READ);
6639*53ee8cc1Swenshuai.xi                     return FALSE;
6640*53ee8cc1Swenshuai.xi                 }
6641*53ee8cc1Swenshuai.xi                 u8PreLHFlag = E_JPEG_BUFFER_LOW;
6642*53ee8cc1Swenshuai.xi                 u32MRCheckCount = 0;
6643*53ee8cc1Swenshuai.xi             }
6644*53ee8cc1Swenshuai.xi             else
6645*53ee8cc1Swenshuai.xi             {
6646*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("_pFillHdrFunc is not registered!!, still need to start decode.\n");
6647*53ee8cc1Swenshuai.xi             }
6648*53ee8cc1Swenshuai.xi         }
6649*53ee8cc1Swenshuai.xi     }
6650*53ee8cc1Swenshuai.xi 
6651*53ee8cc1Swenshuai.xi     if(_bProgressive_flag)
6652*53ee8cc1Swenshuai.xi         reg_value = reg_value | JPD_SVLD;
6653*53ee8cc1Swenshuai.xi 
6654*53ee8cc1Swenshuai.xi     // Check if it needs to do ROI
6655*53ee8cc1Swenshuai.xi     if(E_JPD_DOWNSCALE_ORG != _u8DownScaleRatio)
6656*53ee8cc1Swenshuai.xi     {
6657*53ee8cc1Swenshuai.xi         if(ROI_width != pic_width)
6658*53ee8cc1Swenshuai.xi         {
6659*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("ROI!! ROI_width = %d, ROI_height = %d\n", ROI_width, pic_height);
6660*53ee8cc1Swenshuai.xi             MDrv_JPD_SetROI(0, 0, (ROI_width>>3), (pic_height>>3));
6661*53ee8cc1Swenshuai.xi             reg_value = reg_value | JPD_ROI_EN;
6662*53ee8cc1Swenshuai.xi         }
6663*53ee8cc1Swenshuai.xi         _u16Image_x_size = ROI_width/_u8ScaleDownFactor;
6664*53ee8cc1Swenshuai.xi     }
6665*53ee8cc1Swenshuai.xi 
6666*53ee8cc1Swenshuai.xi     //Enable ECO support
6667*53ee8cc1Swenshuai.xi     {
6668*53ee8cc1Swenshuai.xi         MS_U16 reg_val = 0;
6669*53ee8cc1Swenshuai.xi         reg_val = JPD_RST_STUFF_BYTE_HANDLE;
6670*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
6671*53ee8cc1Swenshuai.xi         if(TRUE == bIs3HuffTbl)
6672*53ee8cc1Swenshuai.xi         {
6673*53ee8cc1Swenshuai.xi             reg_val = reg_val | JPD_3_HUFFMAN_TABLE_SUPPORT;
6674*53ee8cc1Swenshuai.xi         }
6675*53ee8cc1Swenshuai.xi #endif
6676*53ee8cc1Swenshuai.xi         MDrv_JPD_SetSpare(reg_val);
6677*53ee8cc1Swenshuai.xi     }
6678*53ee8cc1Swenshuai.xi 
6679*53ee8cc1Swenshuai.xi     // mark low/high buffer valid
6680*53ee8cc1Swenshuai.xi     //MDrv_Write2Byte( BK_JPD_MCONFIG, JPD_H_VLD |JPD_L_VLD);
6681*53ee8cc1Swenshuai.xi     MDrv_JPD_Set_M_Config(JPD_H_VLD |JPD_L_VLD);
6682*53ee8cc1Swenshuai.xi 
6683*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_18_miu_sel_128M==true) \
6684*53ee8cc1Swenshuai.xi     ||(ENABLE_TEST_18_miu_sel_64M==true) \
6685*53ee8cc1Swenshuai.xi     ||(ENABLE_TEST_18_miu_sel_32M==true)
6686*53ee8cc1Swenshuai.xi // This is used for verification code in TEST_18_miu_sel
6687*53ee8cc1Swenshuai.xi //        MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config());             // 0 1
6688*53ee8cc1Swenshuai.xi     #if (ENABLE_TEST_18_miu_sel_128M==true)
6689*53ee8cc1Swenshuai.xi         MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config() | JPD_BIT(9));          // 0 1 0 1
6690*53ee8cc1Swenshuai.xi     #elif (ENABLE_TEST_18_miu_sel_64M==true)
6691*53ee8cc1Swenshuai.xi         MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config() | JPD_BIT(10));   // 0 1 0 1 0 1 0 1
6692*53ee8cc1Swenshuai.xi     #else
6693*53ee8cc1Swenshuai.xi         MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config() | JPD_BIT(9) | JPD_BIT(10));    // 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
6694*53ee8cc1Swenshuai.xi     #endif
6695*53ee8cc1Swenshuai.xi #endif
6696*53ee8cc1Swenshuai.xi 
6697*53ee8cc1Swenshuai.xi     // enable JPD decoding
6698*53ee8cc1Swenshuai.xi #if ENABLE_JPEG_NO_SIZE_LOWER_BOUND
6699*53ee8cc1Swenshuai.xi     MDrv_JPD_SetPicDimension(pic_width, pic_height);
6700*53ee8cc1Swenshuai.xi #endif
6701*53ee8cc1Swenshuai.xi 
6702*53ee8cc1Swenshuai.xi     //MDrv_Write2Byte( BK_JPD_SCONFIG, reg_value | JPD_DEC_EN | MDrv_JPD_GetSWResetMask());
6703*53ee8cc1Swenshuai.xi     //MDrv_JPD_Set_S_Config(reg_value | JPD_DEC_EN | MDrv_JPD_GetSWResetMask());
6704*53ee8cc1Swenshuai.xi     //MDrv_JPD_Set_S_Config(reg_value | JPD_DEC_EN | JPD_SWRST);
6705*53ee8cc1Swenshuai.xi #if 1
6706*53ee8cc1Swenshuai.xi     // decide if we need to set the JPD_PSAVE_EN register in hal layer
6707*53ee8cc1Swenshuai.xi     MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST | JPD_PSAVE_EN);
6708*53ee8cc1Swenshuai.xi #else
6709*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_16_JPEGEnablePsaveModeTest==false)
6710*53ee8cc1Swenshuai.xi #if defined(CHIP_A3) || defined(CHIP_E3) || defined(CHIP_A5) || defined(CHIP_A5P) ||  defined(CHIP_A6) || defined(CHIP_A7)
6711*53ee8cc1Swenshuai.xi     // For safety, enable the JPD_PSAVE_EN as default since A5 (HW already fixed this bug since A1 or earlier chip)
6712*53ee8cc1Swenshuai.xi     MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST | JPD_PSAVE_EN);
6713*53ee8cc1Swenshuai.xi #else
6714*53ee8cc1Swenshuai.xi     //due to power saving mode will make system hang in some case(the image of RST error),we do not enable this function currently.
6715*53ee8cc1Swenshuai.xi     MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST);
6716*53ee8cc1Swenshuai.xi #endif
6717*53ee8cc1Swenshuai.xi #else
6718*53ee8cc1Swenshuai.xi #if defined(CHIP_T3) || defined(CHIP_T4) || defined(CHIP_T7) || defined(CHIP_JANUS) || defined(CHIP_U4) || defined(CHIP_T8) || defined(CHIP_J2) || defined(CHIP_A1) || defined(CHIP_A2) || defined(CHIP_A5) || defined(CHIP_A5P) || defined(CHIP_A6) || defined(CHIP_A7) || defined(CHIP_A3) || defined(CHIP_AMETHYST) || defined(CHIP_E3)
6719*53ee8cc1Swenshuai.xi     //Enable power save mode on normal JPEG decoding.
6720*53ee8cc1Swenshuai.xi     MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST | JPD_PSAVE_EN);
6721*53ee8cc1Swenshuai.xi #else
6722*53ee8cc1Swenshuai.xi     MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST);
6723*53ee8cc1Swenshuai.xi #endif
6724*53ee8cc1Swenshuai.xi #endif
6725*53ee8cc1Swenshuai.xi #endif
6726*53ee8cc1Swenshuai.xi 
6727*53ee8cc1Swenshuai.xi // protect test(only for unit test)
6728*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_09_JPEGWriteProtectTest==false)
6729*53ee8cc1Swenshuai.xi     //MDrv_JPD_SetWriteProtect(TRUE);
6730*53ee8cc1Swenshuai.xi #else
6731*53ee8cc1Swenshuai.xi     #if(JPD_SUPPORT_AUTO_PROTECT==false)
6732*53ee8cc1Swenshuai.xi     MDrv_JPD_SetWriteProtect(TRUE);
6733*53ee8cc1Swenshuai.xi     #endif
6734*53ee8cc1Swenshuai.xi #endif
6735*53ee8cc1Swenshuai.xi 
6736*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_AUTO_PROTECT==true)
6737*53ee8cc1Swenshuai.xi     MDrv_JPD_SetAutoProtect(TRUE);
6738*53ee8cc1Swenshuai.xi     #if (ENABLE_TEST_22_AutoProtectFailTest == true)
6739*53ee8cc1Swenshuai.xi         MDrv_JPD_SetWPENEndAddr(MWC_BUFFER_ADDR+0x200-1);
6740*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("Set Auto protect address =0x%lx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", MWC_BUFFER_ADDR+0x200);
6741*53ee8cc1Swenshuai.xi     #else
6742*53ee8cc1Swenshuai.xi         MDrv_JPD_SetWPENEndAddr(MWC_BUFFER_ADDR+MWC_BUFFER_SIZE-1);
6743*53ee8cc1Swenshuai.xi     #endif
6744*53ee8cc1Swenshuai.xi #endif
6745*53ee8cc1Swenshuai.xi 
6746*53ee8cc1Swenshuai.xi     MDrv_JPD_Set_S_Config(MDrv_JPD_Get_S_Config() | JPD_DEC_EN);
6747*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("After Setting SCONFIG, JPD START!!\n");
6748*53ee8cc1Swenshuai.xi     //JPEG_GO;
6749*53ee8cc1Swenshuai.xi     return TRUE;
6750*53ee8cc1Swenshuai.xi }
6751*53ee8cc1Swenshuai.xi #endif
6752*53ee8cc1Swenshuai.xi 
6753*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
6754*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6755*53ee8cc1Swenshuai.xi /******************************************************************************/
6756*53ee8cc1Swenshuai.xi ///Start Progressive JPEG decode for JPD
6757*53ee8cc1Swenshuai.xi /******************************************************************************/
JPEG_Progressive_Decode(void)6758*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_Result JPEG_Progressive_Decode(void)
6759*53ee8cc1Swenshuai.xi {
6760*53ee8cc1Swenshuai.xi     if(_bProgressive_flag==FALSE)
6761*53ee8cc1Swenshuai.xi         return (E_JPEG_FAILED);
6762*53ee8cc1Swenshuai.xi 
6763*53ee8cc1Swenshuai.xi     if ( _u16Total_lines_left == 0 )
6764*53ee8cc1Swenshuai.xi     {
6765*53ee8cc1Swenshuai.xi         return ( E_JPEG_OKAY );
6766*53ee8cc1Swenshuai.xi     }
6767*53ee8cc1Swenshuai.xi 
6768*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
6769*53ee8cc1Swenshuai.xi     if ( setjmp( _jmp_state ) )
6770*53ee8cc1Swenshuai.xi     {
6771*53ee8cc1Swenshuai.xi         return ( E_JPEG_FAILED );
6772*53ee8cc1Swenshuai.xi     }
6773*53ee8cc1Swenshuai.xi #endif
6774*53ee8cc1Swenshuai.xi 
6775*53ee8cc1Swenshuai.xi     //JPEG_DEBUG_API_MSG("_u16Mcus_per_row is %d!\n",_u16Mcus_per_row);
6776*53ee8cc1Swenshuai.xi     //JPEG_DEBUG_API_MSG("_u16Mcus_per_col is %d!\n",_u16Mcus_per_col);
6777*53ee8cc1Swenshuai.xi     //JPEG_DEBUG_API_MSG("_u8Blocks_per_mcu is %d!\n",_u8Blocks_per_mcu);
6778*53ee8cc1Swenshuai.xi     //JPEG_DEBUG_API_MSG("gu8Max_mcu_x_size is %d!\n",gu8Max_mcu_x_size);
6779*53ee8cc1Swenshuai.xi     //JPEG_DEBUG_API_MSG("gu8Max_mcu_y_size is %d!\n",gu8Max_mcu_y_size);
6780*53ee8cc1Swenshuai.xi 
6781*53ee8cc1Swenshuai.xi     if( _u16Total_lines_left > 0 )
6782*53ee8cc1Swenshuai.xi     {
6783*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s:_u16Total_lines_left = %d\n", __FUNCTION__ , _u16Total_lines_left);
6784*53ee8cc1Swenshuai.xi         if(!JPEG_load_next_row())
6785*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
6786*53ee8cc1Swenshuai.xi 
6787*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
6788*53ee8cc1Swenshuai.xi         if((E_JPEG_CMYK == gu8Scan_type)
6789*53ee8cc1Swenshuai.xi         || (E_JPEG_RGB == gu8Scan_type))
6790*53ee8cc1Swenshuai.xi         {
6791*53ee8cc1Swenshuai.xi             if(!msAPI_JPEG_transform_row()) //IDCT
6792*53ee8cc1Swenshuai.xi             {
6793*53ee8cc1Swenshuai.xi                 JPEG_DEBUG_API_MSG("CMYK and RGB decode failed!!\n");
6794*53ee8cc1Swenshuai.xi                 return ( E_JPEG_FAILED );
6795*53ee8cc1Swenshuai.xi             }
6796*53ee8cc1Swenshuai.xi         }
6797*53ee8cc1Swenshuai.xi #endif
6798*53ee8cc1Swenshuai.xi 
6799*53ee8cc1Swenshuai.xi         _u16Total_lines_left -= gu8Max_mcu_y_size;
6800*53ee8cc1Swenshuai.xi     }
6801*53ee8cc1Swenshuai.xi 
6802*53ee8cc1Swenshuai.xi     return (E_JPEG_DONE);
6803*53ee8cc1Swenshuai.xi }
6804*53ee8cc1Swenshuai.xi #endif
6805*53ee8cc1Swenshuai.xi 
6806*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_GetAlignedResolution(MS_U16 * width,MS_U16 * height)6807*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_GetAlignedResolution(MS_U16 *width, MS_U16 *height)
6808*53ee8cc1Swenshuai.xi {
6809*53ee8cc1Swenshuai.xi     MS_U8 mcu_width, mcu_height;
6810*53ee8cc1Swenshuai.xi     MS_U8 Y_VSF = _u8Comp_v_samp[0];
6811*53ee8cc1Swenshuai.xi     MS_U8 Y_HSF = _u8Comp_h_samp[0];
6812*53ee8cc1Swenshuai.xi 
6813*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6814*53ee8cc1Swenshuai.xi 
6815*53ee8cc1Swenshuai.xi     *width = _u16OriginalImage_x_size;
6816*53ee8cc1Swenshuai.xi     *height = _u16OriginalImage_y_size;
6817*53ee8cc1Swenshuai.xi 
6818*53ee8cc1Swenshuai.xi     mcu_width = _u16OriginalImage_x_size % (Y_HSF * 8);
6819*53ee8cc1Swenshuai.xi     if (mcu_width)
6820*53ee8cc1Swenshuai.xi     {
6821*53ee8cc1Swenshuai.xi         *width += (Y_HSF * 8 - mcu_width);
6822*53ee8cc1Swenshuai.xi     }
6823*53ee8cc1Swenshuai.xi 
6824*53ee8cc1Swenshuai.xi     mcu_height = _u16OriginalImage_y_size % (Y_VSF * 8);
6825*53ee8cc1Swenshuai.xi     if (mcu_height)
6826*53ee8cc1Swenshuai.xi     {
6827*53ee8cc1Swenshuai.xi         *height += (Y_VSF * 8 - mcu_height);
6828*53ee8cc1Swenshuai.xi     }
6829*53ee8cc1Swenshuai.xi 
6830*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("_u8Comp_v_samp = %d, _u8Comp_h_samp = %d\n", _u8Comp_v_samp[0], _u8Comp_h_samp[0]);
6831*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("_u16OriginalImage_x_size = %d, _u16OriginalImage_y_size = %d\n", _u16OriginalImage_x_size, _u16OriginalImage_y_size);
6832*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("AlignWidth = %d, AlignHeight = %d\n", *width, *height);
6833*53ee8cc1Swenshuai.xi }
6834*53ee8cc1Swenshuai.xi 
6835*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6836*53ee8cc1Swenshuai.xi //  Global Functions
6837*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6838*53ee8cc1Swenshuai.xi #if 0
6839*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6840*53ee8cc1Swenshuai.xi /******************************************************************************/
6841*53ee8cc1Swenshuai.xi ///This will set MRC buffer address & size, MWC buffer address, and internal buffer
6842*53ee8cc1Swenshuai.xi ///address & size.
6843*53ee8cc1Swenshuai.xi ///@param *pInitParam \b The pointer of information for JPEG Buffer initialization
6844*53ee8cc1Swenshuai.xi /// structure {
6845*53ee8cc1Swenshuai.xi ///         U32 u32MRCBufAddr, \b IN MRC buffer address
6846*53ee8cc1Swenshuai.xi ///         U32 u32MRCBufSize, \b IN MRC buffer size
6847*53ee8cc1Swenshuai.xi ///         U32 u32MWCBufAddr, \b IN MWC buffer address
6848*53ee8cc1Swenshuai.xi ///                                 JPEG decompress data (YUV422)
6849*53ee8cc1Swenshuai.xi ///         U32 u32InternalBufAddr, \b IN internal buffer address
6850*53ee8cc1Swenshuai.xi ///                                 (exif:64K + memory pool)
6851*53ee8cc1Swenshuai.xi ///         U32 u32InternalBufSize, \b IN internal buffer size
6852*53ee8cc1Swenshuai.xi ///         BOOL bInitMem, \b IN initialize memory pool or not
6853*53ee8cc1Swenshuai.xi ///         };
6854*53ee8cc1Swenshuai.xi ///@return true or false
6855*53ee8cc1Swenshuai.xi /******************************************************************************/
6856*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_SetInitParameter(JPEG_InitParam *pInitParam)
6857*53ee8cc1Swenshuai.xi {
6858*53ee8cc1Swenshuai.xi     // the buffer size must be multiple of 4 bytes
6859*53ee8cc1Swenshuai.xi     if((!pInitParam)
6860*53ee8cc1Swenshuai.xi     || (pInitParam->u32MRCBufSize < MIN_READBUFFER_SIZE))
6861*53ee8cc1Swenshuai.xi     {
6862*53ee8cc1Swenshuai.xi         JPEG_terminate(E_JPEG_READBUFFER_TOOSMALL);
6863*53ee8cc1Swenshuai.xi         return false;
6864*53ee8cc1Swenshuai.xi     }
6865*53ee8cc1Swenshuai.xi     // the buffer size must be multiple of 8 bytes
6866*53ee8cc1Swenshuai.xi     pInitParam->u32MRCBufSize = pInitParam->u32MRCBufSize & ~0x7;
6867*53ee8cc1Swenshuai.xi 
6868*53ee8cc1Swenshuai.xi     MRC_BUFFER_ADDR = pInitParam->u32MRCBufAddr | AEON_NON_CACHE_MASK;
6869*53ee8cc1Swenshuai.xi     MWC_BUFFER_ADDR = pInitParam->u32MWCBufAddr | AEON_NON_CACHE_MASK;
6870*53ee8cc1Swenshuai.xi     INTERNAL_BUFFER_ADDR = pInitParam->u32InternalBufAddr | AEON_NON_CACHE_MASK;
6871*53ee8cc1Swenshuai.xi     MRC_BUFFER_SIZE = pInitParam->u32MRCBufSize;
6872*53ee8cc1Swenshuai.xi     INTERNAL_BUFFER_SIZE = pInitParam->u32InternalBufSize;
6873*53ee8cc1Swenshuai.xi 
6874*53ee8cc1Swenshuai.xi     _pu8In_buf = (MS_U8 *) pInitParam->u32MRCBufAddr;
6875*53ee8cc1Swenshuai.xi 
6876*53ee8cc1Swenshuai.xi     if (pInitParam->bInitMem)
6877*53ee8cc1Swenshuai.xi     {
6878*53ee8cc1Swenshuai.xi         JPEG_MEMORY_init_mempool(((MS_U8 *)(pInitParam->u32InternalBufAddr + JPEG_DEFAULT_EXIF_SIZE))
6879*53ee8cc1Swenshuai.xi                                 , (pInitParam->u32InternalBufSize - JPEG_DEFAULT_EXIF_SIZE));
6880*53ee8cc1Swenshuai.xi     }
6881*53ee8cc1Swenshuai.xi 
6882*53ee8cc1Swenshuai.xi     return TRUE;
6883*53ee8cc1Swenshuai.xi }
6884*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6885*53ee8cc1Swenshuai.xi // Call get_error_code() after constructing to determine if the stream
6886*53ee8cc1Swenshuai.xi // was valid or not. You may call the get_width(), get_height(), etc.
6887*53ee8cc1Swenshuai.xi // methods after the constructor is called.
6888*53ee8cc1Swenshuai.xi // You may then either destruct the object, or begin decoding the image
6889*53ee8cc1Swenshuai.xi // by calling begin(), then decode().
6890*53ee8cc1Swenshuai.xi void MApi_JPEG_Constructor( PJPEG_FILE_FileSystem_t Pstream, MS_U8 decode_type)
6891*53ee8cc1Swenshuai.xi {
6892*53ee8cc1Swenshuai.xi     if ( setjmp( _jmp_state ) )
6893*53ee8cc1Swenshuai.xi     {
6894*53ee8cc1Swenshuai.xi         return;
6895*53ee8cc1Swenshuai.xi     }
6896*53ee8cc1Swenshuai.xi 
6897*53ee8cc1Swenshuai.xi     _u8DecodeType = decode_type;
6898*53ee8cc1Swenshuai.xi     JPEG_init_thumbnail();
6899*53ee8cc1Swenshuai.xi     JPEG_decode_init( Pstream);
6900*53ee8cc1Swenshuai.xi 
6901*53ee8cc1Swenshuai.xi #ifdef CMODEL
6902*53ee8cc1Swenshuai.xi     _bReady_flag = TRUE;
6903*53ee8cc1Swenshuai.xi #endif
6904*53ee8cc1Swenshuai.xi }
6905*53ee8cc1Swenshuai.xi #endif
6906*53ee8cc1Swenshuai.xi 
6907*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
MApi_JPEG_Is_RGB_CMYK(void)6908*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_Is_RGB_CMYK(void)
6909*53ee8cc1Swenshuai.xi {
6910*53ee8cc1Swenshuai.xi     if (_u8Comps_in_frame == 3)
6911*53ee8cc1Swenshuai.xi     {
6912*53ee8cc1Swenshuai.xi         //support only U_H1V1 & V_H1V1
6913*53ee8cc1Swenshuai.xi         if ((_u8Comp_h_samp[1] != 1 || _u8Comp_v_samp[1] != 1)
6914*53ee8cc1Swenshuai.xi             || (_u8Comp_h_samp[2] != 1 || _u8Comp_v_samp[2] != 1))
6915*53ee8cc1Swenshuai.xi         {
6916*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
6917*53ee8cc1Swenshuai.xi             return FALSE;
6918*53ee8cc1Swenshuai.xi         }
6919*53ee8cc1Swenshuai.xi 
6920*53ee8cc1Swenshuai.xi         if (_u8Comp_h_samp[0] == 1 && _u8Comp_v_samp[0] == 1)
6921*53ee8cc1Swenshuai.xi         {
6922*53ee8cc1Swenshuai.xi             if (_u8Comp_ident[0] == 82 || _u8Comp_ident[0] == 71 || _u8Comp_ident[0] == 66)
6923*53ee8cc1Swenshuai.xi                 return TRUE; // RGB
6924*53ee8cc1Swenshuai.xi         }
6925*53ee8cc1Swenshuai.xi     }
6926*53ee8cc1Swenshuai.xi     else
6927*53ee8cc1Swenshuai.xi     if (_u8Comps_in_frame == 4) //handle YCCK & CMYK case, must distinguish YCCK and CMYK later
6928*53ee8cc1Swenshuai.xi     {
6929*53ee8cc1Swenshuai.xi         if (_u8Comp_h_samp[0] == 1 && _u8Comp_v_samp[0] == 1)
6930*53ee8cc1Swenshuai.xi             return TRUE; // CMYK
6931*53ee8cc1Swenshuai.xi     }
6932*53ee8cc1Swenshuai.xi 
6933*53ee8cc1Swenshuai.xi     return FALSE;
6934*53ee8cc1Swenshuai.xi }
6935*53ee8cc1Swenshuai.xi #endif
6936*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6937*53ee8cc1Swenshuai.xi /********************************************************************/
6938*53ee8cc1Swenshuai.xi ///This function will\n
6939*53ee8cc1Swenshuai.xi ///1. set MRC buffer address & size, MWC buffer address, and internal buffer address & size.\n
6940*53ee8cc1Swenshuai.xi ///2. power on JPD\n
6941*53ee8cc1Swenshuai.xi ///3. reset thumbnail parameters\n
6942*53ee8cc1Swenshuai.xi ///4. set the stream and its size, the number of components, etc.\n
6943*53ee8cc1Swenshuai.xi ///Call MApi_JPEG_GetErrorCode() after it to determine if the stream was valid or not.\n
6944*53ee8cc1Swenshuai.xi ///@param -pInitParam \b IN : \n
6945*53ee8cc1Swenshuai.xi /// structure {\n
6946*53ee8cc1Swenshuai.xi ///     MS_PHYADDR \b u32MRCBufAddr : MRC buffer address\n
6947*53ee8cc1Swenshuai.xi ///     MS_U32 \b u32MRCBufSize : MRC buffer size\n
6948*53ee8cc1Swenshuai.xi ///     MS_PHYADDR \b u32MWCBufAddr : MWC buffer address(JPEG decompress data (YUV422))\n
6949*53ee8cc1Swenshuai.xi ///     MS_U32 \b u32MWCBufSize : MWC buffer size\n
6950*53ee8cc1Swenshuai.xi ///     MS_PHYADDR \b u32InternalBufAddr : Internal buffer address(exif:64K + memory pool)\n
6951*53ee8cc1Swenshuai.xi ///     MS_U32 \b u32InternalBufSize : Internal buffer size\n
6952*53ee8cc1Swenshuai.xi ///     MS_U32 \b u32DecByteRead : how many byte read for JPEG decoder initialization\n
6953*53ee8cc1Swenshuai.xi ///     MS_BOOL \b bEOF : has read to the end of file\n
6954*53ee8cc1Swenshuai.xi ///     MS_U8 \b u8DecoderType : 3 types: JPEG main, thumbnail, or MJPEG\n
6955*53ee8cc1Swenshuai.xi ///     MS_BOOL \b bInitMem : initialize memory pool or not\n
6956*53ee8cc1Swenshuai.xi ///     JPEG_FillHdrFunc \b pFillHdrFunc : the function for fill header information\n
6957*53ee8cc1Swenshuai.xi /// };
6958*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result : JPEG init status
6959*53ee8cc1Swenshuai.xi ///     - E_JPEG_OKAY : Success
6960*53ee8cc1Swenshuai.xi ///     - E_JPEG_FAILED : Failed
6961*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_Init(JPEG_InitParam * pInitParam)6962*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_Init(JPEG_InitParam *pInitParam)
6963*53ee8cc1Swenshuai.xi {
6964*53ee8cc1Swenshuai.xi #if 0
6965*53ee8cc1Swenshuai.xi     MApi_JPEG_SetDbgLevel(E_JPEG_DEBUG_ALL);
6966*53ee8cc1Swenshuai.xi #endif
6967*53ee8cc1Swenshuai.xi 
6968*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
6969*53ee8cc1Swenshuai.xi     static MS_U8 fileName2[]={'/','u','s','b','/','s','d','a','1','/','l','o', 'g', '0', '0', '0', '.', 'b', 'i', 'n',0};
6970*53ee8cc1Swenshuai.xi     fileName2[15]++;
6971*53ee8cc1Swenshuai.xi     if(fileName2[15] > '9')
6972*53ee8cc1Swenshuai.xi     {
6973*53ee8cc1Swenshuai.xi         fileName2[14]++;
6974*53ee8cc1Swenshuai.xi         fileName2[15] = '0';
6975*53ee8cc1Swenshuai.xi     }
6976*53ee8cc1Swenshuai.xi     if(fileName2[14] > '9')
6977*53ee8cc1Swenshuai.xi     {
6978*53ee8cc1Swenshuai.xi         fileName2[13]++;
6979*53ee8cc1Swenshuai.xi         fileName2[14] = '0';
6980*53ee8cc1Swenshuai.xi     }
6981*53ee8cc1Swenshuai.xi 
6982*53ee8cc1Swenshuai.xi     if((logBinfp = fopen((char *)fileName2, "wb"))==NULL) {
6983*53ee8cc1Swenshuai.xi         printf("Can't open /usb/sda1/log.bin\n");
6984*53ee8cc1Swenshuai.xi     }
6985*53ee8cc1Swenshuai.xi     else
6986*53ee8cc1Swenshuai.xi     {
6987*53ee8cc1Swenshuai.xi         printf("open /usb/sda1/log.bin success\n");
6988*53ee8cc1Swenshuai.xi     }
6989*53ee8cc1Swenshuai.xi #endif
6990*53ee8cc1Swenshuai.xi 
6991*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6992*53ee8cc1Swenshuai.xi 
6993*53ee8cc1Swenshuai.xi     // jpeg constructor
6994*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
6995*53ee8cc1Swenshuai.xi     if ( setjmp( _jmp_state ) )
6996*53ee8cc1Swenshuai.xi     {
6997*53ee8cc1Swenshuai.xi         return  E_JPEG_FAILED;
6998*53ee8cc1Swenshuai.xi     }
6999*53ee8cc1Swenshuai.xi #endif
7000*53ee8cc1Swenshuai.xi 
7001*53ee8cc1Swenshuai.xi     if(_bIsInit == TRUE)
7002*53ee8cc1Swenshuai.xi     {
7003*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
7004*53ee8cc1Swenshuai.xi         if(MApi_JPEG_IsMPOFormat()==FALSE)
7005*53ee8cc1Swenshuai.xi         {
7006*53ee8cc1Swenshuai.xi             JPEG_terminate(E_JPEG_RE_INIT);
7007*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
7008*53ee8cc1Swenshuai.xi         }
7009*53ee8cc1Swenshuai.xi #else
7010*53ee8cc1Swenshuai.xi         JPEG_terminate(E_JPEG_RE_INIT);
7011*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
7012*53ee8cc1Swenshuai.xi #endif
7013*53ee8cc1Swenshuai.xi     }
7014*53ee8cc1Swenshuai.xi     else
7015*53ee8cc1Swenshuai.xi     {
7016*53ee8cc1Swenshuai.xi         _bIsInit = TRUE;
7017*53ee8cc1Swenshuai.xi     }
7018*53ee8cc1Swenshuai.xi 
7019*53ee8cc1Swenshuai.xi     if(!pInitParam)
7020*53ee8cc1Swenshuai.xi     {
7021*53ee8cc1Swenshuai.xi         JPEG_terminate(E_JPEG_DECODE_ERROR);
7022*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
7023*53ee8cc1Swenshuai.xi     }
7024*53ee8cc1Swenshuai.xi 
7025*53ee8cc1Swenshuai.xi //    if(pInitParam->u32MRCBufSize < MIN_READBUFFER_SIZE)
7026*53ee8cc1Swenshuai.xi     if(pInitParam->u32MRCBufSize < JPEG_DEFAULT_EXIF_SIZE)
7027*53ee8cc1Swenshuai.xi     {
7028*53ee8cc1Swenshuai.xi         JPEG_terminate(E_JPEG_READBUFFER_TOOSMALL);
7029*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
7030*53ee8cc1Swenshuai.xi     }
7031*53ee8cc1Swenshuai.xi 
7032*53ee8cc1Swenshuai.xi     // the buffer size must be multiple of 8 bytes
7033*53ee8cc1Swenshuai.xi     pInitParam->u32MRCBufSize = pInitParam->u32MRCBufSize & ~0x7;
7034*53ee8cc1Swenshuai.xi 
7035*53ee8cc1Swenshuai.xi     MRC_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32MRCBufAddr);// | AEON_NON_CACHE_MASK;
7036*53ee8cc1Swenshuai.xi     MWC_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32MWCBufAddr);// | AEON_NON_CACHE_MASK;
7037*53ee8cc1Swenshuai.xi     INTERNAL_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32InternalBufAddr);// | AEON_NON_CACHE_MASK;
7038*53ee8cc1Swenshuai.xi     if (__bIsMjpeg)
7039*53ee8cc1Swenshuai.xi     {
7040*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG ("MJPEG Read buffer address CONVERT : 0x%lx - 0x%lx + 0x%lx ",
7041*53ee8cc1Swenshuai.xi                 MS_VA2PA(MRC_BUFFER_ADDR), MS_VA2PA(__u32RealMjpegBase), MS_VA2PA(__u32TrickyMjpegBase));
7042*53ee8cc1Swenshuai.xi         MRC_BUFFER_ADDR -= __u32RealMjpegBase;
7043*53ee8cc1Swenshuai.xi         MRC_BUFFER_ADDR += __u32TrickyMjpegBase;
7044*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG ("= 0x%lx\n", MS_VA2PA(MRC_BUFFER_ADDR));
7045*53ee8cc1Swenshuai.xi     }
7046*53ee8cc1Swenshuai.xi     _pu8In_buf = (MS_U8 *)MRC_BUFFER_ADDR;//pInitParam->u32MRCBufAddr;
7047*53ee8cc1Swenshuai.xi 
7048*53ee8cc1Swenshuai.xi     MRC_BUFFER_SIZE = pInitParam->u32MRCBufSize;
7049*53ee8cc1Swenshuai.xi     MWC_BUFFER_SIZE = pInitParam->u32MWCBufSize;
7050*53ee8cc1Swenshuai.xi     INTERNAL_BUFFER_SIZE = pInitParam->u32InternalBufSize;
7051*53ee8cc1Swenshuai.xi 
7052*53ee8cc1Swenshuai.xi 
7053*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("MRC_ADDR = 0x%lX, MRC_BUFFER_SIZE = 0x%lX\n", _u32ReadBufferAddr, _u32ReadBufferSize);
7054*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("MWC_ADDR = 0x%lX, MWC_BUFFER_SIZE = 0x%lX\n", _u32WriteBufferAddr, _u32WriteBufferSize);
7055*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("INTERNAL_ADDR = 0x%lX, INTERNAL_BUFFER_SIZE = 0x%lX\n", _u32InternalBufferAddr, _u32InternalBufferSize);
7056*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG ("MRC_PA= 0x%lx\n", MS_VA2PA(MRC_BUFFER_ADDR));
7057*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG ("MWC_PA= 0x%lx\n", MS_VA2PA(MWC_BUFFER_ADDR));
7058*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG ("INTER_PA= 0x%lx\n", MS_VA2PA(INTERNAL_BUFFER_ADDR));
7059*53ee8cc1Swenshuai.xi 
7060*53ee8cc1Swenshuai.xi     _pFillHdrFunc = pInitParam->pFillHdrFunc;
7061*53ee8cc1Swenshuai.xi 
7062*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7063*53ee8cc1Swenshuai.xi     u8Out_buf = (MS_U8 *) MWC_BUFFER_ADDR;
7064*53ee8cc1Swenshuai.xi     u32_Decode_Line = 0;
7065*53ee8cc1Swenshuai.xi #endif
7066*53ee8cc1Swenshuai.xi 
7067*53ee8cc1Swenshuai.xi     //JPEG_GO;
7068*53ee8cc1Swenshuai.xi 
7069*53ee8cc1Swenshuai.xi     // powner on JPD
7070*53ee8cc1Swenshuai.xi #ifndef CMODEL
7071*53ee8cc1Swenshuai.xi     MDrv_JPD_PowerOn();
7072*53ee8cc1Swenshuai.xi #endif
7073*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("MDrv_JPD_PowerOn OK!!\n");
7074*53ee8cc1Swenshuai.xi 
7075*53ee8cc1Swenshuai.xi     _u8DecodeType = pInitParam->u8DecodeType;
7076*53ee8cc1Swenshuai.xi 
7077*53ee8cc1Swenshuai.xi     _u32In_buf_left = pInitParam->u32DecByteRead;
7078*53ee8cc1Swenshuai.xi     _bEOF_flag = pInitParam->bEOF;
7079*53ee8cc1Swenshuai.xi 
7080*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("@1,  _pu8In_buf_ofs=0x%lx, _u32In_buf_left=0x%lx, _bEOF_flag=%d========\n",
7081*53ee8cc1Swenshuai.xi     (MS_U32)_pu8In_buf_ofs, (MS_U32)_u32In_buf_left, _bEOF_flag);
7082*53ee8cc1Swenshuai.xi     // Try to get more bytes.
7083*53ee8cc1Swenshuai.xi     if(!JPEG_force_fill_read_buffer(_u32In_buf_left))
7084*53ee8cc1Swenshuai.xi     {
7085*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("JPEG_force_fill_read_buffer failed!!!\n");
7086*53ee8cc1Swenshuai.xi         _u32In_buf_left = pInitParam->u32DecByteRead;
7087*53ee8cc1Swenshuai.xi     }
7088*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("@2,  _pu8In_buf_ofs=0x%lx, _u32In_buf_left=0x%lx, _bEOF_flag=%d========\n",
7089*53ee8cc1Swenshuai.xi     (MS_U32)_pu8In_buf_ofs, (MS_U32)_u32In_buf_left, _bEOF_flag);
7090*53ee8cc1Swenshuai.xi 
7091*53ee8cc1Swenshuai.xi 
7092*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
7093*53ee8cc1Swenshuai.xi     if(_u32In_buf_MPO_left ==0xFFFFFFFFUL)
7094*53ee8cc1Swenshuai.xi     {
7095*53ee8cc1Swenshuai.xi         _pu8In_buf_MPO_ofs = (MS_U8*)_pu8In_buf;
7096*53ee8cc1Swenshuai.xi         _u32In_buf_MPO_left = _u32In_buf_left;
7097*53ee8cc1Swenshuai.xi         mpo_load_data = TRUE;
7098*53ee8cc1Swenshuai.xi         bIsMPOFormat = FALSE;
7099*53ee8cc1Swenshuai.xi         u32MPFOffset = 0;
7100*53ee8cc1Swenshuai.xi         _u32App2MarkerOffset = 0;
7101*53ee8cc1Swenshuai.xi 
7102*53ee8cc1Swenshuai.xi         //Init MPO database
7103*53ee8cc1Swenshuai.xi         JPEG_InitMPO();
7104*53ee8cc1Swenshuai.xi     }
7105*53ee8cc1Swenshuai.xi #endif
7106*53ee8cc1Swenshuai.xi 
7107*53ee8cc1Swenshuai.xi     u32DataOffset = 0;
7108*53ee8cc1Swenshuai.xi     u32SOFOffset = 0;
7109*53ee8cc1Swenshuai.xi 
7110*53ee8cc1Swenshuai.xi     JPEG_init_thumbnail();
7111*53ee8cc1Swenshuai.xi 
7112*53ee8cc1Swenshuai.xi     if (_u8DecodeType == E_JPEG_TYPE_MJPEG)
7113*53ee8cc1Swenshuai.xi     {
7114*53ee8cc1Swenshuai.xi         __bIsMjpeg = TRUE;
7115*53ee8cc1Swenshuai.xi         __u32RealMjpegBase = MRC_BUFFER_ADDR;
7116*53ee8cc1Swenshuai.xi         __u32TrickyMjpegBase = INTERNAL_BUFFER_ADDR;
7117*53ee8cc1Swenshuai.xi 
7118*53ee8cc1Swenshuai.xi         return E_JPEG_OKAY;
7119*53ee8cc1Swenshuai.xi     }
7120*53ee8cc1Swenshuai.xi 
7121*53ee8cc1Swenshuai.xi     if(!JPEG_decode_init())
7122*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
7123*53ee8cc1Swenshuai.xi 
7124*53ee8cc1Swenshuai.xi     if (bMHEG5)
7125*53ee8cc1Swenshuai.xi     {
7126*53ee8cc1Swenshuai.xi         if(_Error_code == E_JPEG_UNSUPPORTED_MARKER)
7127*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
7128*53ee8cc1Swenshuai.xi     }
7129*53ee8cc1Swenshuai.xi 
7130*53ee8cc1Swenshuai.xi #ifndef CMODEL
7131*53ee8cc1Swenshuai.xi     //init mempool for progressive decoding.
7132*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7133*53ee8cc1Swenshuai.xi     if (pInitParam->bInitMem && (_bProgressive_flag || MApi_JPEG_Is_RGB_CMYK()))
7134*53ee8cc1Swenshuai.xi #else
7135*53ee8cc1Swenshuai.xi     if (pInitParam->bInitMem && _bProgressive_flag)
7136*53ee8cc1Swenshuai.xi #endif
7137*53ee8cc1Swenshuai.xi #endif
7138*53ee8cc1Swenshuai.xi     {
7139*53ee8cc1Swenshuai.xi         if(!JPEG_MEMORY_init_mempool((void *)(INTERNAL_BUFFER_ADDR + JPEG_DEFAULT_EXIF_SIZE)
7140*53ee8cc1Swenshuai.xi                                 , (INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE)))
7141*53ee8cc1Swenshuai.xi         {
7142*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("JPEG_MEMORY_init_mempool FAIL!!\n");
7143*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
7144*53ee8cc1Swenshuai.xi         }
7145*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("JPEG_MEMORY_init_mempool OK!!\n");
7146*53ee8cc1Swenshuai.xi     }
7147*53ee8cc1Swenshuai.xi 
7148*53ee8cc1Swenshuai.xi     //JPEG_GO;
7149*53ee8cc1Swenshuai.xi 
7150*53ee8cc1Swenshuai.xi #ifdef CMODEL
7151*53ee8cc1Swenshuai.xi     _bReady_flag = TRUE;
7152*53ee8cc1Swenshuai.xi #endif
7153*53ee8cc1Swenshuai.xi 
7154*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
7155*53ee8cc1Swenshuai.xi }
7156*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7157*53ee8cc1Swenshuai.xi /********************************************************************/
7158*53ee8cc1Swenshuai.xi ///Decode JPEG header
7159*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result : JPEG header decode status
7160*53ee8cc1Swenshuai.xi ///     - E_JPEG_OKAY : Success
7161*53ee8cc1Swenshuai.xi ///     - E_JPEG_FAILED : Failed
7162*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_DecodeHdr(void)7163*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_DecodeHdr(void)
7164*53ee8cc1Swenshuai.xi {
7165*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7166*53ee8cc1Swenshuai.xi     MS_U8 mcu_width, mcu_height;
7167*53ee8cc1Swenshuai.xi     MS_U16 pic_width = _u16Image_x_size;
7168*53ee8cc1Swenshuai.xi     MS_U16 pic_height = _u16Image_y_size;
7169*53ee8cc1Swenshuai.xi     MS_U8 Y_VSF = _u8Comp_v_samp[0];
7170*53ee8cc1Swenshuai.xi     MS_U8 Y_HSF = _u8Comp_h_samp[0];
7171*53ee8cc1Swenshuai.xi #endif
7172*53ee8cc1Swenshuai.xi 
7173*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
7174*53ee8cc1Swenshuai.xi     u32MeasureDecodeTime = MsOS_GetSystemTime();
7175*53ee8cc1Swenshuai.xi     u32MeasureDecodeTimeSW = 0;
7176*53ee8cc1Swenshuai.xi     u32MeasureDecodeTimeHW = 0;
7177*53ee8cc1Swenshuai.xi #endif
7178*53ee8cc1Swenshuai.xi 
7179*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7180*53ee8cc1Swenshuai.xi     {
7181*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7182*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
7183*53ee8cc1Swenshuai.xi     }
7184*53ee8cc1Swenshuai.xi 
7185*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7186*53ee8cc1Swenshuai.xi 
7187*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
7188*53ee8cc1Swenshuai.xi     if ( setjmp( _jmp_state ) )
7189*53ee8cc1Swenshuai.xi     {
7190*53ee8cc1Swenshuai.xi         return ( E_JPEG_FAILED );
7191*53ee8cc1Swenshuai.xi     }
7192*53ee8cc1Swenshuai.xi #endif
7193*53ee8cc1Swenshuai.xi 
7194*53ee8cc1Swenshuai.xi     if(!JPEG_init_frame())
7195*53ee8cc1Swenshuai.xi     {
7196*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
7197*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
7198*53ee8cc1Swenshuai.xi     }
7199*53ee8cc1Swenshuai.xi 
7200*53ee8cc1Swenshuai.xi     if ( _bProgressive_flag )
7201*53ee8cc1Swenshuai.xi     {
7202*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
7203*53ee8cc1Swenshuai.xi         if(!JPEG_init_progressive())
7204*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
7205*53ee8cc1Swenshuai.xi #endif
7206*53ee8cc1Swenshuai.xi     }
7207*53ee8cc1Swenshuai.xi     else
7208*53ee8cc1Swenshuai.xi     {
7209*53ee8cc1Swenshuai.xi         if(!JPEG_init_sequential())
7210*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
7211*53ee8cc1Swenshuai.xi     }
7212*53ee8cc1Swenshuai.xi 
7213*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7214*53ee8cc1Swenshuai.xi     if((E_JPEG_CMYK == gu8Scan_type)
7215*53ee8cc1Swenshuai.xi     || (E_JPEG_RGB == gu8Scan_type))
7216*53ee8cc1Swenshuai.xi     {
7217*53ee8cc1Swenshuai.xi         if ( ( mcu_width = pic_width % ( Y_HSF * 8 ) ) )
7218*53ee8cc1Swenshuai.xi         {
7219*53ee8cc1Swenshuai.xi             pic_width += ( Y_HSF * 8 - mcu_width );
7220*53ee8cc1Swenshuai.xi         }
7221*53ee8cc1Swenshuai.xi 
7222*53ee8cc1Swenshuai.xi         if ( ( mcu_height = pic_height% ( Y_VSF * 8 ) ) )
7223*53ee8cc1Swenshuai.xi         {
7224*53ee8cc1Swenshuai.xi             pic_height += ( Y_VSF * 8 - mcu_height );
7225*53ee8cc1Swenshuai.xi         }
7226*53ee8cc1Swenshuai.xi 
7227*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("Y_HSF = %d and Y_VSF = %d\n",Y_HSF, Y_VSF);
7228*53ee8cc1Swenshuai.xi 
7229*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("mcu_width = %d and mcu_height = %d\n",mcu_width, mcu_height);
7230*53ee8cc1Swenshuai.xi 
7231*53ee8cc1Swenshuai.xi         _u16NonAlignmentImage_x_size = pic_width;
7232*53ee8cc1Swenshuai.xi         _u16NonAlignmentImage_y_size = _u16Image_y_size;
7233*53ee8cc1Swenshuai.xi         _u16Image_x_size = pic_width;
7234*53ee8cc1Swenshuai.xi         _u16Image_y_size = pic_height;
7235*53ee8cc1Swenshuai.xi 
7236*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("Width = %d and Height = %d\n",JPEG_MAX_WIDTH, JPEG_MAX_HEIGHT);
7237*53ee8cc1Swenshuai.xi 
7238*53ee8cc1Swenshuai.xi         //Set the Scale down variable
7239*53ee8cc1Swenshuai.xi         if(_u16Image_x_size > JPEG_MAX_WIDTH*4 || _u16Image_y_size>JPEG_MAX_HEIGHT*4)
7240*53ee8cc1Swenshuai.xi         {
7241*53ee8cc1Swenshuai.xi             _u8ScaleDownFactor = E_JPD_DOWNSCALE_EIGHTH;
7242*53ee8cc1Swenshuai.xi             _u16Image_x_size= (_u16Image_x_size/ 64)*64;
7243*53ee8cc1Swenshuai.xi             _u16Image_x_size = _u16Image_x_size/ 8;
7244*53ee8cc1Swenshuai.xi             _u16Image_y_size = _u16Image_y_size/ 8;
7245*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("down scale 1/8!!\n");
7246*53ee8cc1Swenshuai.xi         }
7247*53ee8cc1Swenshuai.xi         else if(_u16Image_x_size > JPEG_MAX_WIDTH*2 || _u16Image_y_size>JPEG_MAX_HEIGHT*2)
7248*53ee8cc1Swenshuai.xi         {
7249*53ee8cc1Swenshuai.xi             _u8ScaleDownFactor = E_JPD_DOWNSCALE_FOURTH;
7250*53ee8cc1Swenshuai.xi             _u16Image_x_size= (_u16Image_x_size/ 32)*32;
7251*53ee8cc1Swenshuai.xi             _u16Image_x_size = _u16Image_x_size/ 4;
7252*53ee8cc1Swenshuai.xi             _u16Image_y_size = _u16Image_y_size/ 4;
7253*53ee8cc1Swenshuai.xi              JPEG_DEBUG_API_MSG("down scale 1/4!!\n");
7254*53ee8cc1Swenshuai.xi         }
7255*53ee8cc1Swenshuai.xi         else if (_u16Image_x_size > JPEG_MAX_WIDTH || _u16Image_y_size>JPEG_MAX_HEIGHT)
7256*53ee8cc1Swenshuai.xi         {
7257*53ee8cc1Swenshuai.xi             _u8ScaleDownFactor = E_JPD_DOWNSCALE_HALF;
7258*53ee8cc1Swenshuai.xi             _u16Image_x_size= (_u16Image_x_size/ 16)*16;
7259*53ee8cc1Swenshuai.xi             _u16Image_x_size = _u16Image_x_size/ 2;
7260*53ee8cc1Swenshuai.xi             _u16Image_y_size = _u16Image_y_size/ 2;
7261*53ee8cc1Swenshuai.xi              JPEG_DEBUG_API_MSG("down scale 1/2!!\n");
7262*53ee8cc1Swenshuai.xi         }
7263*53ee8cc1Swenshuai.xi         else
7264*53ee8cc1Swenshuai.xi         {
7265*53ee8cc1Swenshuai.xi              JPEG_DEBUG_API_MSG("down scale 1/1!!\n");
7266*53ee8cc1Swenshuai.xi             _u8ScaleDownFactor = E_JPD_DOWNSCALE_ORG;
7267*53ee8cc1Swenshuai.xi 
7268*53ee8cc1Swenshuai.xi         }
7269*53ee8cc1Swenshuai.xi 
7270*53ee8cc1Swenshuai.xi         _u16PaddingMcuNumber = (_u16Image_x_size << _u8ScaleDownFactor)/gu8Max_mcu_x_size;
7271*53ee8cc1Swenshuai.xi         _u32Max_blocks_per_row = _u16PaddingMcuNumber* _u16Max_blocks_per_mcu;
7272*53ee8cc1Swenshuai.xi 
7273*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("down scale width : %d\n",_u16Image_x_size);
7274*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("down scale height : %d\n",_u16Image_y_size);
7275*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("down scale MCU : %d\n",_u16PaddingMcuNumber);
7276*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("down scale MCU : %ld\n",_u32Max_blocks_per_row);
7277*53ee8cc1Swenshuai.xi     }
7278*53ee8cc1Swenshuai.xi #endif
7279*53ee8cc1Swenshuai.xi 
7280*53ee8cc1Swenshuai.xi     if (__bIsMjpeg)
7281*53ee8cc1Swenshuai.xi     {
7282*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG ("MJPEG Read buffer address RECOVER : 0x%lx - 0x%lx + 0x%lx ",
7283*53ee8cc1Swenshuai.xi                 MS_VA2PA(MRC_BUFFER_ADDR), MS_VA2PA(__u32TrickyMjpegBase), MS_VA2PA(__u32RealMjpegBase));
7284*53ee8cc1Swenshuai.xi         MRC_BUFFER_ADDR -= __u32TrickyMjpegBase;
7285*53ee8cc1Swenshuai.xi         MRC_BUFFER_ADDR += __u32RealMjpegBase;
7286*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG ("= 0x%lx\n", MS_VA2PA(MRC_BUFFER_ADDR));
7287*53ee8cc1Swenshuai.xi     }
7288*53ee8cc1Swenshuai.xi 
7289*53ee8cc1Swenshuai.xi     return ( E_JPEG_OKAY );
7290*53ee8cc1Swenshuai.xi }
7291*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7292*53ee8cc1Swenshuai.xi /********************************************************************/
7293*53ee8cc1Swenshuai.xi ///Decode JPEG data (baseline & progressive)
7294*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result : JPEG decode status
7295*53ee8cc1Swenshuai.xi ///     - E_JPEG_DONE : For progressive decoding one line done.
7296*53ee8cc1Swenshuai.xi ///     - E_JPEG_OKAY : Success
7297*53ee8cc1Swenshuai.xi ///     - E_JPEG_FAILED : Failed
7298*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_Decode(void)7299*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_Decode(void)
7300*53ee8cc1Swenshuai.xi {
7301*53ee8cc1Swenshuai.xi     JPEG_Result retVal = E_JPEG_FAILED;
7302*53ee8cc1Swenshuai.xi 
7303*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7304*53ee8cc1Swenshuai.xi     {
7305*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7306*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
7307*53ee8cc1Swenshuai.xi     }
7308*53ee8cc1Swenshuai.xi 
7309*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: _bProgressive_flag = %d\n", __FUNCTION__ , _bProgressive_flag);
7310*53ee8cc1Swenshuai.xi 
7311*53ee8cc1Swenshuai.xi     if(_bProgressive_flag)
7312*53ee8cc1Swenshuai.xi     {
7313*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
7314*53ee8cc1Swenshuai.xi         retVal = JPEG_Progressive_Decode();
7315*53ee8cc1Swenshuai.xi #endif
7316*53ee8cc1Swenshuai.xi     }
7317*53ee8cc1Swenshuai.xi     else
7318*53ee8cc1Swenshuai.xi     {
7319*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7320*53ee8cc1Swenshuai.xi         if((E_JPEG_CMYK == gu8Scan_type)
7321*53ee8cc1Swenshuai.xi         || (E_JPEG_RGB == gu8Scan_type))
7322*53ee8cc1Swenshuai.xi         {
7323*53ee8cc1Swenshuai.xi             retVal = msAPI_JPEG_Baseline_Decode();
7324*53ee8cc1Swenshuai.xi             return retVal;
7325*53ee8cc1Swenshuai.xi         }
7326*53ee8cc1Swenshuai.xi #endif
7327*53ee8cc1Swenshuai.xi 
7328*53ee8cc1Swenshuai.xi #ifndef CMODEL
7329*53ee8cc1Swenshuai.xi         JPEG_StartDecode();
7330*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
7331*53ee8cc1Swenshuai.xi         u32MeasureDecodeTimeSW = MsOS_GetSystemTime()-u32MeasureDecodeTime;
7332*53ee8cc1Swenshuai.xi         u32MeasureDecodeTime = MsOS_GetSystemTime();
7333*53ee8cc1Swenshuai.xi #endif
7334*53ee8cc1Swenshuai.xi         if(_Error_code == E_JPEG_NO_ERROR)
7335*53ee8cc1Swenshuai.xi             retVal = E_JPEG_OKAY;
7336*53ee8cc1Swenshuai.xi         else
7337*53ee8cc1Swenshuai.xi             retVal = E_JPEG_FAILED;
7338*53ee8cc1Swenshuai.xi #endif
7339*53ee8cc1Swenshuai.xi     }
7340*53ee8cc1Swenshuai.xi     return retVal;
7341*53ee8cc1Swenshuai.xi }
7342*53ee8cc1Swenshuai.xi 
7343*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
_PrintOutputMem(MS_U32 u32addr,MS_U32 u32Size)7344*53ee8cc1Swenshuai.xi static void _PrintOutputMem(MS_U32 u32addr, MS_U32 u32Size)
7345*53ee8cc1Swenshuai.xi {
7346*53ee8cc1Swenshuai.xi     u32Size = ALIGN_16(u32Size);
7347*53ee8cc1Swenshuai.xi     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};
7348*53ee8cc1Swenshuai.xi     fileName2[10]=MApi_JPEG_GetWidth()/1000+'0';
7349*53ee8cc1Swenshuai.xi     fileName2[11]=(MApi_JPEG_GetWidth()/100)%10+'0';
7350*53ee8cc1Swenshuai.xi     fileName2[12]=(MApi_JPEG_GetWidth()/10)%10+'0';
7351*53ee8cc1Swenshuai.xi     fileName2[13]=MApi_JPEG_GetWidth()%10+'0';
7352*53ee8cc1Swenshuai.xi     fileName2[15]=MApi_JPEG_GetHeight()/1000+'0';
7353*53ee8cc1Swenshuai.xi     fileName2[16]=(MApi_JPEG_GetHeight()/100)%10+'0';
7354*53ee8cc1Swenshuai.xi     fileName2[17]=(MApi_JPEG_GetHeight()/10)%10+'0';
7355*53ee8cc1Swenshuai.xi     fileName2[18]=MApi_JPEG_GetHeight()%10+'0';
7356*53ee8cc1Swenshuai.xi 
7357*53ee8cc1Swenshuai.xi     fileName2[22]++;
7358*53ee8cc1Swenshuai.xi     if(fileName2[22] > '9')
7359*53ee8cc1Swenshuai.xi     {
7360*53ee8cc1Swenshuai.xi         fileName2[21]++;
7361*53ee8cc1Swenshuai.xi         fileName2[22] = '0';
7362*53ee8cc1Swenshuai.xi     }
7363*53ee8cc1Swenshuai.xi     if(fileName2[21] > '9')
7364*53ee8cc1Swenshuai.xi     {
7365*53ee8cc1Swenshuai.xi         fileName2[20]++;
7366*53ee8cc1Swenshuai.xi         fileName2[21] = '0';
7367*53ee8cc1Swenshuai.xi     }
7368*53ee8cc1Swenshuai.xi 
7369*53ee8cc1Swenshuai.xi     FILE *outBinfp;
7370*53ee8cc1Swenshuai.xi     if((outBinfp = fopen((char *)fileName2, "wb"))==NULL) {
7371*53ee8cc1Swenshuai.xi         printf("Can't open output yuyv file\n");
7372*53ee8cc1Swenshuai.xi     }
7373*53ee8cc1Swenshuai.xi     else
7374*53ee8cc1Swenshuai.xi     {
7375*53ee8cc1Swenshuai.xi         printf("open output yuyv file success\n");
7376*53ee8cc1Swenshuai.xi     }
7377*53ee8cc1Swenshuai.xi 
7378*53ee8cc1Swenshuai.xi     fwrite((void *)u32addr, 1, u32Size, outBinfp);
7379*53ee8cc1Swenshuai.xi     fclose(outBinfp);
7380*53ee8cc1Swenshuai.xi 
7381*53ee8cc1Swenshuai.xi }
7382*53ee8cc1Swenshuai.xi #endif
7383*53ee8cc1Swenshuai.xi 
7384*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7385*53ee8cc1Swenshuai.xi /********************************************************************/
7386*53ee8cc1Swenshuai.xi /// Free all block of JPD. Complete destroy the decoder object.
7387*53ee8cc1Swenshuai.xi /// It could be called at any time.
7388*53ee8cc1Swenshuai.xi ///@return None
7389*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_Exit(void)7390*53ee8cc1Swenshuai.xi void _MApi_JPEG_Exit(void)
7391*53ee8cc1Swenshuai.xi {
7392*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7393*53ee8cc1Swenshuai.xi     {
7394*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7395*53ee8cc1Swenshuai.xi         return;
7396*53ee8cc1Swenshuai.xi     }
7397*53ee8cc1Swenshuai.xi     else
7398*53ee8cc1Swenshuai.xi     {
7399*53ee8cc1Swenshuai.xi         _bIsInit = FALSE;
7400*53ee8cc1Swenshuai.xi     }
7401*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7402*53ee8cc1Swenshuai.xi #ifndef CMODEL
7403*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("MApi_JPEG_GetCurReadStatus : \nCurVidx = %d, CurRow = %d, CurCol = %d ",
7404*53ee8cc1Swenshuai.xi         MDrv_JPD_GetCurVidx(),
7405*53ee8cc1Swenshuai.xi         MDrv_JPD_GetCurRow(),
7406*53ee8cc1Swenshuai.xi         MDrv_JPD_GetCurCol());
7407*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%lx\n", MDrv_JPD_GetCurMRCAddr());
7408*53ee8cc1Swenshuai.xi 
7409*53ee8cc1Swenshuai.xi     MDrv_JPD_PowerOff();
7410*53ee8cc1Swenshuai.xi #endif
7411*53ee8cc1Swenshuai.xi     JPEG_free_all_blocks();
7412*53ee8cc1Swenshuai.xi 
7413*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7414*53ee8cc1Swenshuai.xi     bEnableCMYK = TRUE;
7415*53ee8cc1Swenshuai.xi     bEnableRGB = TRUE;
7416*53ee8cc1Swenshuai.xi #endif
7417*53ee8cc1Swenshuai.xi 
7418*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
7419*53ee8cc1Swenshuai.xi     _u32In_buf_MPO_left = 0xFFFFFFFFUL;         // reset _u32In_buf_MPO_left to U32_MAX
7420*53ee8cc1Swenshuai.xi     bIsMPOFormat = FALSE;
7421*53ee8cc1Swenshuai.xi #endif
7422*53ee8cc1Swenshuai.xi 
7423*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
7424*53ee8cc1Swenshuai.xi fclose(logBinfp);
7425*53ee8cc1Swenshuai.xi logBinfp = NULL;
7426*53ee8cc1Swenshuai.xi #endif
7427*53ee8cc1Swenshuai.xi 
7428*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: done!!\n", __FUNCTION__);
7429*53ee8cc1Swenshuai.xi     return;
7430*53ee8cc1Swenshuai.xi }
7431*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7432*53ee8cc1Swenshuai.xi /********************************************************************/
7433*53ee8cc1Swenshuai.xi ///Get JPEG decoder error code
7434*53ee8cc1Swenshuai.xi ///@return JPEG decoder error code
7435*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetErrorCode(void)7436*53ee8cc1Swenshuai.xi JPEG_ErrCode _MApi_JPEG_GetErrorCode(void)
7437*53ee8cc1Swenshuai.xi {
7438*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7439*53ee8cc1Swenshuai.xi     {
7440*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7441*53ee8cc1Swenshuai.xi         return E_JPEG_NOT_INIT;
7442*53ee8cc1Swenshuai.xi     }
7443*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: ErrCode = %d\n", __FUNCTION__ , _Error_code);
7444*53ee8cc1Swenshuai.xi     return _Error_code;
7445*53ee8cc1Swenshuai.xi }
7446*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7447*53ee8cc1Swenshuai.xi #if 0 //move to APP
7448*53ee8cc1Swenshuai.xi /********************************************************************/
7449*53ee8cc1Swenshuai.xi ///Preload buffer from JPEG content
7450*53ee8cc1Swenshuai.xi ///The calling order must be HIGH -> LOW -> HIGH -> LOW....
7451*53ee8cc1Swenshuai.xi ///or LOW -> HIGH -> LOW -> HIGH.
7452*53ee8cc1Swenshuai.xi ///Since the file offset is maintained out side, we assume it won't be out of order.
7453*53ee8cc1Swenshuai.xi ///@param u8Type \b IN indicate which parts of buffer wants to load
7454*53ee8cc1Swenshuai.xi ///@return true or false
7455*53ee8cc1Swenshuai.xi /********************************************************************/
7456*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_PreLoadBuffer(MS_U8 u8Type)
7457*53ee8cc1Swenshuai.xi {
7458*53ee8cc1Swenshuai.xi     MS_S32 bytes_read;
7459*53ee8cc1Swenshuai.xi     MS_U8 *pBuffer_addr, Position;
7460*53ee8cc1Swenshuai.xi     MS_U32 buf_left = 0;
7461*53ee8cc1Swenshuai.xi 
7462*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("MApi_JPEG_PreLoadBuffer: type = %d\n", u8Type);
7463*53ee8cc1Swenshuai.xi #if 1
7464*53ee8cc1Swenshuai.xi     if(MAPi_JPEG_ProcessEOF(u8Type))
7465*53ee8cc1Swenshuai.xi         return TRUE;
7466*53ee8cc1Swenshuai.xi #else
7467*53ee8cc1Swenshuai.xi     if ( _bEOF_flag )
7468*53ee8cc1Swenshuai.xi     {
7469*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("end of file!!\n");
7470*53ee8cc1Swenshuai.xi         MDrv_UART_PutChar('t'); // DO NOT MARK THIS, THIS FUNCTION MUST BE CALLED. OR THE JPD DECODE WILL FAIL for LARGE FILES
7471*53ee8cc1Swenshuai.xi         if(u8Type==E_JPEG_BUFFER_HIGH)
7472*53ee8cc1Swenshuai.xi         {
7473*53ee8cc1Swenshuai.xi             // clear MRC high portion read complete event
7474*53ee8cc1Swenshuai.xi             //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE);
7475*53ee8cc1Swenshuai.xi             MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
7476*53ee8cc1Swenshuai.xi         }
7477*53ee8cc1Swenshuai.xi         else
7478*53ee8cc1Swenshuai.xi         {
7479*53ee8cc1Swenshuai.xi             // clear MRC low portion read complete event
7480*53ee8cc1Swenshuai.xi             //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBL_DONE);
7481*53ee8cc1Swenshuai.xi             MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
7482*53ee8cc1Swenshuai.xi         }
7483*53ee8cc1Swenshuai.xi         return TRUE;
7484*53ee8cc1Swenshuai.xi     }
7485*53ee8cc1Swenshuai.xi #endif
7486*53ee8cc1Swenshuai.xi 
7487*53ee8cc1Swenshuai.xi     if ( setjmp( _jmp_state ) )
7488*53ee8cc1Swenshuai.xi     {
7489*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("ERROR\n");
7490*53ee8cc1Swenshuai.xi         return ( FALSE );
7491*53ee8cc1Swenshuai.xi     }
7492*53ee8cc1Swenshuai.xi 
7493*53ee8cc1Swenshuai.xi     if(u8Type==E_JPEG_BUFFER_HIGH)
7494*53ee8cc1Swenshuai.xi     {
7495*53ee8cc1Swenshuai.xi         pBuffer_addr = _pu8In_buf + (MRC_BUFFER_SIZE/2);
7496*53ee8cc1Swenshuai.xi         Position = 1;
7497*53ee8cc1Swenshuai.xi     }
7498*53ee8cc1Swenshuai.xi     else
7499*53ee8cc1Swenshuai.xi     {
7500*53ee8cc1Swenshuai.xi         pBuffer_addr = _pu8In_buf;
7501*53ee8cc1Swenshuai.xi         Position = 0;
7502*53ee8cc1Swenshuai.xi     }
7503*53ee8cc1Swenshuai.xi 
7504*53ee8cc1Swenshuai.xi #if 1
7505*53ee8cc1Swenshuai.xi {
7506*53ee8cc1Swenshuai.xi     MS_BOOL EOF_flag = FALSE;
7507*53ee8cc1Swenshuai.xi     do
7508*53ee8cc1Swenshuai.xi     {
7509*53ee8cc1Swenshuai.xi         bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MRC_BUFFER_SIZE/2 - buf_left, &EOF_flag, _pStream, Position );
7510*53ee8cc1Swenshuai.xi 
7511*53ee8cc1Swenshuai.xi         if ( bytes_read == -1 )
7512*53ee8cc1Swenshuai.xi         {
7513*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_STREAM_READ );
7514*53ee8cc1Swenshuai.xi         }
7515*53ee8cc1Swenshuai.xi 
7516*53ee8cc1Swenshuai.xi         buf_left += bytes_read;
7517*53ee8cc1Swenshuai.xi //        _Total_Decoded_Size += bytes_read;
7518*53ee8cc1Swenshuai.xi     } while(( buf_left < MRC_BUFFER_SIZE/2 ) && ( !EOF_flag ));
7519*53ee8cc1Swenshuai.xi     MAPi_JPEG_FileReadInfo(buf_left, EOF_flag);
7520*53ee8cc1Swenshuai.xi }
7521*53ee8cc1Swenshuai.xi #else
7522*53ee8cc1Swenshuai.xi     do
7523*53ee8cc1Swenshuai.xi     {
7524*53ee8cc1Swenshuai.xi         bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MRC_BUFFER_SIZE/2 - buf_left, &_bEOF_flag, _pStream, Position );
7525*53ee8cc1Swenshuai.xi 
7526*53ee8cc1Swenshuai.xi         if ( bytes_read == -1 )
7527*53ee8cc1Swenshuai.xi         {
7528*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_STREAM_READ );
7529*53ee8cc1Swenshuai.xi         }
7530*53ee8cc1Swenshuai.xi 
7531*53ee8cc1Swenshuai.xi         buf_left += bytes_read;
7532*53ee8cc1Swenshuai.xi ////        _Total_Decoded_Size += bytes_read;
7533*53ee8cc1Swenshuai.xi     } while(( buf_left < MRC_BUFFER_SIZE/2 ) && ( !_bEOF_flag ));
7534*53ee8cc1Swenshuai.xi #endif
7535*53ee8cc1Swenshuai.xi 
7536*53ee8cc1Swenshuai.xi 
7537*53ee8cc1Swenshuai.xi #if 1
7538*53ee8cc1Swenshuai.xi     MApi_JPEG_SetMRBufferValid(u8Type);
7539*53ee8cc1Swenshuai.xi #else
7540*53ee8cc1Swenshuai.xi     if(u8Type==E_JPEG_BUFFER_HIGH)
7541*53ee8cc1Swenshuai.xi     {
7542*53ee8cc1Swenshuai.xi         // clear MRC high portion read complete event
7543*53ee8cc1Swenshuai.xi         //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE);
7544*53ee8cc1Swenshuai.xi         MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
7545*53ee8cc1Swenshuai.xi         // mark high portion valid
7546*53ee8cc1Swenshuai.xi         //MDrv_Write2Byte( BK_JPD_MCONFIG, (MDrv_Read2Byte(BK_JPD_MCONFIG) & ~0x0003) | JPD_H_VLD);
7547*53ee8cc1Swenshuai.xi         MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_H_VLD);
7548*53ee8cc1Swenshuai.xi     }
7549*53ee8cc1Swenshuai.xi     else
7550*53ee8cc1Swenshuai.xi     {
7551*53ee8cc1Swenshuai.xi         // clear MRC low portion read complete event
7552*53ee8cc1Swenshuai.xi         //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBL_DONE);
7553*53ee8cc1Swenshuai.xi         MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
7554*53ee8cc1Swenshuai.xi         // mark low portion valid
7555*53ee8cc1Swenshuai.xi         //MDrv_Write2Byte( BK_JPD_MCONFIG, (MDrv_Read2Byte(BK_JPD_MCONFIG) & ~0x0003) | JPD_L_VLD);
7556*53ee8cc1Swenshuai.xi         MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_L_VLD);
7557*53ee8cc1Swenshuai.xi     }
7558*53ee8cc1Swenshuai.xi #endif
7559*53ee8cc1Swenshuai.xi     return TRUE;
7560*53ee8cc1Swenshuai.xi }
7561*53ee8cc1Swenshuai.xi #else // for APP reference
7562*53ee8cc1Swenshuai.xi #if 0
7563*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_PreLoadBuffer(MS_U8 u8MRBuffType, MS_U8* u8In_buf, MS_U32 MaxBufSize)
7564*53ee8cc1Swenshuai.xi {
7565*53ee8cc1Swenshuai.xi     MS_S32 bytes_read;
7566*53ee8cc1Swenshuai.xi     MS_U8 *pBuffer_addr, Position;
7567*53ee8cc1Swenshuai.xi     MS_U32 buf_left = 0;
7568*53ee8cc1Swenshuai.xi     MS_BOOL EOF_flag = FALSE;
7569*53ee8cc1Swenshuai.xi 
7570*53ee8cc1Swenshuai.xi     if(MAPi_JPEG_ProcessEOF(u8MRBuffType))
7571*53ee8cc1Swenshuai.xi         return TRUE;
7572*53ee8cc1Swenshuai.xi 
7573*53ee8cc1Swenshuai.xi     if(MaxBufSize > (MRC_BUFFER_SIZE/2))
7574*53ee8cc1Swenshuai.xi     {
7575*53ee8cc1Swenshuai.xi         return FALSE;
7576*53ee8cc1Swenshuai.xi     }
7577*53ee8cc1Swenshuai.xi 
7578*53ee8cc1Swenshuai.xi     if(u8MRBuffType==E_JPEG_BUFFER_HIGH)
7579*53ee8cc1Swenshuai.xi     {
7580*53ee8cc1Swenshuai.xi         pBuffer_addr = u8In_buf + (MRC_BUFFER_SIZE/2);
7581*53ee8cc1Swenshuai.xi         Position = 1;
7582*53ee8cc1Swenshuai.xi     }
7583*53ee8cc1Swenshuai.xi     else
7584*53ee8cc1Swenshuai.xi     {
7585*53ee8cc1Swenshuai.xi         pBuffer_addr = u8In_buf;
7586*53ee8cc1Swenshuai.xi         Position = 0;
7587*53ee8cc1Swenshuai.xi     }
7588*53ee8cc1Swenshuai.xi 
7589*53ee8cc1Swenshuai.xi     do
7590*53ee8cc1Swenshuai.xi     {
7591*53ee8cc1Swenshuai.xi //        bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MRC_BUFFER_SIZE/2 - buf_left, &EOF_flag, _pStream, Position );
7592*53ee8cc1Swenshuai.xi         bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MaxBufSize - buf_left, &EOF_flag, _pStream, Position );
7593*53ee8cc1Swenshuai.xi 
7594*53ee8cc1Swenshuai.xi         if ( bytes_read == -1 )
7595*53ee8cc1Swenshuai.xi         {
7596*53ee8cc1Swenshuai.xi             MApi_JPEG_SetErrCode( E_JPEG_STREAM_READ );
7597*53ee8cc1Swenshuai.xi             return FALSE;
7598*53ee8cc1Swenshuai.xi         }
7599*53ee8cc1Swenshuai.xi 
7600*53ee8cc1Swenshuai.xi         buf_left += bytes_read;
7601*53ee8cc1Swenshuai.xi //        _Total_Decoded_Size += bytes_read;
7602*53ee8cc1Swenshuai.xi     } while(( buf_left < MaxBufSize ) && ( !EOF_flag ));
7603*53ee8cc1Swenshuai.xi     MAPi_JPEG_FileReadInfo(buf_left, EOF_flag);
7604*53ee8cc1Swenshuai.xi     MApi_JPEG_SetMRBufferValid(u8MRBuffType);
7605*53ee8cc1Swenshuai.xi     return TRUE;
7606*53ee8cc1Swenshuai.xi }
7607*53ee8cc1Swenshuai.xi #endif
7608*53ee8cc1Swenshuai.xi #endif
7609*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7610*53ee8cc1Swenshuai.xi /********************************************************************/
7611*53ee8cc1Swenshuai.xi ///Get JPD EVENT FLAG
7612*53ee8cc1Swenshuai.xi ///@return \b JPEG_Event : JPEG event flag
7613*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetJPDEventFlag(void)7614*53ee8cc1Swenshuai.xi JPEG_Event _MApi_JPEG_GetJPDEventFlag(void)
7615*53ee8cc1Swenshuai.xi {
7616*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7617*53ee8cc1Swenshuai.xi     {
7618*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7619*53ee8cc1Swenshuai.xi         return E_JPEG_EVENT_DEC_ERROR_MASK;
7620*53ee8cc1Swenshuai.xi     }
7621*53ee8cc1Swenshuai.xi 
7622*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7623*53ee8cc1Swenshuai.xi     // It's pure software decode
7624*53ee8cc1Swenshuai.xi     if((E_JPEG_CMYK == gu8Scan_type)
7625*53ee8cc1Swenshuai.xi     || (E_JPEG_RGB == gu8Scan_type))
7626*53ee8cc1Swenshuai.xi     {
7627*53ee8cc1Swenshuai.xi         return E_JPEG_EVENT_DEC_DONE;
7628*53ee8cc1Swenshuai.xi     }
7629*53ee8cc1Swenshuai.xi #endif
7630*53ee8cc1Swenshuai.xi 
7631*53ee8cc1Swenshuai.xi #ifndef CMODEL
7632*53ee8cc1Swenshuai.xi     {
7633*53ee8cc1Swenshuai.xi         JPEG_Event reg_val = (JPEG_Event)MDrv_JPD_GetEventFlag();
7634*53ee8cc1Swenshuai.xi         if(reg_val!=0)
7635*53ee8cc1Swenshuai.xi         {
7636*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: reg_val = 0x%04X\n", __FUNCTION__ , reg_val);
7637*53ee8cc1Swenshuai.xi         }
7638*53ee8cc1Swenshuai.xi         if(E_JPEG_EVENT_DEC_DONE & reg_val)
7639*53ee8cc1Swenshuai.xi         {
7640*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
7641*53ee8cc1Swenshuai.xi             u32MeasureDecodeTimeHW = MsOS_GetSystemTime()-u32MeasureDecodeTime;
7642*53ee8cc1Swenshuai.xi             printf_red("SW decode header:[%ld]ms, HW decode: [%ld]ms\n", u32MeasureDecodeTimeSW, u32MeasureDecodeTimeHW);
7643*53ee8cc1Swenshuai.xi #endif
7644*53ee8cc1Swenshuai.xi             if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API)
7645*53ee8cc1Swenshuai.xi             {
7646*53ee8cc1Swenshuai.xi                 verJPD_CRC32_Init();
7647*53ee8cc1Swenshuai.xi                 verJPD_CRC32_Update((MS_U8 *)MWC_BUFFER_ADDR,
7648*53ee8cc1Swenshuai.xi                     (MS_U32)MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2);
7649*53ee8cc1Swenshuai.xi                 printf_red("[%dx%d], u32CRCResult=0x%lx\n",MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), verJPD_CRC32_GetResult());
7650*53ee8cc1Swenshuai.xi             }
7651*53ee8cc1Swenshuai.xi 
7652*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
7653*53ee8cc1Swenshuai.xi             if(MApi_JPEG_GetWidth() <=JPEG_MAX_WIDTH
7654*53ee8cc1Swenshuai.xi                 && MApi_JPEG_GetHeight() <=JPEG_MAX_HEIGHT)
7655*53ee8cc1Swenshuai.xi             {
7656*53ee8cc1Swenshuai.xi                 MS_U32 u32Size;
7657*53ee8cc1Swenshuai.xi                 u32Size = MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2;
7658*53ee8cc1Swenshuai.xi                 printf("[%dx%d], MWC_BUFFER_ADDR=0x%lx, size=0x%lx", MApi_JPEG_GetWidth(),
7659*53ee8cc1Swenshuai.xi                     MApi_JPEG_GetHeight(), MS_VA2PA(MWC_BUFFER_ADDR),u32Size);
7660*53ee8cc1Swenshuai.xi                 _PrintOutputMem(MWC_BUFFER_ADDR, u32Size);
7661*53ee8cc1Swenshuai.xi             }
7662*53ee8cc1Swenshuai.xi #endif
7663*53ee8cc1Swenshuai.xi         }
7664*53ee8cc1Swenshuai.xi         return reg_val;
7665*53ee8cc1Swenshuai.xi     }
7666*53ee8cc1Swenshuai.xi #else
7667*53ee8cc1Swenshuai.xi     return E_JPEG_EVENT_DEC_DONE;
7668*53ee8cc1Swenshuai.xi #endif
7669*53ee8cc1Swenshuai.xi }
7670*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7671*53ee8cc1Swenshuai.xi /********************************************************************/
7672*53ee8cc1Swenshuai.xi ///Set JPD EVENT FLAG
7673*53ee8cc1Swenshuai.xi ///@param -eEvtVal \b IN : JPEG_Event
7674*53ee8cc1Swenshuai.xi ///@return None
7675*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)7676*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)
7677*53ee8cc1Swenshuai.xi {
7678*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7679*53ee8cc1Swenshuai.xi     {
7680*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7681*53ee8cc1Swenshuai.xi         return;
7682*53ee8cc1Swenshuai.xi     }
7683*53ee8cc1Swenshuai.xi 
7684*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7685*53ee8cc1Swenshuai.xi     // It's pure software decode
7686*53ee8cc1Swenshuai.xi     if((E_JPEG_CMYK == gu8Scan_type)
7687*53ee8cc1Swenshuai.xi     || (E_JPEG_RGB == gu8Scan_type))
7688*53ee8cc1Swenshuai.xi     {
7689*53ee8cc1Swenshuai.xi         return;
7690*53ee8cc1Swenshuai.xi     }
7691*53ee8cc1Swenshuai.xi #endif
7692*53ee8cc1Swenshuai.xi 
7693*53ee8cc1Swenshuai.xi #ifndef CMODEL
7694*53ee8cc1Swenshuai.xi     MDrv_JPD_SetEventFlag((MS_U16)eEvtVal);
7695*53ee8cc1Swenshuai.xi #endif
7696*53ee8cc1Swenshuai.xi     return;
7697*53ee8cc1Swenshuai.xi }
7698*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7699*53ee8cc1Swenshuai.xi /********************************************************************/
7700*53ee8cc1Swenshuai.xi ///Reset JPD -- Reset must be called before trigger JPD\n
7701*53ee8cc1Swenshuai.xi ///This function always issue pause command and wait for both MRC & MWC\n
7702*53ee8cc1Swenshuai.xi ///becoming inactive, then reset JPD.\n
7703*53ee8cc1Swenshuai.xi ///\b NOTE: The pause function can be only used by Pluto/T1/T2... not include ERIS.
7704*53ee8cc1Swenshuai.xi ///@return None
7705*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_Rst(void)7706*53ee8cc1Swenshuai.xi void _MApi_JPEG_Rst(void)
7707*53ee8cc1Swenshuai.xi {
7708*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7709*53ee8cc1Swenshuai.xi     {
7710*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7711*53ee8cc1Swenshuai.xi         return;
7712*53ee8cc1Swenshuai.xi     }
7713*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7714*53ee8cc1Swenshuai.xi #ifndef CMODEL
7715*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("MApi_JPEG_GetCurReadStatus : \nCurVidx = %d, CurRow = %d, CurCol = %d ",
7716*53ee8cc1Swenshuai.xi         MDrv_JPD_GetCurVidx(),
7717*53ee8cc1Swenshuai.xi         MDrv_JPD_GetCurRow(),
7718*53ee8cc1Swenshuai.xi         MDrv_JPD_GetCurCol());
7719*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%lx\n", MDrv_JPD_GetCurMRCAddr());
7720*53ee8cc1Swenshuai.xi 
7721*53ee8cc1Swenshuai.xi     MDrv_JPD_Rst();
7722*53ee8cc1Swenshuai.xi #endif
7723*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:done!!\n", __FUNCTION__);
7724*53ee8cc1Swenshuai.xi     return;
7725*53ee8cc1Swenshuai.xi }
7726*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7727*53ee8cc1Swenshuai.xi /********************************************************************/
7728*53ee8cc1Swenshuai.xi ///Power On JPEG decoder
7729*53ee8cc1Swenshuai.xi ///@return None
7730*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_PowerOn(void)7731*53ee8cc1Swenshuai.xi void _MApi_JPEG_PowerOn(void)
7732*53ee8cc1Swenshuai.xi {
7733*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7734*53ee8cc1Swenshuai.xi     {
7735*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7736*53ee8cc1Swenshuai.xi         return;
7737*53ee8cc1Swenshuai.xi     }
7738*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7739*53ee8cc1Swenshuai.xi #ifndef CMODEL
7740*53ee8cc1Swenshuai.xi     MDrv_JPD_PowerOn();
7741*53ee8cc1Swenshuai.xi #endif
7742*53ee8cc1Swenshuai.xi     return;
7743*53ee8cc1Swenshuai.xi }
7744*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7745*53ee8cc1Swenshuai.xi /********************************************************************/
7746*53ee8cc1Swenshuai.xi ///Power Off JPEG decoder
7747*53ee8cc1Swenshuai.xi ///@return None
7748*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_PowerOff(void)7749*53ee8cc1Swenshuai.xi void _MApi_JPEG_PowerOff(void)
7750*53ee8cc1Swenshuai.xi {
7751*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7752*53ee8cc1Swenshuai.xi     {
7753*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7754*53ee8cc1Swenshuai.xi         return;
7755*53ee8cc1Swenshuai.xi     }
7756*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7757*53ee8cc1Swenshuai.xi #ifndef CMODEL
7758*53ee8cc1Swenshuai.xi     MDrv_JPD_PowerOff();
7759*53ee8cc1Swenshuai.xi #endif
7760*53ee8cc1Swenshuai.xi     return;
7761*53ee8cc1Swenshuai.xi }
7762*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7763*53ee8cc1Swenshuai.xi /********************************************************************/
7764*53ee8cc1Swenshuai.xi ///Get current vertical line index written to memory
7765*53ee8cc1Swenshuai.xi ///@return Current vertical line index written to memory
7766*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetCurVidx(void)7767*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetCurVidx(void) //new
7768*53ee8cc1Swenshuai.xi {
7769*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7770*53ee8cc1Swenshuai.xi     {
7771*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7772*53ee8cc1Swenshuai.xi         return 0;
7773*53ee8cc1Swenshuai.xi     }
7774*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7775*53ee8cc1Swenshuai.xi #ifndef CMODEL
7776*53ee8cc1Swenshuai.xi     return MDrv_JPD_GetCurVidx();
7777*53ee8cc1Swenshuai.xi #else
7778*53ee8cc1Swenshuai.xi     return 0;
7779*53ee8cc1Swenshuai.xi #endif
7780*53ee8cc1Swenshuai.xi }
7781*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7782*53ee8cc1Swenshuai.xi /********************************************************************/
7783*53ee8cc1Swenshuai.xi ///Check current JPEG image is progressive or not
7784*53ee8cc1Swenshuai.xi ///@return TRUE / FALSE
7785*53ee8cc1Swenshuai.xi /// - TRUE : progressive
7786*53ee8cc1Swenshuai.xi /// - FALSE : baseline
7787*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_IsProgressive(void)7788*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_IsProgressive(void)
7789*53ee8cc1Swenshuai.xi {
7790*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7791*53ee8cc1Swenshuai.xi     {
7792*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7793*53ee8cc1Swenshuai.xi         return FALSE;
7794*53ee8cc1Swenshuai.xi     }
7795*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _bProgressive_flag);
7796*53ee8cc1Swenshuai.xi     return (_bProgressive_flag);
7797*53ee8cc1Swenshuai.xi }
7798*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7799*53ee8cc1Swenshuai.xi /********************************************************************/
7800*53ee8cc1Swenshuai.xi ///Check current JPEG image has thumbnail or not
7801*53ee8cc1Swenshuai.xi ///@return TRUE / FALSE
7802*53ee8cc1Swenshuai.xi /// - TRUE : thumbnail found
7803*53ee8cc1Swenshuai.xi /// - FALSE : no thumbnail
7804*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_ThumbnailFound(void)7805*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_ThumbnailFound(void)
7806*53ee8cc1Swenshuai.xi {
7807*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7808*53ee8cc1Swenshuai.xi     {
7809*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7810*53ee8cc1Swenshuai.xi         return FALSE;
7811*53ee8cc1Swenshuai.xi     }
7812*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _bThumbnailFound);
7813*53ee8cc1Swenshuai.xi     return (_bThumbnailFound);
7814*53ee8cc1Swenshuai.xi }
7815*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7816*53ee8cc1Swenshuai.xi /********************************************************************/
7817*53ee8cc1Swenshuai.xi ///The width may be the thumbnail or original image size, it based on decoding mode
7818*53ee8cc1Swenshuai.xi ///@return width
7819*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetWidth(void)7820*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetWidth(void)
7821*53ee8cc1Swenshuai.xi {
7822*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7823*53ee8cc1Swenshuai.xi     {
7824*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7825*53ee8cc1Swenshuai.xi         return 0;
7826*53ee8cc1Swenshuai.xi     }
7827*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16Image_x_size);
7828*53ee8cc1Swenshuai.xi     return (_u16Image_x_size);
7829*53ee8cc1Swenshuai.xi }
7830*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7831*53ee8cc1Swenshuai.xi /********************************************************************/
7832*53ee8cc1Swenshuai.xi ///The height may be the thumbnail or original image size, it based on decoding mode
7833*53ee8cc1Swenshuai.xi ///@return height
7834*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetHeight(void)7835*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetHeight(void)
7836*53ee8cc1Swenshuai.xi {
7837*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7838*53ee8cc1Swenshuai.xi     {
7839*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7840*53ee8cc1Swenshuai.xi         return 0;
7841*53ee8cc1Swenshuai.xi     }
7842*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16Image_y_size);
7843*53ee8cc1Swenshuai.xi     return (_u16Image_y_size);
7844*53ee8cc1Swenshuai.xi }
7845*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7846*53ee8cc1Swenshuai.xi /********************************************************************/
7847*53ee8cc1Swenshuai.xi ///Get the original width of this JPEG file after alignment
7848*53ee8cc1Swenshuai.xi ///@return original width
7849*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetOriginalWidth(void)7850*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetOriginalWidth(void)
7851*53ee8cc1Swenshuai.xi {
7852*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7853*53ee8cc1Swenshuai.xi     {
7854*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7855*53ee8cc1Swenshuai.xi         return 0;
7856*53ee8cc1Swenshuai.xi     }
7857*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16OriginalImage_x_size);
7858*53ee8cc1Swenshuai.xi     return (_u16OriginalImage_x_size);
7859*53ee8cc1Swenshuai.xi }
7860*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7861*53ee8cc1Swenshuai.xi /********************************************************************/
7862*53ee8cc1Swenshuai.xi ///Get the original height of this JPEG file after alignment
7863*53ee8cc1Swenshuai.xi ///@return original height
7864*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetOriginalHeight(void)7865*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetOriginalHeight(void)
7866*53ee8cc1Swenshuai.xi {
7867*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7868*53ee8cc1Swenshuai.xi     {
7869*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7870*53ee8cc1Swenshuai.xi         return 0;
7871*53ee8cc1Swenshuai.xi     }
7872*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16OriginalImage_y_size);
7873*53ee8cc1Swenshuai.xi     return (_u16OriginalImage_y_size);
7874*53ee8cc1Swenshuai.xi }
7875*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7876*53ee8cc1Swenshuai.xi /********************************************************************/
7877*53ee8cc1Swenshuai.xi ///Get the original width before alignment
7878*53ee8cc1Swenshuai.xi ///@return non-alignment width
7879*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetNonAlignmentWidth(void)7880*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetNonAlignmentWidth(void)
7881*53ee8cc1Swenshuai.xi {
7882*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7883*53ee8cc1Swenshuai.xi     {
7884*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7885*53ee8cc1Swenshuai.xi         return 0;
7886*53ee8cc1Swenshuai.xi     }
7887*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16NonAlignmentImage_x_size);
7888*53ee8cc1Swenshuai.xi     return (_u16NonAlignmentImage_x_size);
7889*53ee8cc1Swenshuai.xi }
7890*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7891*53ee8cc1Swenshuai.xi /********************************************************************/
7892*53ee8cc1Swenshuai.xi ///Get the original height before alignment
7893*53ee8cc1Swenshuai.xi ///@return non-alignment height
7894*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetNonAlignmentHeight(void)7895*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetNonAlignmentHeight(void)
7896*53ee8cc1Swenshuai.xi {
7897*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7898*53ee8cc1Swenshuai.xi     {
7899*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7900*53ee8cc1Swenshuai.xi         return 0;
7901*53ee8cc1Swenshuai.xi     }
7902*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16NonAlignmentImage_y_size);
7903*53ee8cc1Swenshuai.xi     return (_u16NonAlignmentImage_y_size);
7904*53ee8cc1Swenshuai.xi }
7905*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7906*53ee8cc1Swenshuai.xi /********************************************************************/
7907*53ee8cc1Swenshuai.xi ///Get the displayed pitch of JPEG image
7908*53ee8cc1Swenshuai.xi ///@return displayed pitch
7909*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetAlignedPitch(void)7910*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetAlignedPitch(void)
7911*53ee8cc1Swenshuai.xi {
7912*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7913*53ee8cc1Swenshuai.xi     {
7914*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7915*53ee8cc1Swenshuai.xi         return 0;
7916*53ee8cc1Swenshuai.xi     }
7917*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImagePitch);
7918*53ee8cc1Swenshuai.xi     return (_u16AlignedImagePitch);
7919*53ee8cc1Swenshuai.xi }
7920*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetAlignedPitch_H(void)7921*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetAlignedPitch_H(void)
7922*53ee8cc1Swenshuai.xi {
7923*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7924*53ee8cc1Swenshuai.xi     {
7925*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7926*53ee8cc1Swenshuai.xi         return 0;
7927*53ee8cc1Swenshuai.xi     }
7928*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImagePitch_H);
7929*53ee8cc1Swenshuai.xi     return (_u16AlignedImagePitch_H);
7930*53ee8cc1Swenshuai.xi }
7931*53ee8cc1Swenshuai.xi 
7932*53ee8cc1Swenshuai.xi 
7933*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7934*53ee8cc1Swenshuai.xi /********************************************************************/
7935*53ee8cc1Swenshuai.xi ///Get the displayed width of JPEG image
7936*53ee8cc1Swenshuai.xi ///@return displayed width
7937*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetAlignedWidth(void)7938*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetAlignedWidth(void)
7939*53ee8cc1Swenshuai.xi {
7940*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7941*53ee8cc1Swenshuai.xi     {
7942*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7943*53ee8cc1Swenshuai.xi         return 0;
7944*53ee8cc1Swenshuai.xi     }
7945*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImageWidth);
7946*53ee8cc1Swenshuai.xi     return (_u16AlignedImageWidth);
7947*53ee8cc1Swenshuai.xi }
7948*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7949*53ee8cc1Swenshuai.xi /********************************************************************/
7950*53ee8cc1Swenshuai.xi ///Get the displayed height of JPEG image
7951*53ee8cc1Swenshuai.xi ///@return displayed height
7952*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetAlignedHeight(void)7953*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetAlignedHeight(void)
7954*53ee8cc1Swenshuai.xi {
7955*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7956*53ee8cc1Swenshuai.xi     {
7957*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7958*53ee8cc1Swenshuai.xi         return 0;
7959*53ee8cc1Swenshuai.xi     }
7960*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImageHeight);
7961*53ee8cc1Swenshuai.xi     return (_u16AlignedImageHeight);
7962*53ee8cc1Swenshuai.xi }
7963*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7964*53ee8cc1Swenshuai.xi /********************************************************************/
7965*53ee8cc1Swenshuai.xi ///Get scale down factor\n
7966*53ee8cc1Swenshuai.xi ///Depending on the real picture width & height, it will automatically set scale down\n
7967*53ee8cc1Swenshuai.xi ///factor to meet maximum JPEG width & height allowed.
7968*53ee8cc1Swenshuai.xi ///@return scale down factor
7969*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetScaleDownFactor(void)7970*53ee8cc1Swenshuai.xi MS_U8 _MApi_JPEG_GetScaleDownFactor(void)
7971*53ee8cc1Swenshuai.xi {
7972*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
7973*53ee8cc1Swenshuai.xi     {
7974*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7975*53ee8cc1Swenshuai.xi         return 0;
7976*53ee8cc1Swenshuai.xi     }
7977*53ee8cc1Swenshuai.xi 
7978*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7979*53ee8cc1Swenshuai.xi     if((E_JPEG_CMYK == gu8Scan_type)
7980*53ee8cc1Swenshuai.xi     || (E_JPEG_RGB == gu8Scan_type))
7981*53ee8cc1Swenshuai.xi     {
7982*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u8ScaleDownFactor*2);
7983*53ee8cc1Swenshuai.xi         return (_u8ScaleDownFactor*2);
7984*53ee8cc1Swenshuai.xi     }
7985*53ee8cc1Swenshuai.xi #endif
7986*53ee8cc1Swenshuai.xi     {
7987*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u8ScaleDownFactor);
7988*53ee8cc1Swenshuai.xi         return (_u8ScaleDownFactor);
7989*53ee8cc1Swenshuai.xi     }
7990*53ee8cc1Swenshuai.xi }
7991*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7992*53ee8cc1Swenshuai.xi /********************************************************************/
7993*53ee8cc1Swenshuai.xi /// Set Max decoding resolution
7994*53ee8cc1Swenshuai.xi ///@param -u16Width \b IN : indicate max decoding width
7995*53ee8cc1Swenshuai.xi ///@param -u16Height \b IN : indicate max decoding height
7996*53ee8cc1Swenshuai.xi ///@return None
7997*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)7998*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
7999*53ee8cc1Swenshuai.xi {
8000*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: Width = %d, Height = %d\n", __FUNCTION__, u16Width, u16Height);
8001*53ee8cc1Swenshuai.xi     JPEG_MAX_WIDTH = u16Width;
8002*53ee8cc1Swenshuai.xi     JPEG_MAX_HEIGHT = u16Height;
8003*53ee8cc1Swenshuai.xi     return;
8004*53ee8cc1Swenshuai.xi }
8005*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8006*53ee8cc1Swenshuai.xi /********************************************************************/
8007*53ee8cc1Swenshuai.xi /// Set Max decoding resolution of Progressive JPEG
8008*53ee8cc1Swenshuai.xi ///@param -u16ProWidth \b IN : indicate max decoding width
8009*53ee8cc1Swenshuai.xi ///@param -u16ProHeight \b IN : indicate max decoding height
8010*53ee8cc1Swenshuai.xi ///@return None
8011*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)8012*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
8013*53ee8cc1Swenshuai.xi {
8014*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: ProWidth = %d, ProHeight = %d\n", __FUNCTION__, u16ProWidth, u16ProHeight);
8015*53ee8cc1Swenshuai.xi     JPEG_PRO_MAX_WIDTH = u16ProWidth;
8016*53ee8cc1Swenshuai.xi     JPEG_PRO_MAX_HEIGHT = u16ProHeight;
8017*53ee8cc1Swenshuai.xi     return;
8018*53ee8cc1Swenshuai.xi }
8019*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8020*53ee8cc1Swenshuai.xi /********************************************************************/
8021*53ee8cc1Swenshuai.xi /// Valid the JPEG read buffer flag
8022*53ee8cc1Swenshuai.xi ///@param -u8MRBuffType \b IN : the type of JPEG read buffer
8023*53ee8cc1Swenshuai.xi ///@return None
8024*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)8025*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)
8026*53ee8cc1Swenshuai.xi {
8027*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8028*53ee8cc1Swenshuai.xi     {
8029*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8030*53ee8cc1Swenshuai.xi         return;
8031*53ee8cc1Swenshuai.xi     }
8032*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: MRBuffType = %d\n", __FUNCTION__ , u8MRBuffType);
8033*53ee8cc1Swenshuai.xi #ifndef CMODEL
8034*53ee8cc1Swenshuai.xi     switch(u8MRBuffType)
8035*53ee8cc1Swenshuai.xi     {
8036*53ee8cc1Swenshuai.xi         case E_JPEG_BUFFER_HIGH:
8037*53ee8cc1Swenshuai.xi             MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
8038*53ee8cc1Swenshuai.xi             MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_H_VLD);
8039*53ee8cc1Swenshuai.xi             break;
8040*53ee8cc1Swenshuai.xi         case E_JPEG_BUFFER_LOW:
8041*53ee8cc1Swenshuai.xi             MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
8042*53ee8cc1Swenshuai.xi             MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_L_VLD);
8043*53ee8cc1Swenshuai.xi             break;
8044*53ee8cc1Swenshuai.xi         default:
8045*53ee8cc1Swenshuai.xi             break;
8046*53ee8cc1Swenshuai.xi     }
8047*53ee8cc1Swenshuai.xi #endif
8048*53ee8cc1Swenshuai.xi     return;
8049*53ee8cc1Swenshuai.xi }
8050*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8051*53ee8cc1Swenshuai.xi /********************************************************************/
8052*53ee8cc1Swenshuai.xi /// Set JPEG EOF flag and the total byte-read of JPEG file
8053*53ee8cc1Swenshuai.xi ///@param -u32DataRead \b IN : the amount of byte of file reading
8054*53ee8cc1Swenshuai.xi ///@param -bEOFflag \b IN : the EOF flag of file reading
8055*53ee8cc1Swenshuai.xi ///@return None
8056*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead,MS_BOOL bEOFflag)8057*53ee8cc1Swenshuai.xi void _MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead, MS_BOOL bEOFflag)
8058*53ee8cc1Swenshuai.xi {
8059*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8060*53ee8cc1Swenshuai.xi     {
8061*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8062*53ee8cc1Swenshuai.xi         return;
8063*53ee8cc1Swenshuai.xi     }
8064*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: DataRead = %ld, EOFflag = %d\n", __FUNCTION__ , u32DataRead, bEOFflag);
8065*53ee8cc1Swenshuai.xi ////    _Total_Decoded_Size += data_read;
8066*53ee8cc1Swenshuai.xi     _u32Total_bytes_read += u32DataRead;
8067*53ee8cc1Swenshuai.xi     _bEOF_flag = bEOFflag;
8068*53ee8cc1Swenshuai.xi 
8069*53ee8cc1Swenshuai.xi #ifndef CMODEL
8070*53ee8cc1Swenshuai.xi     // Set buffer valid to avoid last data not decoded done
8071*53ee8cc1Swenshuai.xi     if(bEOFflag)
8072*53ee8cc1Swenshuai.xi     {
8073*53ee8cc1Swenshuai.xi         MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
8074*53ee8cc1Swenshuai.xi     }
8075*53ee8cc1Swenshuai.xi #endif
8076*53ee8cc1Swenshuai.xi     return;
8077*53ee8cc1Swenshuai.xi }
8078*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8079*53ee8cc1Swenshuai.xi /********************************************************************/
8080*53ee8cc1Swenshuai.xi /// Process JPEG read buffer flag when EOF.
8081*53ee8cc1Swenshuai.xi ///@param -u8MRBuffType \b IN : The type of JPEG read buffer
8082*53ee8cc1Swenshuai.xi ///@return None
8083*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)8084*53ee8cc1Swenshuai.xi void _MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)
8085*53ee8cc1Swenshuai.xi {
8086*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8087*53ee8cc1Swenshuai.xi     {
8088*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8089*53ee8cc1Swenshuai.xi         return;
8090*53ee8cc1Swenshuai.xi     }
8091*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: end of file!! MRBuffType = %d\n", __FUNCTION__ , u8MRBuffType);
8092*53ee8cc1Swenshuai.xi ////    MDrv_UART_PutChar('t'); // DO NOT MARK THIS, THIS FUNCTION MUST BE CALLED. OR THE JPD DECODE WILL FAIL for LARGE FILES
8093*53ee8cc1Swenshuai.xi #ifndef CMODEL
8094*53ee8cc1Swenshuai.xi     if(u8MRBuffType == E_JPEG_BUFFER_HIGH)
8095*53ee8cc1Swenshuai.xi     {
8096*53ee8cc1Swenshuai.xi         // clear MRC high portion read complete event
8097*53ee8cc1Swenshuai.xi         //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE);
8098*53ee8cc1Swenshuai.xi         MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
8099*53ee8cc1Swenshuai.xi     }
8100*53ee8cc1Swenshuai.xi     else
8101*53ee8cc1Swenshuai.xi     {
8102*53ee8cc1Swenshuai.xi         // clear MRC low portion read complete event
8103*53ee8cc1Swenshuai.xi         //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBL_DONE);
8104*53ee8cc1Swenshuai.xi         MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
8105*53ee8cc1Swenshuai.xi     }
8106*53ee8cc1Swenshuai.xi 
8107*53ee8cc1Swenshuai.xi     // Set buffer valid to avoid last data not decoded done
8108*53ee8cc1Swenshuai.xi     MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
8109*53ee8cc1Swenshuai.xi #endif
8110*53ee8cc1Swenshuai.xi     return;
8111*53ee8cc1Swenshuai.xi }
8112*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8113*53ee8cc1Swenshuai.xi /********************************************************************/
8114*53ee8cc1Swenshuai.xi /// Set JPEG Error Code if something error on upper layer.
8115*53ee8cc1Swenshuai.xi ///@param -ErrCode \b IN : The error type of JPEG decoder
8116*53ee8cc1Swenshuai.xi ///@return None
8117*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetErrCode(JPEG_ErrCode ErrCode)8118*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetErrCode(JPEG_ErrCode ErrCode)
8119*53ee8cc1Swenshuai.xi {
8120*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_ERR("%s: ErrCode = %d\n", __FUNCTION__ , ErrCode);
8121*53ee8cc1Swenshuai.xi     _Error_code = ErrCode;
8122*53ee8cc1Swenshuai.xi ////    JPEG_free_all_blocks();
8123*53ee8cc1Swenshuai.xi     return;
8124*53ee8cc1Swenshuai.xi }
8125*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8126*53ee8cc1Swenshuai.xi /********************************************************************/
8127*53ee8cc1Swenshuai.xi /// Set JPEG debug level.
8128*53ee8cc1Swenshuai.xi ///@param -u8DbgLevel \b IN : The JPEG debug level, refer to JPEG_DbgLevel.
8129*53ee8cc1Swenshuai.xi ///@return None
8130*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)8131*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)
8132*53ee8cc1Swenshuai.xi {
8133*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: DbgLevel = 0x%04X\n", __FUNCTION__, u8DbgLevel);
8134*53ee8cc1Swenshuai.xi     _u8JPEG_ApiDbgLevel = u8DbgLevel;
8135*53ee8cc1Swenshuai.xi #ifndef CMODEL
8136*53ee8cc1Swenshuai.xi     MDrv_JPD_SetDbgLevel(u8DbgLevel);
8137*53ee8cc1Swenshuai.xi #endif
8138*53ee8cc1Swenshuai.xi     return;
8139*53ee8cc1Swenshuai.xi }
8140*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8141*53ee8cc1Swenshuai.xi /********************************************************************/
8142*53ee8cc1Swenshuai.xi /// Get JPEG debug level.
8143*53ee8cc1Swenshuai.xi ///@return JPEG debug level, refer to JPEG_DbgLevel.
8144*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetDbgLevel(void)8145*53ee8cc1Swenshuai.xi MS_U8 _MApi_JPEG_GetDbgLevel(void)
8146*53ee8cc1Swenshuai.xi {
8147*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: DbgLevel = 0x%04X\n", __FUNCTION__, _u8JPEG_ApiDbgLevel);
8148*53ee8cc1Swenshuai.xi     return _u8JPEG_ApiDbgLevel;
8149*53ee8cc1Swenshuai.xi }
8150*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8151*53ee8cc1Swenshuai.xi /********************************************************************/
8152*53ee8cc1Swenshuai.xi /// Set MHEG5 Flag.
8153*53ee8cc1Swenshuai.xi ///@param -bEnable \b IN :
8154*53ee8cc1Swenshuai.xi ///@return None
8155*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetMHEG5(MS_BOOL bEnable)8156*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetMHEG5(MS_BOOL bEnable)
8157*53ee8cc1Swenshuai.xi {
8158*53ee8cc1Swenshuai.xi     bMHEG5 = bEnable;
8159*53ee8cc1Swenshuai.xi }
8160*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8161*53ee8cc1Swenshuai.xi /********************************************************************/
8162*53ee8cc1Swenshuai.xi /// Get JPEG information
8163*53ee8cc1Swenshuai.xi ///@param -pJPEG_Info \b OUT : JPEG information\n
8164*53ee8cc1Swenshuai.xi /// structure {\n
8165*53ee8cc1Swenshuai.xi ///    MS_U8* \b pu8DrvVer : JPEG DRV version\n
8166*53ee8cc1Swenshuai.xi ///    MS_U8* \b pu8HalVer : JPEG HAL version\n
8167*53ee8cc1Swenshuai.xi ///    MS_U8* \b pu8FwVer : JPEG FW version\n
8168*53ee8cc1Swenshuai.xi ///    JPEG_DrvCap \b stDrvCap : JPEG driver capability\n
8169*53ee8cc1Swenshuai.xi ///           };
8170*53ee8cc1Swenshuai.xi ///@return None
8171*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetInfo(JPEG_Info * pJPEG_Info)8172*53ee8cc1Swenshuai.xi void _MApi_JPEG_GetInfo(JPEG_Info *pJPEG_Info)
8173*53ee8cc1Swenshuai.xi {
8174*53ee8cc1Swenshuai.xi #ifndef CMODEL
8175*53ee8cc1Swenshuai.xi     JPD_Info DrvInfo;
8176*53ee8cc1Swenshuai.xi     const MSIF_Version *DrvVer;
8177*53ee8cc1Swenshuai.xi     MDrv_JPD_GetInfo(&DrvInfo);
8178*53ee8cc1Swenshuai.xi     MDrv_JPD_GetLibVer(&DrvVer);
8179*53ee8cc1Swenshuai.xi     pJPEG_Info->pu8DrvVer = DrvVer;
8180*53ee8cc1Swenshuai.xi     pJPEG_Info->pu8HalVer = DrvInfo.pu8HalVer;
8181*53ee8cc1Swenshuai.xi     pJPEG_Info->pu8FwVer = DrvInfo.pu8FwVer;
8182*53ee8cc1Swenshuai.xi     pJPEG_Info->stDrvCap.bBaseline = DrvInfo.stCap.bBaseline;
8183*53ee8cc1Swenshuai.xi     pJPEG_Info->stDrvCap.bProgressive = DrvInfo.stCap.bProgressive;
8184*53ee8cc1Swenshuai.xi     pJPEG_Info->stDrvCap.bMJPEG = DrvInfo.stCap.bMJPEG;
8185*53ee8cc1Swenshuai.xi     pJPEG_Info->stDrvCap.u16MaxWidth = JPEG_MAX_WIDTH;
8186*53ee8cc1Swenshuai.xi     pJPEG_Info->stDrvCap.u16MaxHeight = JPEG_MAX_HEIGHT;
8187*53ee8cc1Swenshuai.xi     pJPEG_Info->stDrvCap.u16MaxProWidth = JPEG_PRO_MAX_WIDTH;
8188*53ee8cc1Swenshuai.xi     pJPEG_Info->stDrvCap.u16MaxProHeight = JPEG_PRO_MAX_HEIGHT;
8189*53ee8cc1Swenshuai.xi 
8190*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPD %04x, %04x, %04x, %s\n",
8191*53ee8cc1Swenshuai.xi         DrvVer->DDI.customer, DrvVer->DDI.model, DrvVer->DDI.chip, &(DrvVer->DDI.cpu));
8192*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("pu8HalVer = %s, pu8FwVer = %s\n", pJPEG_Info->pu8HalVer, pJPEG_Info->pu8FwVer);
8193*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: DrvCap_BL = %d, DrvCap_PRO = %d, DrvCap_MJPEG = %d\n", __FUNCTION__,
8194*53ee8cc1Swenshuai.xi         pJPEG_Info->stDrvCap.bBaseline, pJPEG_Info->stDrvCap.bProgressive, pJPEG_Info->stDrvCap.bMJPEG);
8195*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: MaxWidth = %d, MaxHeight = %d\n", __FUNCTION__,
8196*53ee8cc1Swenshuai.xi         pJPEG_Info->stDrvCap.u16MaxWidth, pJPEG_Info->stDrvCap.u16MaxHeight);
8197*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: MaxProWidth = %d, MaxProHeight = %d\n", __FUNCTION__,
8198*53ee8cc1Swenshuai.xi         pJPEG_Info->stDrvCap.u16MaxProWidth, pJPEG_Info->stDrvCap.u16MaxProHeight);
8199*53ee8cc1Swenshuai.xi #endif
8200*53ee8cc1Swenshuai.xi     return;
8201*53ee8cc1Swenshuai.xi }
8202*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8203*53ee8cc1Swenshuai.xi /********************************************************************/
8204*53ee8cc1Swenshuai.xi /// Get JPEG status.
8205*53ee8cc1Swenshuai.xi ///@param -pJPEG_Status \b OUT : JPEG status\n
8206*53ee8cc1Swenshuai.xi /// structure {\n
8207*53ee8cc1Swenshuai.xi ///    MS_U32 \b u32CurMRCAddr : JPD current decode address\n
8208*53ee8cc1Swenshuai.xi ///    MS_U16 \b u16CurVidx : JPD current decode vertical index\n
8209*53ee8cc1Swenshuai.xi ///    MS_U16 \b u16CurRow : JPD current decode row\n
8210*53ee8cc1Swenshuai.xi ///    MS_U16 \b u16CurCol : JPD current decode column\n
8211*53ee8cc1Swenshuai.xi ///    MS_BOOL \b bDrvBusy : JPEG DRV busy status\n
8212*53ee8cc1Swenshuai.xi ///    MS_BOOL \b bIsrEnable : JPD ISR status\n
8213*53ee8cc1Swenshuai.xi ///           };
8214*53ee8cc1Swenshuai.xi ///@return None
8215*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetStatus(JPEG_Status * pJPEG_Status)8216*53ee8cc1Swenshuai.xi void _MApi_JPEG_GetStatus(JPEG_Status *pJPEG_Status)
8217*53ee8cc1Swenshuai.xi {
8218*53ee8cc1Swenshuai.xi #ifndef CMODEL
8219*53ee8cc1Swenshuai.xi     JPD_Status *pDrvStatus = MDrv_JPD_GetStatus();
8220*53ee8cc1Swenshuai.xi     pJPEG_Status->u32CurMRCAddr = pDrvStatus->u32CurMRCAddr;
8221*53ee8cc1Swenshuai.xi     pJPEG_Status->u16CurVidx = pDrvStatus->u16CurVidx;
8222*53ee8cc1Swenshuai.xi     pJPEG_Status->u16CurRow = pDrvStatus->u16CurRow;
8223*53ee8cc1Swenshuai.xi     pJPEG_Status->u16CurCol = pDrvStatus->u16CurCol;
8224*53ee8cc1Swenshuai.xi     pJPEG_Status->bDrvBusy = pDrvStatus->bIsBusy;
8225*53ee8cc1Swenshuai.xi     pJPEG_Status->bIsrEnable = pDrvStatus->bIsrEnable;
8226*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: Drv_busy = %d, Isr_status = %d\n", __FUNCTION__ , pJPEG_Status->bDrvBusy, pJPEG_Status->bIsrEnable);
8227*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: CurVidx = %d, CurRow = %d, CurCol = %d\n", __FUNCTION__ ,
8228*53ee8cc1Swenshuai.xi                         pJPEG_Status->u16CurVidx, pJPEG_Status->u16CurRow, pJPEG_Status->u16CurCol);
8229*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: CurMRCAddr = 0x%lx\n", __FUNCTION__ , pJPEG_Status->u32CurMRCAddr);
8230*53ee8cc1Swenshuai.xi #endif
8231*53ee8cc1Swenshuai.xi     return;
8232*53ee8cc1Swenshuai.xi }
8233*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8234*53ee8cc1Swenshuai.xi /********************************************************************/
8235*53ee8cc1Swenshuai.xi /// Get JPEG Version.
8236*53ee8cc1Swenshuai.xi ///@param -ppVersion \b OUT : JPEG Version
8237*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8238*53ee8cc1Swenshuai.xi ///     - E_JPEG_OKAY : Success
8239*53ee8cc1Swenshuai.xi ///     - E_JPEG_FAILED : Failed
8240*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetLibVer(const MSIF_Version ** ppVersion)8241*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetLibVer(const MSIF_Version **ppVersion)
8242*53ee8cc1Swenshuai.xi {
8243*53ee8cc1Swenshuai.xi     if (!ppVersion)
8244*53ee8cc1Swenshuai.xi     {
8245*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8246*53ee8cc1Swenshuai.xi     }
8247*53ee8cc1Swenshuai.xi     *ppVersion = &_api_jpeg_version;
8248*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: JPEG %04x, %04x, %04x, %s\n", __FUNCTION__ ,
8249*53ee8cc1Swenshuai.xi         _api_jpeg_version.DDI.customer, _api_jpeg_version.DDI.model, _api_jpeg_version.DDI.chip, &(_api_jpeg_version.DDI.cpu));
8250*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8251*53ee8cc1Swenshuai.xi }
8252*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8253*53ee8cc1Swenshuai.xi /********************************************************************/
8254*53ee8cc1Swenshuai.xi /// For H/W bug, some cases can not exit after decode done, Check
8255*53ee8cc1Swenshuai.xi /// Vidx to exit.
8256*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8257*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Vidx checking is successful.
8258*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Vidx checking is failed.
8259*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_HdlVidxChk(void)8260*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_HdlVidxChk(void)
8261*53ee8cc1Swenshuai.xi {
8262*53ee8cc1Swenshuai.xi #ifndef CMODEL
8263*53ee8cc1Swenshuai.xi     MS_U16 cur_vidx = 0;
8264*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8265*53ee8cc1Swenshuai.xi     {
8266*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8267*53ee8cc1Swenshuai.xi         _JPD_IsDecoding = FALSE;
8268*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8269*53ee8cc1Swenshuai.xi     }
8270*53ee8cc1Swenshuai.xi 
8271*53ee8cc1Swenshuai.xi     if(FALSE == _JPD_IsDecoding)
8272*53ee8cc1Swenshuai.xi     {
8273*53ee8cc1Swenshuai.xi         _JPD_IsDecoding = TRUE;
8274*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8275*53ee8cc1Swenshuai.xi         _JPD_ReCheckTime = MsOS_GetSystemTime();
8276*53ee8cc1Swenshuai.xi #else
8277*53ee8cc1Swenshuai.xi         _JPD_ReCheckTime = 0;
8278*53ee8cc1Swenshuai.xi #endif
8279*53ee8cc1Swenshuai.xi     }
8280*53ee8cc1Swenshuai.xi 
8281*53ee8cc1Swenshuai.xi     //For H/W bug, some cases can not exit after decode done. Check Vidx to exit.
8282*53ee8cc1Swenshuai.xi     cur_vidx = MDrv_JPD_GetCurVidx();
8283*53ee8cc1Swenshuai.xi     if(_JPD_PreVIdx != cur_vidx)
8284*53ee8cc1Swenshuai.xi     {
8285*53ee8cc1Swenshuai.xi         _JPD_PreVIdx = cur_vidx;
8286*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8287*53ee8cc1Swenshuai.xi         _JPD_ReCheckTime = MsOS_GetSystemTime();
8288*53ee8cc1Swenshuai.xi #else
8289*53ee8cc1Swenshuai.xi         _JPD_ReCheckTime = 0;
8290*53ee8cc1Swenshuai.xi #endif
8291*53ee8cc1Swenshuai.xi     }
8292*53ee8cc1Swenshuai.xi     else
8293*53ee8cc1Swenshuai.xi     {
8294*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8295*53ee8cc1Swenshuai.xi         if((MsOS_GetSystemTime() - _JPD_ReCheckTime) >= 1000)
8296*53ee8cc1Swenshuai.xi #else
8297*53ee8cc1Swenshuai.xi         if(_JPD_ReCheckTime++ >= 10000)
8298*53ee8cc1Swenshuai.xi #endif
8299*53ee8cc1Swenshuai.xi         {
8300*53ee8cc1Swenshuai.xi             _JPD_IsDecoding = FALSE;
8301*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Decode timeout...!!!!\n");
8302*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
8303*53ee8cc1Swenshuai.xi         }
8304*53ee8cc1Swenshuai.xi     }
8305*53ee8cc1Swenshuai.xi #endif
8306*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8307*53ee8cc1Swenshuai.xi }
8308*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8309*53ee8cc1Swenshuai.xi /********************************************************************/
8310*53ee8cc1Swenshuai.xi /// Get Preload buffer information.
8311*53ee8cc1Swenshuai.xi ///@param -pBuffLoadType \b OUT : JPEG preload buffer type
8312*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8313*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8314*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8315*53ee8cc1Swenshuai.xi /// - E_JPEG_RETRY : we need to re-get preload buffer type
8316*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType * pBuffLoadType)8317*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType *pBuffLoadType)
8318*53ee8cc1Swenshuai.xi {
8319*53ee8cc1Swenshuai.xi #ifndef CMODEL
8320*53ee8cc1Swenshuai.xi     MS_U16 reg_val = MDrv_JPD_GetEventFlag();
8321*53ee8cc1Swenshuai.xi 
8322*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8323*53ee8cc1Swenshuai.xi     {
8324*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8325*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8326*53ee8cc1Swenshuai.xi     }
8327*53ee8cc1Swenshuai.xi 
8328*53ee8cc1Swenshuai.xi     if((E_JPD_EVENT_MRBL_DONE & reg_val)
8329*53ee8cc1Swenshuai.xi     && (E_JPEG_BUFFER_LOW != u8PreLHFlag))
8330*53ee8cc1Swenshuai.xi     {
8331*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s : MRBuffer Load LOW!!!!\n", __FUNCTION__);
8332*53ee8cc1Swenshuai.xi         u8PreLHFlag = E_JPEG_BUFFER_LOW;
8333*53ee8cc1Swenshuai.xi         u32MRCheckCount = 0;
8334*53ee8cc1Swenshuai.xi         *pBuffLoadType = u8PreLHFlag;
8335*53ee8cc1Swenshuai.xi         return E_JPEG_OKAY;
8336*53ee8cc1Swenshuai.xi     }
8337*53ee8cc1Swenshuai.xi     else if((E_JPD_EVENT_MRBH_DONE & reg_val)
8338*53ee8cc1Swenshuai.xi     && (E_JPEG_BUFFER_HIGH != u8PreLHFlag))
8339*53ee8cc1Swenshuai.xi     {
8340*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s : MRBuffer Load HIGH!!!!\n", __FUNCTION__);
8341*53ee8cc1Swenshuai.xi         u8PreLHFlag = E_JPEG_BUFFER_HIGH;
8342*53ee8cc1Swenshuai.xi         u32MRCheckCount = 0;
8343*53ee8cc1Swenshuai.xi         *pBuffLoadType = u8PreLHFlag;
8344*53ee8cc1Swenshuai.xi         return E_JPEG_OKAY;
8345*53ee8cc1Swenshuai.xi     }
8346*53ee8cc1Swenshuai.xi     else
8347*53ee8cc1Swenshuai.xi     {
8348*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s : MRBuffer Load NONE!!!!\n", __FUNCTION__);
8349*53ee8cc1Swenshuai.xi         *pBuffLoadType = E_JPEG_BUFFER_NONE;
8350*53ee8cc1Swenshuai.xi         u32MRCheckCount++;
8351*53ee8cc1Swenshuai.xi         if(u32MRCheckCount >= 1000)
8352*53ee8cc1Swenshuai.xi         {
8353*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Decoding time out!!\n");
8354*53ee8cc1Swenshuai.xi             u32MRCheckCount = 0;
8355*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
8356*53ee8cc1Swenshuai.xi         }
8357*53ee8cc1Swenshuai.xi     }
8358*53ee8cc1Swenshuai.xi     return E_JPEG_RETRY;
8359*53ee8cc1Swenshuai.xi #else
8360*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8361*53ee8cc1Swenshuai.xi #endif
8362*53ee8cc1Swenshuai.xi }
8363*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8364*53ee8cc1Swenshuai.xi /********************************************************************/
8365*53ee8cc1Swenshuai.xi /// Enable JPD ISR and register callback function.
8366*53ee8cc1Swenshuai.xi ///@param -IsrCb \b IN : JPD ISR callback function
8367*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8368*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8369*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8370*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)8371*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)
8372*53ee8cc1Swenshuai.xi {
8373*53ee8cc1Swenshuai.xi #ifndef CMODEL
8374*53ee8cc1Swenshuai.xi     if(TRUE == MDrv_JPD_EnableISR((JPD_IsrFuncCb)IsrCb))
8375*53ee8cc1Swenshuai.xi     {
8376*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s : Success!!!!\n", __FUNCTION__);
8377*53ee8cc1Swenshuai.xi         return E_JPEG_OKAY;
8378*53ee8cc1Swenshuai.xi     }
8379*53ee8cc1Swenshuai.xi     else
8380*53ee8cc1Swenshuai.xi     {
8381*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s : Fail!!!!\n", __FUNCTION__);
8382*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8383*53ee8cc1Swenshuai.xi     }
8384*53ee8cc1Swenshuai.xi #else
8385*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8386*53ee8cc1Swenshuai.xi #endif
8387*53ee8cc1Swenshuai.xi }
8388*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8389*53ee8cc1Swenshuai.xi /********************************************************************/
8390*53ee8cc1Swenshuai.xi /// Disable JPD ISR and unregister callback function.
8391*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8392*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8393*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8394*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_DisableISR(void)8395*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_DisableISR(void)
8396*53ee8cc1Swenshuai.xi {
8397*53ee8cc1Swenshuai.xi #ifndef CMODEL
8398*53ee8cc1Swenshuai.xi     if(TRUE == MDrv_JPD_DisableISR())
8399*53ee8cc1Swenshuai.xi     {
8400*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s : Success!!!!\n", __FUNCTION__);
8401*53ee8cc1Swenshuai.xi         return E_JPEG_OKAY;
8402*53ee8cc1Swenshuai.xi     }
8403*53ee8cc1Swenshuai.xi     else
8404*53ee8cc1Swenshuai.xi     {
8405*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s : Fail!!!!\n", __FUNCTION__);
8406*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8407*53ee8cc1Swenshuai.xi     }
8408*53ee8cc1Swenshuai.xi #else
8409*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8410*53ee8cc1Swenshuai.xi #endif
8411*53ee8cc1Swenshuai.xi }
8412*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8413*53ee8cc1Swenshuai.xi /********************************************************************/
8414*53ee8cc1Swenshuai.xi /// JPEG wait done function, call it to check JPEG decoding status.
8415*53ee8cc1Swenshuai.xi ///@return \b JPEG_DecodeStatus
8416*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_DONE : JPEG decode done.
8417*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_FAILED : JPEG decode failed.
8418*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_MRBL_DONE : MRB low done, need to feed data.
8419*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_MRBH_DONE : MRB high done, need to feed data.
8420*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_DECODING : JPEG decoding
8421*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_WaitDone(void)8422*53ee8cc1Swenshuai.xi JPEG_DecodeStatus _MApi_JPEG_WaitDone(void)
8423*53ee8cc1Swenshuai.xi {
8424*53ee8cc1Swenshuai.xi #ifndef CMODEL
8425*53ee8cc1Swenshuai.xi     MS_U16 reg_val = E_JPD_EVENT_DEC_DONE;
8426*53ee8cc1Swenshuai.xi     MS_U16 cur_vidx = 0;
8427*53ee8cc1Swenshuai.xi #endif
8428*53ee8cc1Swenshuai.xi 
8429*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8430*53ee8cc1Swenshuai.xi     {
8431*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("%s: JPD have not init!!\n", __FUNCTION__);
8432*53ee8cc1Swenshuai.xi         _JPD_IsDecoding = FALSE;
8433*53ee8cc1Swenshuai.xi         return E_JPEG_DEC_FAILED;
8434*53ee8cc1Swenshuai.xi     }
8435*53ee8cc1Swenshuai.xi 
8436*53ee8cc1Swenshuai.xi #ifndef CMODEL
8437*53ee8cc1Swenshuai.xi     if(FALSE == _JPD_IsDecoding)
8438*53ee8cc1Swenshuai.xi     {
8439*53ee8cc1Swenshuai.xi         _JPD_IsDecoding = TRUE;
8440*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8441*53ee8cc1Swenshuai.xi         _JPD_ReCheckTime = MsOS_GetSystemTime();
8442*53ee8cc1Swenshuai.xi #else
8443*53ee8cc1Swenshuai.xi         _JPD_ReCheckTime = 0;
8444*53ee8cc1Swenshuai.xi #endif
8445*53ee8cc1Swenshuai.xi     }
8446*53ee8cc1Swenshuai.xi 
8447*53ee8cc1Swenshuai.xi     //For H/W bug, some cases can not exit after decode done. Check Vidx to exit.
8448*53ee8cc1Swenshuai.xi     cur_vidx = MDrv_JPD_GetCurVidx();
8449*53ee8cc1Swenshuai.xi     if(_JPD_PreVIdx != cur_vidx)
8450*53ee8cc1Swenshuai.xi     {
8451*53ee8cc1Swenshuai.xi         _JPD_PreVIdx = cur_vidx;
8452*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8453*53ee8cc1Swenshuai.xi         _JPD_ReCheckTime = MsOS_GetSystemTime();
8454*53ee8cc1Swenshuai.xi #else
8455*53ee8cc1Swenshuai.xi         _JPD_ReCheckTime = 0;
8456*53ee8cc1Swenshuai.xi #endif
8457*53ee8cc1Swenshuai.xi     }
8458*53ee8cc1Swenshuai.xi     else
8459*53ee8cc1Swenshuai.xi     {
8460*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8461*53ee8cc1Swenshuai.xi         if((MsOS_GetSystemTime() - _JPD_ReCheckTime) >= 1000)
8462*53ee8cc1Swenshuai.xi #else
8463*53ee8cc1Swenshuai.xi         if(_JPD_ReCheckTime++ >= 10000)
8464*53ee8cc1Swenshuai.xi #endif
8465*53ee8cc1Swenshuai.xi         {
8466*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("%s:Decode timeout.....!!!!\n", __FUNCTION__);
8467*53ee8cc1Swenshuai.xi             _JPD_IsDecoding = FALSE;
8468*53ee8cc1Swenshuai.xi             return E_JPEG_DEC_FAILED;
8469*53ee8cc1Swenshuai.xi         }
8470*53ee8cc1Swenshuai.xi         else
8471*53ee8cc1Swenshuai.xi         {
8472*53ee8cc1Swenshuai.xi             return E_JPEG_DEC_DECODING;
8473*53ee8cc1Swenshuai.xi         }
8474*53ee8cc1Swenshuai.xi     }
8475*53ee8cc1Swenshuai.xi 
8476*53ee8cc1Swenshuai.xi     reg_val = MDrv_JPD_GetEventFlag();
8477*53ee8cc1Swenshuai.xi 
8478*53ee8cc1Swenshuai.xi     if(E_JPD_EVENT_DEC_DONE & reg_val)
8479*53ee8cc1Swenshuai.xi     {
8480*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s:Decode Done!!\n", __FUNCTION__);
8481*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
8482*53ee8cc1Swenshuai.xi         u32MeasureDecodeTimeHW = MsOS_GetSystemTime()-u32MeasureDecodeTime;
8483*53ee8cc1Swenshuai.xi         printf_red("SW decode header:[%ld]ms, HW decode: [%ld]ms\n", u32MeasureDecodeTimeSW, u32MeasureDecodeTimeHW);
8484*53ee8cc1Swenshuai.xi #endif
8485*53ee8cc1Swenshuai.xi         if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API)
8486*53ee8cc1Swenshuai.xi         {
8487*53ee8cc1Swenshuai.xi             verJPD_CRC32_Init();
8488*53ee8cc1Swenshuai.xi             verJPD_CRC32_Update((MS_U8 *)MWC_BUFFER_ADDR,
8489*53ee8cc1Swenshuai.xi                 (MS_U32)MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2);
8490*53ee8cc1Swenshuai.xi             printf_red("[%dx%d], u32CRCResult=0x%lx\n",MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), verJPD_CRC32_GetResult());
8491*53ee8cc1Swenshuai.xi         }
8492*53ee8cc1Swenshuai.xi 
8493*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
8494*53ee8cc1Swenshuai.xi             if(MApi_JPEG_GetWidth() <=JPEG_MAX_WIDTH
8495*53ee8cc1Swenshuai.xi                 && MApi_JPEG_GetHeight() <=JPEG_MAX_HEIGHT)
8496*53ee8cc1Swenshuai.xi             {
8497*53ee8cc1Swenshuai.xi                 MS_U32 u32Size;
8498*53ee8cc1Swenshuai.xi                 u32Size = MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2;
8499*53ee8cc1Swenshuai.xi                 printf("[%dx%d], MWC_BUFFER_ADDR=0x%lx, size=0x%lx", MApi_JPEG_GetWidth(),
8500*53ee8cc1Swenshuai.xi                     MApi_JPEG_GetHeight(), MS_VA2PA(MWC_BUFFER_ADDR),u32Size);
8501*53ee8cc1Swenshuai.xi                 _PrintOutputMem(MWC_BUFFER_ADDR, u32Size);
8502*53ee8cc1Swenshuai.xi             }
8503*53ee8cc1Swenshuai.xi #endif
8504*53ee8cc1Swenshuai.xi         _JPD_IsDecoding = FALSE;
8505*53ee8cc1Swenshuai.xi         return E_JPEG_DEC_DONE;
8506*53ee8cc1Swenshuai.xi     }
8507*53ee8cc1Swenshuai.xi     else if(E_JPD_EVENT_RST_ERROR & reg_val)
8508*53ee8cc1Swenshuai.xi     {
8509*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("%s:RST Error!!\n", __FUNCTION__);
8510*53ee8cc1Swenshuai.xi         _JPD_IsDecoding = FALSE;
8511*53ee8cc1Swenshuai.xi         return E_JPEG_DEC_RST_ERROR;
8512*53ee8cc1Swenshuai.xi     }
8513*53ee8cc1Swenshuai.xi     else if((E_JPD_EVENT_ECS_ERROR & reg_val)
8514*53ee8cc1Swenshuai.xi         || (E_JPD_EVENT_IS_ERROR & reg_val))
8515*53ee8cc1Swenshuai.xi     {
8516*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("%s:Bitstream Error, reg_val = 0x%02x!!\n", __FUNCTION__ , reg_val);
8517*53ee8cc1Swenshuai.xi         _JPD_IsDecoding = FALSE;
8518*53ee8cc1Swenshuai.xi         return E_JPEG_DEC_BITSTREAM_ERROR;
8519*53ee8cc1Swenshuai.xi     }
8520*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_AUTO_PROTECT==true)
8521*53ee8cc1Swenshuai.xi     else if(E_JPD_EVENT_MWB_FULL & reg_val)
8522*53ee8cc1Swenshuai.xi     {
8523*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("[%s]MWB is full!!\n", __FUNCTION__);
8524*53ee8cc1Swenshuai.xi         _JPD_IsDecoding = FALSE;
8525*53ee8cc1Swenshuai.xi         return E_JPEG_DEC_FAILED;
8526*53ee8cc1Swenshuai.xi     }
8527*53ee8cc1Swenshuai.xi #endif
8528*53ee8cc1Swenshuai.xi     else if((E_JPD_EVENT_MRBL_DONE & reg_val)
8529*53ee8cc1Swenshuai.xi     && (E_JPEG_BUFFER_LOW != u8PreLHFlag))
8530*53ee8cc1Swenshuai.xi     {
8531*53ee8cc1Swenshuai.xi         u8PreLHFlag = E_JPEG_BUFFER_LOW;
8532*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("[%s]MRBL done!!\n", __FUNCTION__);
8533*53ee8cc1Swenshuai.xi         return E_JPEG_DEC_MRBL_DONE;
8534*53ee8cc1Swenshuai.xi     }
8535*53ee8cc1Swenshuai.xi     else if((E_JPD_EVENT_MRBH_DONE & reg_val)
8536*53ee8cc1Swenshuai.xi     && (E_JPEG_BUFFER_HIGH != u8PreLHFlag))
8537*53ee8cc1Swenshuai.xi     {
8538*53ee8cc1Swenshuai.xi         u8PreLHFlag = E_JPEG_BUFFER_HIGH;
8539*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("[%s]MRBH done!!\n", __FUNCTION__);
8540*53ee8cc1Swenshuai.xi         return E_JPEG_DEC_MRBH_DONE;
8541*53ee8cc1Swenshuai.xi     }
8542*53ee8cc1Swenshuai.xi #endif
8543*53ee8cc1Swenshuai.xi     return E_JPEG_DEC_DECODING;
8544*53ee8cc1Swenshuai.xi }
8545*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8546*53ee8cc1Swenshuai.xi /********************************************************************/
8547*53ee8cc1Swenshuai.xi /// Get datetime info of JPEG EXIF
8548*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8549*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8550*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8551*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime * DateTime)8552*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime *DateTime)
8553*53ee8cc1Swenshuai.xi {
8554*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8555*53ee8cc1Swenshuai.xi     {
8556*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8557*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8558*53ee8cc1Swenshuai.xi     }
8559*53ee8cc1Swenshuai.xi 
8560*53ee8cc1Swenshuai.xi     DateTime->bHasDataTime = _stEXIF_DateTime.bHasDataTime;
8561*53ee8cc1Swenshuai.xi     DateTime->u32Year = _stEXIF_DateTime.u32Year;
8562*53ee8cc1Swenshuai.xi     DateTime->u32Month = _stEXIF_DateTime.u32Month;
8563*53ee8cc1Swenshuai.xi     DateTime->u32Day = _stEXIF_DateTime.u32Day;
8564*53ee8cc1Swenshuai.xi     DateTime->u32Hour = _stEXIF_DateTime.u32Hour;
8565*53ee8cc1Swenshuai.xi     DateTime->u32Minute = _stEXIF_DateTime.u32Minute;
8566*53ee8cc1Swenshuai.xi     DateTime->u32Second = _stEXIF_DateTime.u32Second;
8567*53ee8cc1Swenshuai.xi 
8568*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime======= Exist = %d \n", _stEXIF_DateTime.bHasDataTime);
8569*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
8570*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
8571*53ee8cc1Swenshuai.xi 
8572*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8573*53ee8cc1Swenshuai.xi }
8574*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8575*53ee8cc1Swenshuai.xi /********************************************************************/
8576*53ee8cc1Swenshuai.xi /// Get orientation info of JPEG EXIF
8577*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8578*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8579*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8580*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation * eOrientation)8581*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation *eOrientation)
8582*53ee8cc1Swenshuai.xi {
8583*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8584*53ee8cc1Swenshuai.xi     {
8585*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8586*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8587*53ee8cc1Swenshuai.xi     }
8588*53ee8cc1Swenshuai.xi     *eOrientation = _eEXIF_Orientation;
8589*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", _eEXIF_Orientation);
8590*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8591*53ee8cc1Swenshuai.xi }
8592*53ee8cc1Swenshuai.xi 
8593*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
_MApi_JPEG_GetEXIFManufacturer(MS_U8 * pu8Manufacturer,MS_U8 u8size)8594*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFManufacturer(MS_U8 *pu8Manufacturer, MS_U8 u8size)
8595*53ee8cc1Swenshuai.xi {
8596*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8597*53ee8cc1Swenshuai.xi     {
8598*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8599*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8600*53ee8cc1Swenshuai.xi     }
8601*53ee8cc1Swenshuai.xi     MS_U8 u8i=0;
8602*53ee8cc1Swenshuai.xi     JPEG_memset((void*)(pu8Manufacturer), 0, u8size);
8603*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG EXIF Manufacturer =");
8604*53ee8cc1Swenshuai.xi     while(_u8EXIF_Manufacturer[u8i] && u8i<JPEG_MANUFACTURER_SIZE)
8605*53ee8cc1Swenshuai.xi     {
8606*53ee8cc1Swenshuai.xi         *(pu8Manufacturer+u8i) =_u8EXIF_Manufacturer[u8i];
8607*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%c", *(pu8Manufacturer+u8i));
8608*53ee8cc1Swenshuai.xi         u8i++;
8609*53ee8cc1Swenshuai.xi         if(u8i>=u8size)
8610*53ee8cc1Swenshuai.xi         {
8611*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("%s: NOT enough space!!\n", __FUNCTION__);
8612*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
8613*53ee8cc1Swenshuai.xi         }
8614*53ee8cc1Swenshuai.xi     }
8615*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("\n");
8616*53ee8cc1Swenshuai.xi //    JPEG_DEBUG_API_MSG("JPEG EXIF Manufacturer = %02x %02x %02x %02x %02x %02x %02x %02x\n",
8617*53ee8cc1Swenshuai.xi //        *pu8Manufacturer, *(pu8Manufacturer+1), *(pu8Manufacturer+2), *(pu8Manufacturer+3),
8618*53ee8cc1Swenshuai.xi //        *(pu8Manufacturer+4),*(pu8Manufacturer+5),*(pu8Manufacturer+6),*(pu8Manufacturer+7));
8619*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8620*53ee8cc1Swenshuai.xi }
8621*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetEXIFModel(MS_U8 * pu8Model,MS_U8 u8size)8622*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFModel(MS_U8 *pu8Model, MS_U8 u8size)
8623*53ee8cc1Swenshuai.xi {
8624*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8625*53ee8cc1Swenshuai.xi     {
8626*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8627*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8628*53ee8cc1Swenshuai.xi     }
8629*53ee8cc1Swenshuai.xi     MS_U8 u8i=0;
8630*53ee8cc1Swenshuai.xi     JPEG_memset((void*)(pu8Model), 0, u8size);
8631*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG EXIF Model =");
8632*53ee8cc1Swenshuai.xi     while(_u8EXIF_Model[u8i] && u8i<JPEG_MODEL_SIZE)
8633*53ee8cc1Swenshuai.xi     {
8634*53ee8cc1Swenshuai.xi         *(pu8Model+u8i) =_u8EXIF_Model[u8i];
8635*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%c", *(pu8Model+u8i));
8636*53ee8cc1Swenshuai.xi         u8i++;
8637*53ee8cc1Swenshuai.xi         if(u8i>=u8size)
8638*53ee8cc1Swenshuai.xi         {
8639*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("%s: NOT enough space!!\n", __FUNCTION__);
8640*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
8641*53ee8cc1Swenshuai.xi         }
8642*53ee8cc1Swenshuai.xi     }
8643*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("\n");
8644*53ee8cc1Swenshuai.xi 
8645*53ee8cc1Swenshuai.xi //    JPEG_DEBUG_API_MSG("JPEG EXIF Model = %02x %02x %02x %02x %02x %02x %02x %02x\n",
8646*53ee8cc1Swenshuai.xi //        *pu8Model, *(pu8Model+1), *(pu8Model+2), *(pu8Model+3),
8647*53ee8cc1Swenshuai.xi //        *(pu8Model+4),*(pu8Model+5),*(pu8Model+6),*(pu8Model+7));
8648*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8649*53ee8cc1Swenshuai.xi }
8650*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetEXIFFlash(MS_U16 * pu16Flash)8651*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFFlash(MS_U16 *pu16Flash)
8652*53ee8cc1Swenshuai.xi {
8653*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8654*53ee8cc1Swenshuai.xi     {
8655*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8656*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8657*53ee8cc1Swenshuai.xi     }
8658*53ee8cc1Swenshuai.xi     *pu16Flash = _u16EXIF_Flash;
8659*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG EXIF Flash = %d \n", *pu16Flash);
8660*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8661*53ee8cc1Swenshuai.xi }
8662*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 * pu32ISOSpeedRatings)8663*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 *pu32ISOSpeedRatings)
8664*53ee8cc1Swenshuai.xi {
8665*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8666*53ee8cc1Swenshuai.xi     {
8667*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8668*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8669*53ee8cc1Swenshuai.xi     }
8670*53ee8cc1Swenshuai.xi     *pu32ISOSpeedRatings = _u32EXIF_ISOSpeedRatings;
8671*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG EXIF ISO = %ld \n", *pu32ISOSpeedRatings);
8672*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8673*53ee8cc1Swenshuai.xi }
8674*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL * pShutterSpeedValue)8675*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL *pShutterSpeedValue)
8676*53ee8cc1Swenshuai.xi {
8677*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8678*53ee8cc1Swenshuai.xi     {
8679*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8680*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8681*53ee8cc1Swenshuai.xi     }
8682*53ee8cc1Swenshuai.xi     pShutterSpeedValue->numerator = _stEXIF_ShutterSpeedValue.numerator;
8683*53ee8cc1Swenshuai.xi     pShutterSpeedValue->denominator= _stEXIF_ShutterSpeedValue.denominator;
8684*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("ShutterSpeedValue numerator=%ld, denominator=%ld\n", pShutterSpeedValue->numerator, pShutterSpeedValue->denominator);
8685*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8686*53ee8cc1Swenshuai.xi }
8687*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL * pApertureValue)8688*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL *pApertureValue)
8689*53ee8cc1Swenshuai.xi {
8690*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8691*53ee8cc1Swenshuai.xi     {
8692*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8693*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8694*53ee8cc1Swenshuai.xi     }
8695*53ee8cc1Swenshuai.xi     pApertureValue->s_numerator = _stEXIF_ApertureValue.s_numerator;
8696*53ee8cc1Swenshuai.xi     pApertureValue->s_denominator= _stEXIF_ApertureValue.s_denominator;
8697*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("ApertureValue numerator=%ld, denominator=%ld\n", pApertureValue->s_numerator, pApertureValue->s_denominator);
8698*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8699*53ee8cc1Swenshuai.xi }
8700*53ee8cc1Swenshuai.xi 
8701*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL * pExposureBiasValue)8702*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL *pExposureBiasValue)
8703*53ee8cc1Swenshuai.xi {
8704*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8705*53ee8cc1Swenshuai.xi     {
8706*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8707*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8708*53ee8cc1Swenshuai.xi     }
8709*53ee8cc1Swenshuai.xi     pExposureBiasValue->numerator = _stEXIF_ExposureBiasValue.numerator;
8710*53ee8cc1Swenshuai.xi     pExposureBiasValue->denominator= _stEXIF_ExposureBiasValue.denominator;
8711*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("ExposureBiasValue numerator=%ld, denominator=%ld\n", pExposureBiasValue->numerator, pExposureBiasValue->denominator);
8712*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8713*53ee8cc1Swenshuai.xi }
8714*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL * pFocalLength)8715*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL *pFocalLength)
8716*53ee8cc1Swenshuai.xi {
8717*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8718*53ee8cc1Swenshuai.xi     {
8719*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8720*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8721*53ee8cc1Swenshuai.xi     }
8722*53ee8cc1Swenshuai.xi     pFocalLength->s_numerator = _stEXIF_FocalLength.s_numerator;
8723*53ee8cc1Swenshuai.xi     pFocalLength->s_denominator= _stEXIF_FocalLength.s_denominator;
8724*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("FocalLength numerator=%ld, denominator=%ld\n", pFocalLength->s_numerator, pFocalLength->s_denominator);
8725*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8726*53ee8cc1Swenshuai.xi }
_MApi_JPEG_GetEXIFImageWidth(MS_U32 * pu32ImageWidth)8727*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFImageWidth(MS_U32 *pu32ImageWidth)
8728*53ee8cc1Swenshuai.xi {
8729*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8730*53ee8cc1Swenshuai.xi     {
8731*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8732*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8733*53ee8cc1Swenshuai.xi     }
8734*53ee8cc1Swenshuai.xi     *pu32ImageWidth = _u32EXIF_ImageWidth;
8735*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG EXIF Image Width = %ld \n", *pu32ImageWidth);
8736*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8737*53ee8cc1Swenshuai.xi }
8738*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetEXIFImageHeight(MS_U32 * pu32ImageHeight)8739*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFImageHeight(MS_U32 *pu32ImageHeight)
8740*53ee8cc1Swenshuai.xi {
8741*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8742*53ee8cc1Swenshuai.xi     {
8743*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8744*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8745*53ee8cc1Swenshuai.xi     }
8746*53ee8cc1Swenshuai.xi     *pu32ImageHeight = _u32EXIF_ImageHeight;
8747*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("JPEG EXIF Image Height = %ld \n", *pu32ImageHeight);
8748*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8749*53ee8cc1Swenshuai.xi }
_MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL * pExposureTime)8750*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL *pExposureTime)
8751*53ee8cc1Swenshuai.xi {
8752*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8753*53ee8cc1Swenshuai.xi     {
8754*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8755*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8756*53ee8cc1Swenshuai.xi     }
8757*53ee8cc1Swenshuai.xi     pExposureTime->s_numerator = _stEXIF_ExposureTime.s_numerator;
8758*53ee8cc1Swenshuai.xi     pExposureTime->s_denominator= _stEXIF_ExposureTime.s_denominator;
8759*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("ExposureTime numerator=%ld, denominator=%ld\n", pExposureTime->s_numerator, pExposureTime->s_denominator);
8760*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8761*53ee8cc1Swenshuai.xi }
8762*53ee8cc1Swenshuai.xi 
8763*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL * pFNumber)8764*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL *pFNumber)
8765*53ee8cc1Swenshuai.xi {
8766*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8767*53ee8cc1Swenshuai.xi     {
8768*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8769*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8770*53ee8cc1Swenshuai.xi     }
8771*53ee8cc1Swenshuai.xi     pFNumber->s_numerator = _stEXIF_FNumber.s_numerator;
8772*53ee8cc1Swenshuai.xi     pFNumber->s_denominator= _stEXIF_FNumber.s_denominator;
8773*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("FNumber numerator=%ld, denominator=%ld\n", pFNumber->s_numerator, pFNumber->s_denominator);
8774*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
8775*53ee8cc1Swenshuai.xi }
8776*53ee8cc1Swenshuai.xi #endif
8777*53ee8cc1Swenshuai.xi 
8778*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID,MS_U32 * param,MS_U32 u32size)8779*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID, MS_U32 *param, MS_U32 u32size)
8780*53ee8cc1Swenshuai.xi {
8781*53ee8cc1Swenshuai.xi     JPEG_Result eResult = E_JPEG_OKAY;
8782*53ee8cc1Swenshuai.xi 
8783*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
8784*53ee8cc1Swenshuai.xi     {
8785*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8786*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
8787*53ee8cc1Swenshuai.xi     }
8788*53ee8cc1Swenshuai.xi 
8789*53ee8cc1Swenshuai.xi     switch(eGetID)
8790*53ee8cc1Swenshuai.xi     {
8791*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_MANUFACTURER:
8792*53ee8cc1Swenshuai.xi             eResult = MApi_JPEG_GetEXIFManufacturer((MS_U8 *)param, u32size*4);
8793*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@JPEG EXIF Manufacturer = %c%c%c%c%c%c%c%c%c%c%c%c\n",
8794*53ee8cc1Swenshuai.xi                 *((MS_U8 *)param), *((MS_U8 *)param+1), *((MS_U8 *)param+2), *((MS_U8 *)param+3),
8795*53ee8cc1Swenshuai.xi                 *((MS_U8 *)param+4),*((MS_U8 *)param+5),*((MS_U8 *)param+6),*((MS_U8 *)param+7),
8796*53ee8cc1Swenshuai.xi                 *((MS_U8 *)param+8),*((MS_U8 *)param+9),*((MS_U8 *)param+10),*((MS_U8 *)param+11)
8797*53ee8cc1Swenshuai.xi                 );
8798*53ee8cc1Swenshuai.xi             break;
8799*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_MODEL:
8800*53ee8cc1Swenshuai.xi             eResult = MApi_JPEG_GetEXIFModel((MS_U8 *)param, u32size*4);
8801*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@JPEG EXIF Model = %c%c%c%c%c%c%c%c%c%c%c%c\n",
8802*53ee8cc1Swenshuai.xi                 *((MS_U8 *)param), *((MS_U8 *)param+1), *((MS_U8 *)param+2), *((MS_U8 *)param+3),
8803*53ee8cc1Swenshuai.xi                 *((MS_U8 *)param+4),*((MS_U8 *)param+5),*((MS_U8 *)param+6),*((MS_U8 *)param+7),
8804*53ee8cc1Swenshuai.xi                 *((MS_U8 *)param+8),*((MS_U8 *)param+9),*((MS_U8 *)param+10),*((MS_U8 *)param+11)
8805*53ee8cc1Swenshuai.xi                 );
8806*53ee8cc1Swenshuai.xi             break;
8807*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_FLASH:
8808*53ee8cc1Swenshuai.xi             *param = (MS_U32)_u16EXIF_Flash;
8809*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@JPEG EXIF Flash = %ld \n", *param);
8810*53ee8cc1Swenshuai.xi             break;
8811*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_ISO_SPEED_RATINGS:
8812*53ee8cc1Swenshuai.xi             *param = _u32EXIF_ISOSpeedRatings;
8813*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@JPEG EXIF ISO = %ld \n", *param);
8814*53ee8cc1Swenshuai.xi             break;
8815*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_SHUTTER_SPEED_VALUE:
8816*53ee8cc1Swenshuai.xi             if(u32size<2)
8817*53ee8cc1Swenshuai.xi             {
8818*53ee8cc1Swenshuai.xi                 eResult = E_JPEG_FAILED;
8819*53ee8cc1Swenshuai.xi             }
8820*53ee8cc1Swenshuai.xi             *param = _stEXIF_ShutterSpeedValue.numerator;
8821*53ee8cc1Swenshuai.xi             *(param+1) = _stEXIF_ShutterSpeedValue.denominator;
8822*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@ShutterSpeedValue numerator=%ld, denominator=%ld\n", *param, *(param+1));
8823*53ee8cc1Swenshuai.xi             break;
8824*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_APERTURE_VALUE:
8825*53ee8cc1Swenshuai.xi             if(u32size<2)
8826*53ee8cc1Swenshuai.xi             {
8827*53ee8cc1Swenshuai.xi                 eResult = E_JPEG_FAILED;
8828*53ee8cc1Swenshuai.xi             }
8829*53ee8cc1Swenshuai.xi             *param = (MS_U32)_stEXIF_ApertureValue.s_numerator;
8830*53ee8cc1Swenshuai.xi             *(param+1) = (MS_U32)_stEXIF_ApertureValue.s_denominator;
8831*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@ApertureValue numerator=%ld, denominator=%ld\n", *param, *(param+1));
8832*53ee8cc1Swenshuai.xi             break;
8833*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_EXPOSURE_BIAS_VALUE:
8834*53ee8cc1Swenshuai.xi             if(u32size<2)
8835*53ee8cc1Swenshuai.xi             {
8836*53ee8cc1Swenshuai.xi                 eResult = E_JPEG_FAILED;
8837*53ee8cc1Swenshuai.xi             }
8838*53ee8cc1Swenshuai.xi             *param = _stEXIF_ExposureBiasValue.numerator;
8839*53ee8cc1Swenshuai.xi             *(param+1) = _stEXIF_ExposureBiasValue.denominator;
8840*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@ExposureBiasValue numerator=%ld, denominator=%ld\n", *param, *(param+1));
8841*53ee8cc1Swenshuai.xi             break;
8842*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_FOCAL_LENGTH:
8843*53ee8cc1Swenshuai.xi             if(u32size<2)
8844*53ee8cc1Swenshuai.xi             {
8845*53ee8cc1Swenshuai.xi                 eResult = E_JPEG_FAILED;
8846*53ee8cc1Swenshuai.xi             }
8847*53ee8cc1Swenshuai.xi             *param = (MS_U32)_stEXIF_FocalLength.s_numerator;
8848*53ee8cc1Swenshuai.xi             *(param+1) = (MS_U32)_stEXIF_FocalLength.s_denominator;
8849*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@FocalLength numerator=%ld, denominator=%ld\n", *param, *(param+1));
8850*53ee8cc1Swenshuai.xi             break;
8851*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_IMAGE_WIDTH:
8852*53ee8cc1Swenshuai.xi             *param = _u32EXIF_ImageWidth;
8853*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@JPEG EXIF Image Width = %ld \n", *param);
8854*53ee8cc1Swenshuai.xi             break;
8855*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_IMAGE_HEIGHT:
8856*53ee8cc1Swenshuai.xi             *param = _u32EXIF_ImageHeight;
8857*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@JPEG EXIF Image Height = %ld \n", *param);
8858*53ee8cc1Swenshuai.xi             break;
8859*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_EXPOSURE_TIME:
8860*53ee8cc1Swenshuai.xi             if(u32size<2)
8861*53ee8cc1Swenshuai.xi             {
8862*53ee8cc1Swenshuai.xi                 eResult = E_JPEG_FAILED;
8863*53ee8cc1Swenshuai.xi             }
8864*53ee8cc1Swenshuai.xi             *param = (MS_U32)_stEXIF_ExposureTime.s_numerator;
8865*53ee8cc1Swenshuai.xi             *(param+1) = (MS_U32)_stEXIF_ExposureTime.s_denominator;
8866*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@ExposureTime numerator=%ld, denominator=%ld\n", *param, *(param+1));
8867*53ee8cc1Swenshuai.xi             break;
8868*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_F_NUMBER:
8869*53ee8cc1Swenshuai.xi             if(u32size<2)
8870*53ee8cc1Swenshuai.xi             {
8871*53ee8cc1Swenshuai.xi                 eResult = E_JPEG_FAILED;
8872*53ee8cc1Swenshuai.xi             }
8873*53ee8cc1Swenshuai.xi             *param = (MS_U32)_stEXIF_FNumber.s_numerator;
8874*53ee8cc1Swenshuai.xi             *(param+1) = (MS_U32)_stEXIF_FNumber.s_denominator;
8875*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@FNumber numerator=%ld, denominator=%ld\n", *param, *(param+1));
8876*53ee8cc1Swenshuai.xi             break;
8877*53ee8cc1Swenshuai.xi         case E_JPEG_GET_EXIF_EXPOSURE_PROGRAM:
8878*53ee8cc1Swenshuai.xi             *param = (MS_U32)_u16EXIF_Exposureprogram;
8879*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_MSG("@JPEG EXIF Exposure Program = %ld \n", *param);
8880*53ee8cc1Swenshuai.xi             break;
8881*53ee8cc1Swenshuai.xi         default:
8882*53ee8cc1Swenshuai.xi             eResult = E_JPEG_FAILED;
8883*53ee8cc1Swenshuai.xi             break;
8884*53ee8cc1Swenshuai.xi     }
8885*53ee8cc1Swenshuai.xi     return eResult;
8886*53ee8cc1Swenshuai.xi }
8887*53ee8cc1Swenshuai.xi 
8888*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////
8889*53ee8cc1Swenshuai.xi ///   current unused function, maybe removed in new MDDI
8890*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////
8891*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI
8892*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8893*53ee8cc1Swenshuai.xi void msAPI_MJPEG_Parse_SOF(void)
8894*53ee8cc1Swenshuai.xi {
8895*53ee8cc1Swenshuai.xi     JPEG_locate_sof_marker();
8896*53ee8cc1Swenshuai.xi }
8897*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8898*53ee8cc1Swenshuai.xi void msAPI_MJPEG_constructor( PJPEG_FILE_FileSystem_t Pstream, MS_U8 decode_type)
8899*53ee8cc1Swenshuai.xi {
8900*53ee8cc1Swenshuai.xi     _u8DecodeType = decode_type;
8901*53ee8cc1Swenshuai.xi     JPEG_init_thumbnail();
8902*53ee8cc1Swenshuai.xi     msAPI_MJPEG_decode_init( Pstream);
8903*53ee8cc1Swenshuai.xi }
8904*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8905*53ee8cc1Swenshuai.xi //Set Total pics in the file
8906*53ee8cc1Swenshuai.xi void msAPI_MJPEG_SetTotal_Pics(MS_U32 *DecodeTime)
8907*53ee8cc1Swenshuai.xi {
8908*53ee8cc1Swenshuai.xi     *DecodeTime = NumPics;
8909*53ee8cc1Swenshuai.xi }
8910*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8911*53ee8cc1Swenshuai.xi MS_S16 msAPI_JPEG_Check_End_Flag( void )
8912*53ee8cc1Swenshuai.xi {
8913*53ee8cc1Swenshuai.xi     return ( _bEOF_flag );
8914*53ee8cc1Swenshuai.xi }
8915*53ee8cc1Swenshuai.xi 
8916*53ee8cc1Swenshuai.xi #ifndef CMODEL
8917*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8918*53ee8cc1Swenshuai.xi /******************************************************************************/
8919*53ee8cc1Swenshuai.xi ///Set downscale ratio
8920*53ee8cc1Swenshuai.xi ///@param ratio \b OUT scale ratio
8921*53ee8cc1Swenshuai.xi /******************************************************************************/
8922*53ee8cc1Swenshuai.xi void msAPI_JPEG_SetDownScaleRatio(JPEG_DownScaleRatio ratio)
8923*53ee8cc1Swenshuai.xi {
8924*53ee8cc1Swenshuai.xi     switch(ratio)
8925*53ee8cc1Swenshuai.xi     {
8926*53ee8cc1Swenshuai.xi     case E_RATIO_HALF:
8927*53ee8cc1Swenshuai.xi         _u8DownScaleRatio = E_JPD_DOWNSCALE_HALF;
8928*53ee8cc1Swenshuai.xi         break;
8929*53ee8cc1Swenshuai.xi     case E_RATIO_FOURTH:
8930*53ee8cc1Swenshuai.xi         _u8DownScaleRatio = E_JPD_DOWNSCALE_FOURTH;
8931*53ee8cc1Swenshuai.xi         break;
8932*53ee8cc1Swenshuai.xi     case E_RATIO_EIGHTH:
8933*53ee8cc1Swenshuai.xi         _u8DownScaleRatio = E_JPD_DOWNSCALE_EIGHTH;
8934*53ee8cc1Swenshuai.xi         break;
8935*53ee8cc1Swenshuai.xi     default:
8936*53ee8cc1Swenshuai.xi         _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
8937*53ee8cc1Swenshuai.xi         break;
8938*53ee8cc1Swenshuai.xi     }
8939*53ee8cc1Swenshuai.xi }
8940*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8941*53ee8cc1Swenshuai.xi void msAPI_JPEG_GetOutputDimension(MS_U16 *width, MS_U16 *height)
8942*53ee8cc1Swenshuai.xi {
8943*53ee8cc1Swenshuai.xi     MS_U8 mcu_width, mcu_height;
8944*53ee8cc1Swenshuai.xi     MS_U16 pic_width = _u16Image_x_size;
8945*53ee8cc1Swenshuai.xi     MS_U16 pic_height = _u16Image_y_size;
8946*53ee8cc1Swenshuai.xi     MS_U8 Y_VSF = _u8Comp_v_samp[0];
8947*53ee8cc1Swenshuai.xi     MS_U8 Y_HSF = _u8Comp_h_samp[0];
8948*53ee8cc1Swenshuai.xi     MS_U16 ROI_width;
8949*53ee8cc1Swenshuai.xi 
8950*53ee8cc1Swenshuai.xi     if ( ( mcu_width = pic_width % ( Y_HSF * 8 ) ) )
8951*53ee8cc1Swenshuai.xi     {
8952*53ee8cc1Swenshuai.xi         pic_width += ( Y_HSF * 8 - mcu_width );
8953*53ee8cc1Swenshuai.xi     }
8954*53ee8cc1Swenshuai.xi 
8955*53ee8cc1Swenshuai.xi     if ( ( mcu_height = pic_height% ( Y_VSF * 8 ) ) )
8956*53ee8cc1Swenshuai.xi     {
8957*53ee8cc1Swenshuai.xi         pic_height += ( Y_VSF * 8 - mcu_height );
8958*53ee8cc1Swenshuai.xi     }
8959*53ee8cc1Swenshuai.xi 
8960*53ee8cc1Swenshuai.xi     ROI_width = pic_width;
8961*53ee8cc1Swenshuai.xi 
8962*53ee8cc1Swenshuai.xi     if(_u8DownScaleRatio==E_JPD_DOWNSCALE_FOURTH||_u8DownScaleRatio==E_JPD_DOWNSCALE_EIGHTH)
8963*53ee8cc1Swenshuai.xi     {
8964*53ee8cc1Swenshuai.xi         MS_U16 ROI_width;
8965*53ee8cc1Swenshuai.xi 
8966*53ee8cc1Swenshuai.xi         if(_u8DownScaleRatio==E_JPD_DOWNSCALE_FOURTH)
8967*53ee8cc1Swenshuai.xi         {
8968*53ee8cc1Swenshuai.xi             // width must be multiple of 32
8969*53ee8cc1Swenshuai.xi             ROI_width = (pic_width/32)*32;
8970*53ee8cc1Swenshuai.xi         }
8971*53ee8cc1Swenshuai.xi         else if(_u8DownScaleRatio==E_JPD_DOWNSCALE_EIGHTH)
8972*53ee8cc1Swenshuai.xi         {
8973*53ee8cc1Swenshuai.xi             // width must be multiple of 64
8974*53ee8cc1Swenshuai.xi             ROI_width = (pic_width/64)*64;
8975*53ee8cc1Swenshuai.xi         }
8976*53ee8cc1Swenshuai.xi     }
8977*53ee8cc1Swenshuai.xi 
8978*53ee8cc1Swenshuai.xi     switch(_u8DownScaleRatio)
8979*53ee8cc1Swenshuai.xi     {
8980*53ee8cc1Swenshuai.xi         case E_JPD_DOWNSCALE_HALF:
8981*53ee8cc1Swenshuai.xi             *width = ROI_width/2;
8982*53ee8cc1Swenshuai.xi             break;
8983*53ee8cc1Swenshuai.xi 
8984*53ee8cc1Swenshuai.xi         case E_JPD_DOWNSCALE_FOURTH:
8985*53ee8cc1Swenshuai.xi             *width = ROI_width/4;
8986*53ee8cc1Swenshuai.xi             break;
8987*53ee8cc1Swenshuai.xi 
8988*53ee8cc1Swenshuai.xi         case E_JPD_DOWNSCALE_EIGHTH:
8989*53ee8cc1Swenshuai.xi             *width = ROI_width/8;
8990*53ee8cc1Swenshuai.xi             break;
8991*53ee8cc1Swenshuai.xi 
8992*53ee8cc1Swenshuai.xi         default:
8993*53ee8cc1Swenshuai.xi             *width = ROI_width;
8994*53ee8cc1Swenshuai.xi             break;
8995*53ee8cc1Swenshuai.xi     }
8996*53ee8cc1Swenshuai.xi 
8997*53ee8cc1Swenshuai.xi     *height = pic_height;
8998*53ee8cc1Swenshuai.xi }
8999*53ee8cc1Swenshuai.xi #endif
9000*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9001*53ee8cc1Swenshuai.xi MS_BOOL msAPI_MJPEG_SetInitParameter(MS_U32 u32RBufAddr, MS_U32 u32RBufSize, MS_U32 u32WBufAddr, MS_U32 u32IBufAddr, MS_U32 u32IBufSize)
9002*53ee8cc1Swenshuai.xi {
9003*53ee8cc1Swenshuai.xi     // the buffer size must be multiple of 4 bytes
9004*53ee8cc1Swenshuai.xi     //if((u32RBufSize%4)!=0)
9005*53ee8cc1Swenshuai.xi      //   return FALSE;
9006*53ee8cc1Swenshuai.xi     MS_U32 WBuffer = _u16Image_x_size*_u16Image_y_size*2;
9007*53ee8cc1Swenshuai.xi #ifdef CMODEL
9008*53ee8cc1Swenshuai.xi     _bReady_flag = FALSE;
9009*53ee8cc1Swenshuai.xi #endif
9010*53ee8cc1Swenshuai.xi     MRC_BUFFER_ADDR = _u32ReadBufferAddr + u32RBufAddr;
9011*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("MRC_BUFFER_ADDR = %08lx\n",MRC_BUFFER_ADDR);
9012*53ee8cc1Swenshuai.xi     //MRC_BUFFER_SIZE = _pu8In_buf + u32RBufSize;
9013*53ee8cc1Swenshuai.xi    // JPEG_DEBUG_API_MSG("_u32WriteBufferAddr = %08X\n",_u32WriteBufferAddr);
9014*53ee8cc1Swenshuai.xi    // JPEG_DEBUG_API_MSG("WBuffer = %08X\n",WBuffer);
9015*53ee8cc1Swenshuai.xi     MWC_BUFFER_ADDR = _u32WriteBufferAddr + WBuffer;
9016*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("MWC_BUFFER_ADDR = %08lx\n",MWC_BUFFER_ADDR);
9017*53ee8cc1Swenshuai.xi     //JPEG_DEBUG_API_MSG("MWC_BUFFER_ADDR = %08X\n",MWC_BUFFER_ADDR);
9018*53ee8cc1Swenshuai.xi     //INTERNAL_BUFFER_ADDR = u32IBufAddr;
9019*53ee8cc1Swenshuai.xi     //INTERNAL_BUFFER_SIZE = u32IBufSize;
9020*53ee8cc1Swenshuai.xi     //_u32In_buf_left = 0;
9021*53ee8cc1Swenshuai.xi     _pu8In_buf = (MS_U8 *) (_u32ReadBufferAddr);
9022*53ee8cc1Swenshuai.xi     _u32Total_bytes_read -= u32RBufAddr;
9023*53ee8cc1Swenshuai.xi     //JPEG_MEMORY_init_mempool(((MS_U8 *) (u32IBufAddr + JPEG_DEFAULT_EXIF_SIZE)), u32IBufSize - JPEG_DEFAULT_EXIF_SIZE);
9024*53ee8cc1Swenshuai.xi     //JPEG_locate_sof_marker();
9025*53ee8cc1Swenshuai.xi 
9026*53ee8cc1Swenshuai.xi     return TRUE;
9027*53ee8cc1Swenshuai.xi }
9028*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9029*53ee8cc1Swenshuai.xi MS_BOOL msAPI_MJPEG_ReSetMWC(MS_U32 u32RBufAddr, MS_U32 u32RBufSize, MS_U32 u32WBufAddr, MS_U32 u32IBufAddr, MS_U32 u32IBufSize)
9030*53ee8cc1Swenshuai.xi {
9031*53ee8cc1Swenshuai.xi 
9032*53ee8cc1Swenshuai.xi     _u32WriteBufferAddr = u32WBufAddr;
9033*53ee8cc1Swenshuai.xi 
9034*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("MWC_BUFFER_ADDR = %08lx\n",MWC_BUFFER_ADDR);
9035*53ee8cc1Swenshuai.xi 
9036*53ee8cc1Swenshuai.xi     return TRUE;
9037*53ee8cc1Swenshuai.xi }
9038*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9039*53ee8cc1Swenshuai.xi void msAPI_JPEG_SetErrorCode(MS_U16 u16Code)
9040*53ee8cc1Swenshuai.xi {
9041*53ee8cc1Swenshuai.xi     _Error_code = u16Code;
9042*53ee8cc1Swenshuai.xi }
9043*53ee8cc1Swenshuai.xi #if 0
9044*53ee8cc1Swenshuai.xi #ifdef CMODEL
9045*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9046*53ee8cc1Swenshuai.xi // If you wish to decompress the image, call this method after constructing
9047*53ee8cc1Swenshuai.xi // the object. If E_JPEG_OKAY is returned you may then call decode() to
9048*53ee8cc1Swenshuai.xi // fetch the scan lines.
9049*53ee8cc1Swenshuai.xi JPEG_Result msAPI_JPEG_begin( void )
9050*53ee8cc1Swenshuai.xi {
9051*53ee8cc1Swenshuai.xi     if ( _bReady_flag )
9052*53ee8cc1Swenshuai.xi     {
9053*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("Flag!!!!\n");
9054*53ee8cc1Swenshuai.xi         return ( E_JPEG_OKAY );
9055*53ee8cc1Swenshuai.xi     }
9056*53ee8cc1Swenshuai.xi 
9057*53ee8cc1Swenshuai.xi     if ( _Error_code )
9058*53ee8cc1Swenshuai.xi     {
9059*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("Error!!!!\n");
9060*53ee8cc1Swenshuai.xi         return ( E_JPEG_FAILED );
9061*53ee8cc1Swenshuai.xi     }
9062*53ee8cc1Swenshuai.xi     JPEG_locate_sof_marker();
9063*53ee8cc1Swenshuai.xi 
9064*53ee8cc1Swenshuai.xi     //JPEG_decode_start();
9065*53ee8cc1Swenshuai.xi 
9066*53ee8cc1Swenshuai.xi     _bReady_flag = TRUE;
9067*53ee8cc1Swenshuai.xi 
9068*53ee8cc1Swenshuai.xi     return ( E_JPEG_OKAY );
9069*53ee8cc1Swenshuai.xi }
9070*53ee8cc1Swenshuai.xi #endif
9071*53ee8cc1Swenshuai.xi #endif
9072*53ee8cc1Swenshuai.xi #endif // not implement for new MDDI
9073*53ee8cc1Swenshuai.xi 
9074*53ee8cc1Swenshuai.xi 
9075*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
9076*53ee8cc1Swenshuai.xi // Decodes and dequantizes the next row of coefficients.
msAPI_JPEG_decode_next_row(void)9077*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_decode_next_row( void )
9078*53ee8cc1Swenshuai.xi {
9079*53ee8cc1Swenshuai.xi     MS_U16 row_block = 0;
9080*53ee8cc1Swenshuai.xi     MS_U16 mcu_row, mcu_block, k;
9081*53ee8cc1Swenshuai.xi 
9082*53ee8cc1Swenshuai.xi     // Clearing the entire row block buffer can take a lot of time!
9083*53ee8cc1Swenshuai.xi     // Instead of clearing the entire buffer each row, keep track
9084*53ee8cc1Swenshuai.xi     // of the number of nonzero entries written to each block and do
9085*53ee8cc1Swenshuai.xi     // selective clears.
9086*53ee8cc1Swenshuai.xi     //memset(_ps16Block_seg[0], 0, _u16Mcus_per_row * _u8Blocks_per_mcu * 64 * sizeof(BLOCK_TYPE));
9087*53ee8cc1Swenshuai.xi 
9088*53ee8cc1Swenshuai.xi     for ( mcu_row = 0; mcu_row < _u16Mcus_per_row; mcu_row++ )
9089*53ee8cc1Swenshuai.xi     {
9090*53ee8cc1Swenshuai.xi         if ( ( _u16Restart_interval ) && ( _u16Restarts_left == 0 ) )
9091*53ee8cc1Swenshuai.xi         {
9092*53ee8cc1Swenshuai.xi             if(!JPEG_process_restart())
9093*53ee8cc1Swenshuai.xi                 return FALSE;
9094*53ee8cc1Swenshuai.xi         }
9095*53ee8cc1Swenshuai.xi 
9096*53ee8cc1Swenshuai.xi         for ( mcu_block = 0; mcu_block < _u8Blocks_per_mcu; mcu_block++ )
9097*53ee8cc1Swenshuai.xi         {
9098*53ee8cc1Swenshuai.xi             MS_U8 component_id = _u8Mcu_org[mcu_block];
9099*53ee8cc1Swenshuai.xi             MS_U8 prev_num_set;
9100*53ee8cc1Swenshuai.xi             JPEG_HuffTbl *Ph;
9101*53ee8cc1Swenshuai.xi 
9102*53ee8cc1Swenshuai.xi             JPEG_BLOCK_TYPE *p = _ps16Block_seg[row_block];
9103*53ee8cc1Swenshuai.xi             JPEG_QUANT_TYPE *q = _QuantTables[_u8Comp_quant[component_id]].s16Value;
9104*53ee8cc1Swenshuai.xi             MS_S32 r, s;
9105*53ee8cc1Swenshuai.xi 
9106*53ee8cc1Swenshuai.xi             if ( ( s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_dc_tab[component_id]] ) ) != 0 )
9107*53ee8cc1Swenshuai.xi             {
9108*53ee8cc1Swenshuai.xi                 r = JPEG_get_bits_2( s );
9109*53ee8cc1Swenshuai.xi                 s = HUFF_EXTEND( r, s );
9110*53ee8cc1Swenshuai.xi             }
9111*53ee8cc1Swenshuai.xi 
9112*53ee8cc1Swenshuai.xi             //printf("r : %d s : %d\n",s,r);
9113*53ee8cc1Swenshuai.xi 
9114*53ee8cc1Swenshuai.xi             _u32Last_dc_val[component_id] = ( s += _u32Last_dc_val[component_id] );
9115*53ee8cc1Swenshuai.xi 
9116*53ee8cc1Swenshuai.xi             p[0] = s * q[0];
9117*53ee8cc1Swenshuai.xi 
9118*53ee8cc1Swenshuai.xi             prev_num_set = _u8Block_max_zag_set[row_block];
9119*53ee8cc1Swenshuai.xi 
9120*53ee8cc1Swenshuai.xi             Ph = &_Huff_tbls[_u8Comp_ac_tab[component_id]];
9121*53ee8cc1Swenshuai.xi 
9122*53ee8cc1Swenshuai.xi             for ( k = 1; k < 64; k++ )
9123*53ee8cc1Swenshuai.xi             {
9124*53ee8cc1Swenshuai.xi                 s = JPEG_huff_decode( Ph );
9125*53ee8cc1Swenshuai.xi 
9126*53ee8cc1Swenshuai.xi                 //printf("Decode s :%d\n",s);
9127*53ee8cc1Swenshuai.xi 
9128*53ee8cc1Swenshuai.xi                 r = s >> 4;
9129*53ee8cc1Swenshuai.xi                 s &= 15;
9130*53ee8cc1Swenshuai.xi 
9131*53ee8cc1Swenshuai.xi                 if ( s )
9132*53ee8cc1Swenshuai.xi                 {
9133*53ee8cc1Swenshuai.xi                     if ( r )
9134*53ee8cc1Swenshuai.xi                     {
9135*53ee8cc1Swenshuai.xi                         if ( ( k + r ) > 63 )
9136*53ee8cc1Swenshuai.xi                         {
9137*53ee8cc1Swenshuai.xi                             JPEG_terminate( E_JPEG_DECODE_ERROR );
9138*53ee8cc1Swenshuai.xi                             return FALSE;
9139*53ee8cc1Swenshuai.xi                         }
9140*53ee8cc1Swenshuai.xi 
9141*53ee8cc1Swenshuai.xi                         if ( k < prev_num_set )
9142*53ee8cc1Swenshuai.xi                         {
9143*53ee8cc1Swenshuai.xi                             MS_U32 n = MIN( r, prev_num_set - k );
9144*53ee8cc1Swenshuai.xi                             MS_U16 kt = k;
9145*53ee8cc1Swenshuai.xi                             while ( n-- )
9146*53ee8cc1Swenshuai.xi                             {
9147*53ee8cc1Swenshuai.xi                                 p[_u8ZAG[kt++]] = 0;
9148*53ee8cc1Swenshuai.xi                             }
9149*53ee8cc1Swenshuai.xi                         }
9150*53ee8cc1Swenshuai.xi 
9151*53ee8cc1Swenshuai.xi                         k += r;
9152*53ee8cc1Swenshuai.xi                     }
9153*53ee8cc1Swenshuai.xi 
9154*53ee8cc1Swenshuai.xi                     r = JPEG_get_bits_2( s );
9155*53ee8cc1Swenshuai.xi                     s = HUFF_EXTEND( r, s );
9156*53ee8cc1Swenshuai.xi 
9157*53ee8cc1Swenshuai.xi                     //assert(k < 64);
9158*53ee8cc1Swenshuai.xi 
9159*53ee8cc1Swenshuai.xi                     p[_u8ZAG[k]] = s * q[k];
9160*53ee8cc1Swenshuai.xi                 }
9161*53ee8cc1Swenshuai.xi                 else
9162*53ee8cc1Swenshuai.xi                 {
9163*53ee8cc1Swenshuai.xi                     if ( r == 15 )
9164*53ee8cc1Swenshuai.xi                     {
9165*53ee8cc1Swenshuai.xi                         if ( ( k + 15 ) > 63 )
9166*53ee8cc1Swenshuai.xi                         {
9167*53ee8cc1Swenshuai.xi                             JPEG_terminate( E_JPEG_DECODE_ERROR );
9168*53ee8cc1Swenshuai.xi                             return FALSE;
9169*53ee8cc1Swenshuai.xi                         }
9170*53ee8cc1Swenshuai.xi 
9171*53ee8cc1Swenshuai.xi                         if ( k < prev_num_set )
9172*53ee8cc1Swenshuai.xi                         {
9173*53ee8cc1Swenshuai.xi                             MS_U16 n = MIN( 16, prev_num_set - k );        //bugfix Dec. 19, 2001 - was 15!
9174*53ee8cc1Swenshuai.xi                             MS_U16 kt = k;
9175*53ee8cc1Swenshuai.xi                             while ( n-- )
9176*53ee8cc1Swenshuai.xi                             {
9177*53ee8cc1Swenshuai.xi                                 p[_u8ZAG[kt++]] = 0;
9178*53ee8cc1Swenshuai.xi                             }
9179*53ee8cc1Swenshuai.xi                         }
9180*53ee8cc1Swenshuai.xi 
9181*53ee8cc1Swenshuai.xi                         k += 15;
9182*53ee8cc1Swenshuai.xi                     }
9183*53ee8cc1Swenshuai.xi                     else
9184*53ee8cc1Swenshuai.xi                     {
9185*53ee8cc1Swenshuai.xi                         //while (k < 64)
9186*53ee8cc1Swenshuai.xi                         //  p[ZAG[k++]] = 0;
9187*53ee8cc1Swenshuai.xi 
9188*53ee8cc1Swenshuai.xi                         break;
9189*53ee8cc1Swenshuai.xi                     }
9190*53ee8cc1Swenshuai.xi                 }
9191*53ee8cc1Swenshuai.xi             }
9192*53ee8cc1Swenshuai.xi 
9193*53ee8cc1Swenshuai.xi             if ( k < prev_num_set )
9194*53ee8cc1Swenshuai.xi             {
9195*53ee8cc1Swenshuai.xi                 MS_U16 kt = k;
9196*53ee8cc1Swenshuai.xi                 while ( kt < prev_num_set && kt < 64)           // kt < 64 is for coverity check
9197*53ee8cc1Swenshuai.xi                 {
9198*53ee8cc1Swenshuai.xi                     p[_u8ZAG[kt++]] = 0;
9199*53ee8cc1Swenshuai.xi                 }
9200*53ee8cc1Swenshuai.xi             }
9201*53ee8cc1Swenshuai.xi 
9202*53ee8cc1Swenshuai.xi             _u8Block_max_zag_set[row_block] = k;
9203*53ee8cc1Swenshuai.xi 
9204*53ee8cc1Swenshuai.xi             //block_num[row_block++] = k;
9205*53ee8cc1Swenshuai.xi             row_block++;
9206*53ee8cc1Swenshuai.xi         }
9207*53ee8cc1Swenshuai.xi 
9208*53ee8cc1Swenshuai.xi         _u16Restarts_left--;
9209*53ee8cc1Swenshuai.xi     }
9210*53ee8cc1Swenshuai.xi     return TRUE;
9211*53ee8cc1Swenshuai.xi }
9212*53ee8cc1Swenshuai.xi 
9213*53ee8cc1Swenshuai.xi /*----------------------------------------------------------------------------*/
msAPI_JPEG_idct(JPEG_BLOCK_TYPE * data,MS_U8 * Pdst_ptr)9214*53ee8cc1Swenshuai.xi JPEG_STATIC void msAPI_JPEG_idct( JPEG_BLOCK_TYPE *data, MS_U8 *Pdst_ptr )
9215*53ee8cc1Swenshuai.xi {
9216*53ee8cc1Swenshuai.xi     MS_S32 t0, t1, t2, t3;
9217*53ee8cc1Swenshuai.xi     MS_S32 t10, t11, t12, t13;
9218*53ee8cc1Swenshuai.xi     MS_S32 a1, a2, a3, a4, a5;
9219*53ee8cc1Swenshuai.xi     MS_S32 rowctl;
9220*53ee8cc1Swenshuai.xi     register JPEG_BLOCK_TYPE *pdata;
9221*53ee8cc1Swenshuai.xi 
9222*53ee8cc1Swenshuai.xi     //kevinhuang, use an internal array in idct to avoid memcpy to save time
9223*53ee8cc1Swenshuai.xi     JPEG_BLOCK_TYPE workspace[64];
9224*53ee8cc1Swenshuai.xi     JPEG_BLOCK_TYPE *wsptr;
9225*53ee8cc1Swenshuai.xi 
9226*53ee8cc1Swenshuai.xi     pdata = data;
9227*53ee8cc1Swenshuai.xi     wsptr = workspace;
9228*53ee8cc1Swenshuai.xi     for ( rowctl = 8 - 1; rowctl >= 0; rowctl-- )
9229*53ee8cc1Swenshuai.xi     {
9230*53ee8cc1Swenshuai.xi         if ( ( pdata[1] | pdata[2] | pdata[3] | pdata[4] | pdata[5] | pdata[6] | pdata[7] ) == 0 )
9231*53ee8cc1Swenshuai.xi         {
9232*53ee8cc1Swenshuai.xi             MS_S16 dc_val = ( MS_S16 )( pdata[0] << 2 );
9233*53ee8cc1Swenshuai.xi 
9234*53ee8cc1Swenshuai.xi             wsptr[0] = dc_val;
9235*53ee8cc1Swenshuai.xi             wsptr[1] = dc_val;
9236*53ee8cc1Swenshuai.xi             wsptr[2] = dc_val;
9237*53ee8cc1Swenshuai.xi             wsptr[3] = dc_val;
9238*53ee8cc1Swenshuai.xi             wsptr[4] = dc_val;
9239*53ee8cc1Swenshuai.xi             wsptr[5] = dc_val;
9240*53ee8cc1Swenshuai.xi             wsptr[6] = dc_val;
9241*53ee8cc1Swenshuai.xi             wsptr[7] = dc_val;
9242*53ee8cc1Swenshuai.xi 
9243*53ee8cc1Swenshuai.xi             pdata += 8;       /* advance pointer to next row */
9244*53ee8cc1Swenshuai.xi             wsptr += 8;
9245*53ee8cc1Swenshuai.xi             continue;
9246*53ee8cc1Swenshuai.xi         }
9247*53ee8cc1Swenshuai.xi 
9248*53ee8cc1Swenshuai.xi         a2 = ( MS_S32 )pdata[2];
9249*53ee8cc1Swenshuai.xi         a3 = ( MS_S32 )pdata[6];
9250*53ee8cc1Swenshuai.xi 
9251*53ee8cc1Swenshuai.xi         a1 = (FIX_0_5411) * (a2 + a3);
9252*53ee8cc1Swenshuai.xi         t2 = (-FIX_1_8477) * a3 + a1;
9253*53ee8cc1Swenshuai.xi         t3 = (FIX_0_7653) * a2 + a1;
9254*53ee8cc1Swenshuai.xi 
9255*53ee8cc1Swenshuai.xi         t0 = ( ( MS_S32 )pdata[0] + ( MS_S32 )pdata[4] ) << 13;
9256*53ee8cc1Swenshuai.xi         t1 = ( ( MS_S32 )pdata[0] - ( MS_S32 )pdata[4] ) << 13;
9257*53ee8cc1Swenshuai.xi 
9258*53ee8cc1Swenshuai.xi         t10 = t0 + t3;
9259*53ee8cc1Swenshuai.xi         t13 = t0 - t3;
9260*53ee8cc1Swenshuai.xi         t11 = t1 + t2;
9261*53ee8cc1Swenshuai.xi         t12 = t1 - t2;
9262*53ee8cc1Swenshuai.xi 
9263*53ee8cc1Swenshuai.xi         t0 = ( MS_S32 )pdata[7];
9264*53ee8cc1Swenshuai.xi         t1 = ( MS_S32 )pdata[5];
9265*53ee8cc1Swenshuai.xi         t2 = ( MS_S32 )pdata[3];
9266*53ee8cc1Swenshuai.xi         t3 = ( MS_S32 )pdata[1];
9267*53ee8cc1Swenshuai.xi 
9268*53ee8cc1Swenshuai.xi         a1 = t0 + t3;
9269*53ee8cc1Swenshuai.xi         a2 = t1 + t2;
9270*53ee8cc1Swenshuai.xi         a3 = t0 + t2;
9271*53ee8cc1Swenshuai.xi         a4 = t1 + t3;
9272*53ee8cc1Swenshuai.xi         a5 = (FIX_1_1758) * (a3 + a4);
9273*53ee8cc1Swenshuai.xi 
9274*53ee8cc1Swenshuai.xi         a1 = (-FIX_0_8999) * a1;
9275*53ee8cc1Swenshuai.xi         a2 = (-FIX_2_5629) * a2;
9276*53ee8cc1Swenshuai.xi         a3 = (-FIX_1_9615) * a3;
9277*53ee8cc1Swenshuai.xi         a4 = (-FIX_0_3901) * a4;
9278*53ee8cc1Swenshuai.xi         t0 = (FIX_0_2986) * t0;
9279*53ee8cc1Swenshuai.xi         t1 = (FIX_2_0531) * t1;
9280*53ee8cc1Swenshuai.xi         t2 = (FIX_3_0727) * t2;
9281*53ee8cc1Swenshuai.xi         t3 = (FIX_1_5013) * t3;
9282*53ee8cc1Swenshuai.xi 
9283*53ee8cc1Swenshuai.xi         a3 += a5;
9284*53ee8cc1Swenshuai.xi         a4 += a5;
9285*53ee8cc1Swenshuai.xi 
9286*53ee8cc1Swenshuai.xi         t0 += a1 + a3;
9287*53ee8cc1Swenshuai.xi         t1 += a2 + a4;
9288*53ee8cc1Swenshuai.xi         t2 += a2 + a3;
9289*53ee8cc1Swenshuai.xi         t3 += a1 + a4;
9290*53ee8cc1Swenshuai.xi 
9291*53ee8cc1Swenshuai.xi         wsptr[0] = ( MS_S16 )DESCALE( t10 + t3, 13 - 2 );
9292*53ee8cc1Swenshuai.xi         wsptr[1] = ( MS_S16 )DESCALE( t11 + t2, 13 - 2 );
9293*53ee8cc1Swenshuai.xi         wsptr[2] = ( MS_S16 )DESCALE( t12 + t1, 13 - 2 );
9294*53ee8cc1Swenshuai.xi         wsptr[3] = ( MS_S16 )DESCALE( t13 + t0, 13 - 2 );
9295*53ee8cc1Swenshuai.xi         wsptr[4] = ( MS_S16 )DESCALE( t13 - t0, 13 - 2 );
9296*53ee8cc1Swenshuai.xi         wsptr[5] = ( MS_S16 )DESCALE( t12 - t1, 13 - 2 );
9297*53ee8cc1Swenshuai.xi         wsptr[6] = ( MS_S16 )DESCALE( t11 - t2, 13 - 2 );
9298*53ee8cc1Swenshuai.xi         wsptr[7] = ( MS_S16 )DESCALE( t10 - t3, 13 - 2 );
9299*53ee8cc1Swenshuai.xi 
9300*53ee8cc1Swenshuai.xi         pdata += 8;
9301*53ee8cc1Swenshuai.xi         wsptr += 8;
9302*53ee8cc1Swenshuai.xi     }
9303*53ee8cc1Swenshuai.xi 
9304*53ee8cc1Swenshuai.xi     pdata = workspace;
9305*53ee8cc1Swenshuai.xi     for ( rowctl = 8 - 1; rowctl >= 0; rowctl-- )
9306*53ee8cc1Swenshuai.xi     {
9307*53ee8cc1Swenshuai.xi         MS_S16 i;
9308*53ee8cc1Swenshuai.xi 
9309*53ee8cc1Swenshuai.xi         if ( ( pdata[8 * 1] | pdata[8 * 2] | pdata[8 * 3] | pdata[8 * 4] | pdata[8 * 5] | pdata[8 * 6] | pdata[8 * 7] ) == 0 )
9310*53ee8cc1Swenshuai.xi         {
9311*53ee8cc1Swenshuai.xi             MS_S16 dc_val = ( MS_S16 )DESCALE( ( MS_S32 )pdata[0], 2 + 3 ) + 128;
9312*53ee8cc1Swenshuai.xi 
9313*53ee8cc1Swenshuai.xi             clamp( dc_val );
9314*53ee8cc1Swenshuai.xi 
9315*53ee8cc1Swenshuai.xi             Pdst_ptr[8 * 0] = ( MS_U8 )dc_val;
9316*53ee8cc1Swenshuai.xi 
9317*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9318*53ee8cc1Swenshuai.xi             if(_u8ScaleDownFactor == 3)
9319*53ee8cc1Swenshuai.xi             {
9320*53ee8cc1Swenshuai.xi                 pdata++;
9321*53ee8cc1Swenshuai.xi                 Pdst_ptr++;
9322*53ee8cc1Swenshuai.xi                 continue;
9323*53ee8cc1Swenshuai.xi             }
9324*53ee8cc1Swenshuai.xi #endif
9325*53ee8cc1Swenshuai.xi 
9326*53ee8cc1Swenshuai.xi             Pdst_ptr[8 * 4] = ( MS_U8 )dc_val;
9327*53ee8cc1Swenshuai.xi 
9328*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9329*53ee8cc1Swenshuai.xi             if(_u8ScaleDownFactor == 2)
9330*53ee8cc1Swenshuai.xi             {
9331*53ee8cc1Swenshuai.xi                 pdata++;
9332*53ee8cc1Swenshuai.xi                 Pdst_ptr++;
9333*53ee8cc1Swenshuai.xi                 continue;
9334*53ee8cc1Swenshuai.xi             }
9335*53ee8cc1Swenshuai.xi #endif
9336*53ee8cc1Swenshuai.xi 
9337*53ee8cc1Swenshuai.xi             Pdst_ptr[8 * 2] = ( MS_U8 )dc_val;
9338*53ee8cc1Swenshuai.xi             Pdst_ptr[8 * 6] = ( MS_U8 )dc_val;
9339*53ee8cc1Swenshuai.xi 
9340*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9341*53ee8cc1Swenshuai.xi             if(_u8ScaleDownFactor == 1)
9342*53ee8cc1Swenshuai.xi             {
9343*53ee8cc1Swenshuai.xi                 pdata++;
9344*53ee8cc1Swenshuai.xi                 Pdst_ptr++;
9345*53ee8cc1Swenshuai.xi                 continue;
9346*53ee8cc1Swenshuai.xi             }
9347*53ee8cc1Swenshuai.xi #endif
9348*53ee8cc1Swenshuai.xi 
9349*53ee8cc1Swenshuai.xi             Pdst_ptr[8 * 1] = ( MS_U8 )dc_val;
9350*53ee8cc1Swenshuai.xi             Pdst_ptr[8 * 5] = ( MS_U8 )dc_val;
9351*53ee8cc1Swenshuai.xi             Pdst_ptr[8 * 3] = ( MS_U8 )dc_val;
9352*53ee8cc1Swenshuai.xi             Pdst_ptr[8 * 7] = ( MS_U8 )dc_val;
9353*53ee8cc1Swenshuai.xi 
9354*53ee8cc1Swenshuai.xi             pdata++;
9355*53ee8cc1Swenshuai.xi             Pdst_ptr++;
9356*53ee8cc1Swenshuai.xi             continue;
9357*53ee8cc1Swenshuai.xi         }
9358*53ee8cc1Swenshuai.xi 
9359*53ee8cc1Swenshuai.xi         a2 = ( MS_S32 )pdata[8 * 2];
9360*53ee8cc1Swenshuai.xi         a3 = ( MS_S32 )pdata[8 * 6];
9361*53ee8cc1Swenshuai.xi 
9362*53ee8cc1Swenshuai.xi         a1 = (FIX_0_5411) * (a2 + a3);
9363*53ee8cc1Swenshuai.xi         t2 = (-FIX_1_8477) * a3 + a1;
9364*53ee8cc1Swenshuai.xi         t3 = (FIX_0_7653) * a2 + a1;
9365*53ee8cc1Swenshuai.xi 
9366*53ee8cc1Swenshuai.xi         t0 = ( ( MS_S32 )pdata[8 * 0] + ( MS_S32 )pdata[8 * 4] ) << 13;
9367*53ee8cc1Swenshuai.xi         t1 = ( ( MS_S32 )pdata[8 * 0] - ( MS_S32 )pdata[8 * 4] ) << 13;
9368*53ee8cc1Swenshuai.xi 
9369*53ee8cc1Swenshuai.xi         t10 = t0 + t3;
9370*53ee8cc1Swenshuai.xi         t13 = t0 - t3;
9371*53ee8cc1Swenshuai.xi         t11 = t1 + t2;
9372*53ee8cc1Swenshuai.xi         t12 = t1 - t2;
9373*53ee8cc1Swenshuai.xi 
9374*53ee8cc1Swenshuai.xi         t0 = ( MS_S32 )pdata[8 * 7];
9375*53ee8cc1Swenshuai.xi         t1 = ( MS_S32 )pdata[8 * 5];
9376*53ee8cc1Swenshuai.xi         t2 = ( MS_S32 )pdata[8 * 3];
9377*53ee8cc1Swenshuai.xi         t3 = ( MS_S32 )pdata[8 * 1];
9378*53ee8cc1Swenshuai.xi 
9379*53ee8cc1Swenshuai.xi         a1 = t0 + t3;
9380*53ee8cc1Swenshuai.xi         a2 = t1 + t2;
9381*53ee8cc1Swenshuai.xi         a3 = t0 + t2;
9382*53ee8cc1Swenshuai.xi         a4 = t1 + t3;
9383*53ee8cc1Swenshuai.xi         a5 = (FIX_1_1758) * (a3 + a4);
9384*53ee8cc1Swenshuai.xi 
9385*53ee8cc1Swenshuai.xi         a1 = (-FIX_0_8999) * a1;
9386*53ee8cc1Swenshuai.xi         a2 = (-FIX_2_5629) * a2;
9387*53ee8cc1Swenshuai.xi         a3 = (-FIX_1_9615) * a3;
9388*53ee8cc1Swenshuai.xi         a4 = (-FIX_0_3901) * a4;
9389*53ee8cc1Swenshuai.xi         t0 = (FIX_0_2986) * t0;
9390*53ee8cc1Swenshuai.xi         t1 = (FIX_2_0531) * t1;
9391*53ee8cc1Swenshuai.xi         t2 = (FIX_3_0727) * t2;
9392*53ee8cc1Swenshuai.xi         t3 = (FIX_1_5013) * t3;
9393*53ee8cc1Swenshuai.xi 
9394*53ee8cc1Swenshuai.xi         a3 += a5;
9395*53ee8cc1Swenshuai.xi         a4 += a5;
9396*53ee8cc1Swenshuai.xi 
9397*53ee8cc1Swenshuai.xi         t0 += a1 + a3;
9398*53ee8cc1Swenshuai.xi         t1 += a2 + a4;
9399*53ee8cc1Swenshuai.xi         t2 += a2 + a3;
9400*53ee8cc1Swenshuai.xi         t3 += a1 + a4;
9401*53ee8cc1Swenshuai.xi 
9402*53ee8cc1Swenshuai.xi         i = ( MS_S16 )DESCALE( t10 + t3, 13 + 2 + 3 ) + 128;
9403*53ee8cc1Swenshuai.xi         clamp( i )
9404*53ee8cc1Swenshuai.xi         Pdst_ptr[8 * 0] = ( MS_U8 )i;
9405*53ee8cc1Swenshuai.xi 
9406*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9407*53ee8cc1Swenshuai.xi         if(_u8ScaleDownFactor== 3)
9408*53ee8cc1Swenshuai.xi         {
9409*53ee8cc1Swenshuai.xi             pdata++;
9410*53ee8cc1Swenshuai.xi             Pdst_ptr++;
9411*53ee8cc1Swenshuai.xi             continue;
9412*53ee8cc1Swenshuai.xi         }
9413*53ee8cc1Swenshuai.xi #endif
9414*53ee8cc1Swenshuai.xi 
9415*53ee8cc1Swenshuai.xi         i = ( MS_S16 )DESCALE( t13 - t0, 13 + 2 + 3 ) + 128;
9416*53ee8cc1Swenshuai.xi         clamp( i )
9417*53ee8cc1Swenshuai.xi         Pdst_ptr[8 * 4] = ( MS_U8 )i;
9418*53ee8cc1Swenshuai.xi 
9419*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9420*53ee8cc1Swenshuai.xi         if(_u8ScaleDownFactor== 2)
9421*53ee8cc1Swenshuai.xi         {
9422*53ee8cc1Swenshuai.xi             pdata++;
9423*53ee8cc1Swenshuai.xi             Pdst_ptr++;
9424*53ee8cc1Swenshuai.xi             continue;
9425*53ee8cc1Swenshuai.xi         }
9426*53ee8cc1Swenshuai.xi #endif
9427*53ee8cc1Swenshuai.xi 
9428*53ee8cc1Swenshuai.xi         i = ( MS_S16 )DESCALE( t12 + t1, 13 + 2 + 3 ) + 128;
9429*53ee8cc1Swenshuai.xi         clamp( i )
9430*53ee8cc1Swenshuai.xi         Pdst_ptr[8 * 2] = ( MS_U8 )i;
9431*53ee8cc1Swenshuai.xi 
9432*53ee8cc1Swenshuai.xi         i = ( MS_S16 )DESCALE( t11 - t2, 13 + 2 + 3 ) + 128;
9433*53ee8cc1Swenshuai.xi         clamp( i )
9434*53ee8cc1Swenshuai.xi         Pdst_ptr[8 * 6] = ( MS_U8 )i;
9435*53ee8cc1Swenshuai.xi 
9436*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9437*53ee8cc1Swenshuai.xi         if(_u8ScaleDownFactor== 1)
9438*53ee8cc1Swenshuai.xi         {
9439*53ee8cc1Swenshuai.xi             pdata++;
9440*53ee8cc1Swenshuai.xi             Pdst_ptr++;
9441*53ee8cc1Swenshuai.xi             continue;
9442*53ee8cc1Swenshuai.xi         }
9443*53ee8cc1Swenshuai.xi #endif
9444*53ee8cc1Swenshuai.xi 
9445*53ee8cc1Swenshuai.xi         i = ( MS_S16 )DESCALE( t11 + t2, 13 + 2 + 3 ) + 128;
9446*53ee8cc1Swenshuai.xi         clamp( i )
9447*53ee8cc1Swenshuai.xi         Pdst_ptr[8 * 1] = ( MS_U8 )i;
9448*53ee8cc1Swenshuai.xi 
9449*53ee8cc1Swenshuai.xi 
9450*53ee8cc1Swenshuai.xi         i = ( MS_S16 )DESCALE( t13 + t0, 13 + 2 + 3 ) + 128;
9451*53ee8cc1Swenshuai.xi         clamp( i )
9452*53ee8cc1Swenshuai.xi         Pdst_ptr[8 * 3] = ( MS_U8 )i;
9453*53ee8cc1Swenshuai.xi 
9454*53ee8cc1Swenshuai.xi 
9455*53ee8cc1Swenshuai.xi         i = ( MS_S16 )DESCALE( t12 - t1, 13 + 2 + 3 ) + 128;
9456*53ee8cc1Swenshuai.xi         clamp( i )
9457*53ee8cc1Swenshuai.xi         Pdst_ptr[8 * 5] = ( MS_U8 )i;
9458*53ee8cc1Swenshuai.xi 
9459*53ee8cc1Swenshuai.xi 
9460*53ee8cc1Swenshuai.xi         i = ( MS_S16 )DESCALE( t10 - t3, 13 + 2 + 3 ) + 128;
9461*53ee8cc1Swenshuai.xi         clamp( i )
9462*53ee8cc1Swenshuai.xi         Pdst_ptr[8 * 7] = ( MS_U8 )i;
9463*53ee8cc1Swenshuai.xi 
9464*53ee8cc1Swenshuai.xi         pdata++;
9465*53ee8cc1Swenshuai.xi         Pdst_ptr++;
9466*53ee8cc1Swenshuai.xi     }
9467*53ee8cc1Swenshuai.xi }
9468*53ee8cc1Swenshuai.xi 
msAPI_JPEG_Idct_CMYKConvert(void)9469*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_Idct_CMYKConvert(void)
9470*53ee8cc1Swenshuai.xi {
9471*53ee8cc1Swenshuai.xi     JPEG_BLOCK_TYPE *Psrc_ptr = _ps16Block_seg[0];
9472*53ee8cc1Swenshuai.xi     MS_U8 *Pdst_ptr = gpu8Sample_buf;
9473*53ee8cc1Swenshuai.xi     MS_U8 *u8Start_Each_Block, *u8Start_Each_Row;
9474*53ee8cc1Swenshuai.xi     MS_U32 u32_y_Blcok_Pos = 0, Max_Pixel_Per_Row;
9475*53ee8cc1Swenshuai.xi     MS_S32 i;
9476*53ee8cc1Swenshuai.xi     MS_U8  u8Row_in_block, k;
9477*53ee8cc1Swenshuai.xi     MS_U16 u16Pixel_Per_Block_x = 8, u16Pixel_Per_Block_y = 8;
9478*53ee8cc1Swenshuai.xi     MS_U16 u16Pixel_Per_Pack_row = 16, u16TotalBlock_Per_Row, u16ScaleDownStep = 1 << _u8ScaleDownFactor;
9479*53ee8cc1Swenshuai.xi 
9480*53ee8cc1Swenshuai.xi     u16TotalBlock_Per_Row = (_u32Max_blocks_per_row)/2;
9481*53ee8cc1Swenshuai.xi 
9482*53ee8cc1Swenshuai.xi     u16Pixel_Per_Pack_row = u16Pixel_Per_Pack_row >> _u8ScaleDownFactor;
9483*53ee8cc1Swenshuai.xi     u16Pixel_Per_Block_x = u16Pixel_Per_Block_x/* >> _u8ScaleDownFactor*/;
9484*53ee8cc1Swenshuai.xi     u16Pixel_Per_Block_y = u16Pixel_Per_Block_y >> _u8ScaleDownFactor;
9485*53ee8cc1Swenshuai.xi 
9486*53ee8cc1Swenshuai.xi 
9487*53ee8cc1Swenshuai.xi     Max_Pixel_Per_Row = (u16TotalBlock_Per_Row*u16Pixel_Per_Block_x >> _u8ScaleDownFactor);
9488*53ee8cc1Swenshuai.xi 
9489*53ee8cc1Swenshuai.xi     //Get start position of each row
9490*53ee8cc1Swenshuai.xi     u8Start_Each_Row = (u8Out_buf + (u32_Decode_Line*(Max_Pixel_Per_Row*u16Pixel_Per_Block_y)));
9491*53ee8cc1Swenshuai.xi 
9492*53ee8cc1Swenshuai.xi     for ( i = (MS_S32)_u32Max_blocks_per_row; i > 0;)
9493*53ee8cc1Swenshuai.xi     {
9494*53ee8cc1Swenshuai.xi         //===================GET Y1 BLOCKs=======================
9495*53ee8cc1Swenshuai.xi         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9496*53ee8cc1Swenshuai.xi 
9497*53ee8cc1Swenshuai.xi         //Get start position of block
9498*53ee8cc1Swenshuai.xi         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9499*53ee8cc1Swenshuai.xi 
9500*53ee8cc1Swenshuai.xi         //Write value to destination buffer
9501*53ee8cc1Swenshuai.xi         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9502*53ee8cc1Swenshuai.xi         {
9503*53ee8cc1Swenshuai.xi             for(k=0;k<u16Pixel_Per_Block_y;k++)
9504*53ee8cc1Swenshuai.xi             {
9505*53ee8cc1Swenshuai.xi                 *(u8Start_Each_Block + (k*2) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9506*53ee8cc1Swenshuai.xi             }
9507*53ee8cc1Swenshuai.xi             u8Start_Each_Block += Max_Pixel_Per_Row;
9508*53ee8cc1Swenshuai.xi         }
9509*53ee8cc1Swenshuai.xi 
9510*53ee8cc1Swenshuai.xi         //Skip U. V block for 422 format
9511*53ee8cc1Swenshuai.xi         Psrc_ptr += 256;
9512*53ee8cc1Swenshuai.xi         Pdst_ptr += 256;
9513*53ee8cc1Swenshuai.xi         i-=4;
9514*53ee8cc1Swenshuai.xi 
9515*53ee8cc1Swenshuai.xi         if(i == 0)
9516*53ee8cc1Swenshuai.xi         {
9517*53ee8cc1Swenshuai.xi             //Already decoded all blocks
9518*53ee8cc1Swenshuai.xi             continue;
9519*53ee8cc1Swenshuai.xi         }
9520*53ee8cc1Swenshuai.xi         else if(i < 0)
9521*53ee8cc1Swenshuai.xi         {
9522*53ee8cc1Swenshuai.xi             printf("GET BLOCK NUMBER ERROR!\n");
9523*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_DECODE_ERROR );
9524*53ee8cc1Swenshuai.xi             return FALSE;
9525*53ee8cc1Swenshuai.xi         }
9526*53ee8cc1Swenshuai.xi 
9527*53ee8cc1Swenshuai.xi         //Move y block position in a row
9528*53ee8cc1Swenshuai.xi         u32_y_Blcok_Pos++;
9529*53ee8cc1Swenshuai.xi         //===================GET Y2 BLOCKs=======================
9530*53ee8cc1Swenshuai.xi         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9531*53ee8cc1Swenshuai.xi 
9532*53ee8cc1Swenshuai.xi         //Get start position of block
9533*53ee8cc1Swenshuai.xi         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9534*53ee8cc1Swenshuai.xi 
9535*53ee8cc1Swenshuai.xi         //Write value to destination buffer
9536*53ee8cc1Swenshuai.xi         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9537*53ee8cc1Swenshuai.xi         {
9538*53ee8cc1Swenshuai.xi             for(k=0;k<u16Pixel_Per_Block_y;k++)
9539*53ee8cc1Swenshuai.xi             {
9540*53ee8cc1Swenshuai.xi                 *(u8Start_Each_Block + (k*2) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9541*53ee8cc1Swenshuai.xi             }
9542*53ee8cc1Swenshuai.xi             u8Start_Each_Block += Max_Pixel_Per_Row;
9543*53ee8cc1Swenshuai.xi         }
9544*53ee8cc1Swenshuai.xi 
9545*53ee8cc1Swenshuai.xi         //Move idct data position
9546*53ee8cc1Swenshuai.xi         Psrc_ptr += 64;
9547*53ee8cc1Swenshuai.xi         Pdst_ptr += 64;
9548*53ee8cc1Swenshuai.xi         i--;
9549*53ee8cc1Swenshuai.xi 
9550*53ee8cc1Swenshuai.xi         //Move y block position in a row, Reset position for U block
9551*53ee8cc1Swenshuai.xi         u32_y_Blcok_Pos--;
9552*53ee8cc1Swenshuai.xi         //===================GET U BLOCKs=======================
9553*53ee8cc1Swenshuai.xi         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9554*53ee8cc1Swenshuai.xi 
9555*53ee8cc1Swenshuai.xi         //Get start position of block
9556*53ee8cc1Swenshuai.xi         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9557*53ee8cc1Swenshuai.xi 
9558*53ee8cc1Swenshuai.xi         //Write value to destination buffer
9559*53ee8cc1Swenshuai.xi         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9560*53ee8cc1Swenshuai.xi         {
9561*53ee8cc1Swenshuai.xi             for(k=0;k<u16Pixel_Per_Block_y;k++)
9562*53ee8cc1Swenshuai.xi             {
9563*53ee8cc1Swenshuai.xi                 *(u8Start_Each_Block + ((k*4) + 1) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9564*53ee8cc1Swenshuai.xi             }
9565*53ee8cc1Swenshuai.xi             u8Start_Each_Block += Max_Pixel_Per_Row;
9566*53ee8cc1Swenshuai.xi         }
9567*53ee8cc1Swenshuai.xi 
9568*53ee8cc1Swenshuai.xi         //Move idct data position
9569*53ee8cc1Swenshuai.xi         Psrc_ptr += 64;
9570*53ee8cc1Swenshuai.xi         Pdst_ptr += 64;
9571*53ee8cc1Swenshuai.xi         i--;
9572*53ee8cc1Swenshuai.xi 
9573*53ee8cc1Swenshuai.xi         //===================GET V BLOCKs=======================
9574*53ee8cc1Swenshuai.xi         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9575*53ee8cc1Swenshuai.xi 
9576*53ee8cc1Swenshuai.xi         //Get start position of block
9577*53ee8cc1Swenshuai.xi         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9578*53ee8cc1Swenshuai.xi 
9579*53ee8cc1Swenshuai.xi         //Write value to destination buffer
9580*53ee8cc1Swenshuai.xi         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9581*53ee8cc1Swenshuai.xi         {
9582*53ee8cc1Swenshuai.xi             for(k=0;k<u16Pixel_Per_Block_y;k++)
9583*53ee8cc1Swenshuai.xi             {
9584*53ee8cc1Swenshuai.xi                 *(u8Start_Each_Block + ((k*4) + 3) ) =  255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9585*53ee8cc1Swenshuai.xi             }
9586*53ee8cc1Swenshuai.xi             u8Start_Each_Block += Max_Pixel_Per_Row;
9587*53ee8cc1Swenshuai.xi         }
9588*53ee8cc1Swenshuai.xi 
9589*53ee8cc1Swenshuai.xi         //Move idct data position
9590*53ee8cc1Swenshuai.xi         Psrc_ptr += 128;
9591*53ee8cc1Swenshuai.xi         Pdst_ptr += 128;
9592*53ee8cc1Swenshuai.xi         i-=2;
9593*53ee8cc1Swenshuai.xi 
9594*53ee8cc1Swenshuai.xi         //Move y block position in a row, Reset position for U block
9595*53ee8cc1Swenshuai.xi         u32_y_Blcok_Pos+=2;
9596*53ee8cc1Swenshuai.xi 
9597*53ee8cc1Swenshuai.xi     }
9598*53ee8cc1Swenshuai.xi 
9599*53ee8cc1Swenshuai.xi     u32_Decode_Line++;
9600*53ee8cc1Swenshuai.xi     return TRUE;
9601*53ee8cc1Swenshuai.xi }
9602*53ee8cc1Swenshuai.xi 
msAPI_JPEG_Idct_RGBConvert(void)9603*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_Idct_RGBConvert(void)
9604*53ee8cc1Swenshuai.xi {
9605*53ee8cc1Swenshuai.xi     JPEG_BLOCK_TYPE *Psrc_ptr = _ps16Block_seg[0];
9606*53ee8cc1Swenshuai.xi     MS_U8 *Pdst_ptr = gpu8Sample_buf;
9607*53ee8cc1Swenshuai.xi     MS_U8 *u8Start_Each_Block, *u8Start_Each_Row;
9608*53ee8cc1Swenshuai.xi     MS_U32 u32_y_Blcok_Pos = 0, Max_Pixel_Per_Row;
9609*53ee8cc1Swenshuai.xi     MS_S32 i;
9610*53ee8cc1Swenshuai.xi     MS_U8  u8Row_in_block, k;
9611*53ee8cc1Swenshuai.xi     MS_U16 u16Pixel_Per_Block_x = 8, u16Pixel_Per_Block_y = 8;
9612*53ee8cc1Swenshuai.xi     MS_U16 u16Pixel_Per_Pack_row = 16, u16TotalBlock_Per_Row, u16ScaleDownStep = 1 << _u8ScaleDownFactor;
9613*53ee8cc1Swenshuai.xi 
9614*53ee8cc1Swenshuai.xi     u16TotalBlock_Per_Row = (_u32Max_blocks_per_row*2)/3;
9615*53ee8cc1Swenshuai.xi 
9616*53ee8cc1Swenshuai.xi     u16Pixel_Per_Pack_row = u16Pixel_Per_Pack_row >> _u8ScaleDownFactor;
9617*53ee8cc1Swenshuai.xi     u16Pixel_Per_Block_x = u16Pixel_Per_Block_x/* >> _u8ScaleDownFactor*/;
9618*53ee8cc1Swenshuai.xi     u16Pixel_Per_Block_y = u16Pixel_Per_Block_y >> _u8ScaleDownFactor;
9619*53ee8cc1Swenshuai.xi 
9620*53ee8cc1Swenshuai.xi 
9621*53ee8cc1Swenshuai.xi     Max_Pixel_Per_Row = (u16TotalBlock_Per_Row*u16Pixel_Per_Block_x >> _u8ScaleDownFactor);
9622*53ee8cc1Swenshuai.xi 
9623*53ee8cc1Swenshuai.xi     //Get start position of each row
9624*53ee8cc1Swenshuai.xi     u8Start_Each_Row = (u8Out_buf + (u32_Decode_Line*(Max_Pixel_Per_Row*u16Pixel_Per_Block_y)));
9625*53ee8cc1Swenshuai.xi 
9626*53ee8cc1Swenshuai.xi     for ( i = (MS_S32)_u32Max_blocks_per_row; i > 0;)
9627*53ee8cc1Swenshuai.xi     {
9628*53ee8cc1Swenshuai.xi 
9629*53ee8cc1Swenshuai.xi         //===================GET R BLOCKs========================
9630*53ee8cc1Swenshuai.xi         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9631*53ee8cc1Swenshuai.xi 
9632*53ee8cc1Swenshuai.xi         //Get start position of block
9633*53ee8cc1Swenshuai.xi         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9634*53ee8cc1Swenshuai.xi 
9635*53ee8cc1Swenshuai.xi         //Write value to destination buffer
9636*53ee8cc1Swenshuai.xi         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9637*53ee8cc1Swenshuai.xi         {
9638*53ee8cc1Swenshuai.xi             for(k=0;k<u16Pixel_Per_Block_y;k++)
9639*53ee8cc1Swenshuai.xi             {
9640*53ee8cc1Swenshuai.xi                 *(u8Start_Each_Block + (k*2) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9641*53ee8cc1Swenshuai.xi             }
9642*53ee8cc1Swenshuai.xi             u8Start_Each_Block += Max_Pixel_Per_Row;
9643*53ee8cc1Swenshuai.xi         }
9644*53ee8cc1Swenshuai.xi 
9645*53ee8cc1Swenshuai.xi         //Skip U. V block for 422 format
9646*53ee8cc1Swenshuai.xi         Psrc_ptr += 64;
9647*53ee8cc1Swenshuai.xi         Pdst_ptr += 64;
9648*53ee8cc1Swenshuai.xi         i--;
9649*53ee8cc1Swenshuai.xi 
9650*53ee8cc1Swenshuai.xi         //===================GET G BLOCKs=======================
9651*53ee8cc1Swenshuai.xi         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9652*53ee8cc1Swenshuai.xi 
9653*53ee8cc1Swenshuai.xi         //Get start position of block
9654*53ee8cc1Swenshuai.xi         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9655*53ee8cc1Swenshuai.xi         //Write value to destination buffer
9656*53ee8cc1Swenshuai.xi         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9657*53ee8cc1Swenshuai.xi         {
9658*53ee8cc1Swenshuai.xi             for(k=0;k<u16Pixel_Per_Block_y;k++)
9659*53ee8cc1Swenshuai.xi             {
9660*53ee8cc1Swenshuai.xi                 *(u8Start_Each_Block + ((k*4) + 1) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9661*53ee8cc1Swenshuai.xi             }
9662*53ee8cc1Swenshuai.xi             u8Start_Each_Block += Max_Pixel_Per_Row;
9663*53ee8cc1Swenshuai.xi         }
9664*53ee8cc1Swenshuai.xi 
9665*53ee8cc1Swenshuai.xi         //Move idct data position
9666*53ee8cc1Swenshuai.xi         Psrc_ptr += 64;
9667*53ee8cc1Swenshuai.xi         Pdst_ptr += 64;
9668*53ee8cc1Swenshuai.xi         i--;
9669*53ee8cc1Swenshuai.xi 
9670*53ee8cc1Swenshuai.xi         //===================GET B BLOCKs=======================
9671*53ee8cc1Swenshuai.xi         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9672*53ee8cc1Swenshuai.xi 
9673*53ee8cc1Swenshuai.xi         //Get start position of block
9674*53ee8cc1Swenshuai.xi         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9675*53ee8cc1Swenshuai.xi         //Write value to destination buffer
9676*53ee8cc1Swenshuai.xi         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9677*53ee8cc1Swenshuai.xi         {
9678*53ee8cc1Swenshuai.xi             for(k=0;k<u16Pixel_Per_Block_y;k++)
9679*53ee8cc1Swenshuai.xi             {
9680*53ee8cc1Swenshuai.xi                 *(u8Start_Each_Block + ((k*4) + 3) ) =  Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9681*53ee8cc1Swenshuai.xi             }
9682*53ee8cc1Swenshuai.xi             u8Start_Each_Block += Max_Pixel_Per_Row;
9683*53ee8cc1Swenshuai.xi         }
9684*53ee8cc1Swenshuai.xi 
9685*53ee8cc1Swenshuai.xi         //Move idct data position
9686*53ee8cc1Swenshuai.xi         Psrc_ptr += 64;
9687*53ee8cc1Swenshuai.xi         Pdst_ptr += 64;
9688*53ee8cc1Swenshuai.xi         i--;
9689*53ee8cc1Swenshuai.xi 
9690*53ee8cc1Swenshuai.xi         if(i == 0)
9691*53ee8cc1Swenshuai.xi         {
9692*53ee8cc1Swenshuai.xi             //Already decoded all blocks
9693*53ee8cc1Swenshuai.xi             continue;
9694*53ee8cc1Swenshuai.xi         }
9695*53ee8cc1Swenshuai.xi         else if(i < 0)
9696*53ee8cc1Swenshuai.xi         {
9697*53ee8cc1Swenshuai.xi             printf("GET BLOCK NUMBER ERROR!\n");
9698*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_DECODE_ERROR );
9699*53ee8cc1Swenshuai.xi             return FALSE;
9700*53ee8cc1Swenshuai.xi         }
9701*53ee8cc1Swenshuai.xi 
9702*53ee8cc1Swenshuai.xi         //Move y block position in a row
9703*53ee8cc1Swenshuai.xi         u32_y_Blcok_Pos++;
9704*53ee8cc1Swenshuai.xi         //===================GET R BLOCKs=======================
9705*53ee8cc1Swenshuai.xi         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9706*53ee8cc1Swenshuai.xi 
9707*53ee8cc1Swenshuai.xi         //Get start position of block
9708*53ee8cc1Swenshuai.xi         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9709*53ee8cc1Swenshuai.xi         //Write value to destination buffer
9710*53ee8cc1Swenshuai.xi         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9711*53ee8cc1Swenshuai.xi         {
9712*53ee8cc1Swenshuai.xi             for(k=0;k<u16Pixel_Per_Block_y;k++)
9713*53ee8cc1Swenshuai.xi             {
9714*53ee8cc1Swenshuai.xi                 *(u8Start_Each_Block + (k*2) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9715*53ee8cc1Swenshuai.xi             }
9716*53ee8cc1Swenshuai.xi             u8Start_Each_Block += Max_Pixel_Per_Row;
9717*53ee8cc1Swenshuai.xi         }
9718*53ee8cc1Swenshuai.xi 
9719*53ee8cc1Swenshuai.xi         //Move idct data position
9720*53ee8cc1Swenshuai.xi         Psrc_ptr += 192;
9721*53ee8cc1Swenshuai.xi         Pdst_ptr += 192;
9722*53ee8cc1Swenshuai.xi         i-=3;
9723*53ee8cc1Swenshuai.xi 
9724*53ee8cc1Swenshuai.xi         //Move y block position in a row, Reset position for U block
9725*53ee8cc1Swenshuai.xi         u32_y_Blcok_Pos++;
9726*53ee8cc1Swenshuai.xi 
9727*53ee8cc1Swenshuai.xi     }
9728*53ee8cc1Swenshuai.xi 
9729*53ee8cc1Swenshuai.xi     u32_Decode_Line++;
9730*53ee8cc1Swenshuai.xi     return TRUE;
9731*53ee8cc1Swenshuai.xi }
9732*53ee8cc1Swenshuai.xi 
9733*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9734*53ee8cc1Swenshuai.xi // Performs a 2D IDCT over the entire row's coefficient buffer.
msAPI_JPEG_transform_row(void)9735*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_transform_row( void )
9736*53ee8cc1Swenshuai.xi {
9737*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("Max block : %ld\n", _u32Max_blocks_per_row);
9738*53ee8cc1Swenshuai.xi 
9739*53ee8cc1Swenshuai.xi     switch ( gu8Scan_type )
9740*53ee8cc1Swenshuai.xi     {
9741*53ee8cc1Swenshuai.xi         case E_JPEG_CMYK:
9742*53ee8cc1Swenshuai.xi             if(!msAPI_JPEG_Idct_CMYKConvert())
9743*53ee8cc1Swenshuai.xi                 return FALSE;
9744*53ee8cc1Swenshuai.xi             break;
9745*53ee8cc1Swenshuai.xi         case E_JPEG_RGB:
9746*53ee8cc1Swenshuai.xi             if(!msAPI_JPEG_Idct_RGBConvert())
9747*53ee8cc1Swenshuai.xi                 return FALSE;
9748*53ee8cc1Swenshuai.xi             break;
9749*53ee8cc1Swenshuai.xi         default :
9750*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("System don`t support this format!\n");
9751*53ee8cc1Swenshuai.xi             JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
9752*53ee8cc1Swenshuai.xi             return FALSE;
9753*53ee8cc1Swenshuai.xi             break;
9754*53ee8cc1Swenshuai.xi     }
9755*53ee8cc1Swenshuai.xi     return TRUE;
9756*53ee8cc1Swenshuai.xi 
9757*53ee8cc1Swenshuai.xi }
9758*53ee8cc1Swenshuai.xi 
msAPI_JPEG_Baseline_Decode(void)9759*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_Result msAPI_JPEG_Baseline_Decode(void)
9760*53ee8cc1Swenshuai.xi {
9761*53ee8cc1Swenshuai.xi 
9762*53ee8cc1Swenshuai.xi     if(_bProgressive_flag==TRUE)
9763*53ee8cc1Swenshuai.xi         return (E_JPEG_FAILED);
9764*53ee8cc1Swenshuai.xi 
9765*53ee8cc1Swenshuai.xi     if ( _u16Total_lines_left == 0 )
9766*53ee8cc1Swenshuai.xi     {
9767*53ee8cc1Swenshuai.xi         return ( E_JPEG_OKAY );
9768*53ee8cc1Swenshuai.xi     }
9769*53ee8cc1Swenshuai.xi 
9770*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
9771*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
9772*53ee8cc1Swenshuai.xi     {
9773*53ee8cc1Swenshuai.xi         return ( E_JPEG_FAILED );
9774*53ee8cc1Swenshuai.xi     }
9775*53ee8cc1Swenshuai.xi #endif
9776*53ee8cc1Swenshuai.xi 
9777*53ee8cc1Swenshuai.xi     if( _u16Total_lines_left > 0 )
9778*53ee8cc1Swenshuai.xi     {
9779*53ee8cc1Swenshuai.xi 
9780*53ee8cc1Swenshuai.xi         if(!msAPI_JPEG_decode_next_row())
9781*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
9782*53ee8cc1Swenshuai.xi 
9783*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("Max line num : %d\n",(_u16Total_lines_left));
9784*53ee8cc1Swenshuai.xi 
9785*53ee8cc1Swenshuai.xi         if(!msAPI_JPEG_transform_row()) //IDCT
9786*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
9787*53ee8cc1Swenshuai.xi 
9788*53ee8cc1Swenshuai.xi         _u16Total_lines_left -= gu8Max_mcu_y_size;
9789*53ee8cc1Swenshuai.xi     }
9790*53ee8cc1Swenshuai.xi 
9791*53ee8cc1Swenshuai.xi     return (E_JPEG_DONE);
9792*53ee8cc1Swenshuai.xi }
9793*53ee8cc1Swenshuai.xi #endif //SW_JPD_RGB_CMYK
9794*53ee8cc1Swenshuai.xi 
9795*53ee8cc1Swenshuai.xi 
9796*53ee8cc1Swenshuai.xi 
MApi_JPEG_DisableAddressConvert(void)9797*53ee8cc1Swenshuai.xi void MApi_JPEG_DisableAddressConvert(void)
9798*53ee8cc1Swenshuai.xi {
9799*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s\n", __FUNCTION__);
9800*53ee8cc1Swenshuai.xi     __bIsMjpeg = FALSE;
9801*53ee8cc1Swenshuai.xi }
9802*53ee8cc1Swenshuai.xi 
9803*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9804*53ee8cc1Swenshuai.xi /********************************************************************/
9805*53ee8cc1Swenshuai.xi ///Get the free memory for temporary usage.
9806*53ee8cc1Swenshuai.xi ///@param size \b IN indicate the size of wanted free memory
9807*53ee8cc1Swenshuai.xi ///@return the physical address of free memory
9808*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetFreeMemory(MS_U32 size)9809*53ee8cc1Swenshuai.xi MS_PHYADDR _MApi_JPEG_GetFreeMemory(MS_U32 size)
9810*53ee8cc1Swenshuai.xi {
9811*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
9812*53ee8cc1Swenshuai.xi     {
9813*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
9814*53ee8cc1Swenshuai.xi         return 0;
9815*53ee8cc1Swenshuai.xi     }
9816*53ee8cc1Swenshuai.xi 
9817*53ee8cc1Swenshuai.xi     if(_bProgressive_flag == TRUE)
9818*53ee8cc1Swenshuai.xi     {
9819*53ee8cc1Swenshuai.xi         return 0;
9820*53ee8cc1Swenshuai.xi     }
9821*53ee8cc1Swenshuai.xi 
9822*53ee8cc1Swenshuai.xi     if(size > (INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE))
9823*53ee8cc1Swenshuai.xi     {
9824*53ee8cc1Swenshuai.xi         return 0;
9825*53ee8cc1Swenshuai.xi     }
9826*53ee8cc1Swenshuai.xi 
9827*53ee8cc1Swenshuai.xi     INTERNAL_BUFFER_SIZE = INTERNAL_BUFFER_SIZE - size;
9828*53ee8cc1Swenshuai.xi 
9829*53ee8cc1Swenshuai.xi     return (MS_VA2PA((MS_U32)INTERNAL_BUFFER_ADDR) + INTERNAL_BUFFER_SIZE);
9830*53ee8cc1Swenshuai.xi }
9831*53ee8cc1Swenshuai.xi 
9832*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9833*53ee8cc1Swenshuai.xi /********************************************************************/
9834*53ee8cc1Swenshuai.xi ///Get the data offset of JPEG file.
9835*53ee8cc1Swenshuai.xi ///@return the data offset of JPEG file
9836*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetDataOffset(void)9837*53ee8cc1Swenshuai.xi MS_U32 _MApi_JPEG_GetDataOffset(void)
9838*53ee8cc1Swenshuai.xi {
9839*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
9840*53ee8cc1Swenshuai.xi     {
9841*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
9842*53ee8cc1Swenshuai.xi         return 0;
9843*53ee8cc1Swenshuai.xi     }
9844*53ee8cc1Swenshuai.xi 
9845*53ee8cc1Swenshuai.xi     if(_bThumbnailAccessMode)
9846*53ee8cc1Swenshuai.xi     {
9847*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: Thumbnail mode!!\n", __FUNCTION__);
9848*53ee8cc1Swenshuai.xi         return 0;
9849*53ee8cc1Swenshuai.xi     }
9850*53ee8cc1Swenshuai.xi 
9851*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s : u32DataOffset =  0x%lx\n", __FUNCTION__ , u32DataOffset);
9852*53ee8cc1Swenshuai.xi     return u32DataOffset;
9853*53ee8cc1Swenshuai.xi }
9854*53ee8cc1Swenshuai.xi 
9855*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9856*53ee8cc1Swenshuai.xi /********************************************************************/
9857*53ee8cc1Swenshuai.xi ///Get the sof marker offset of JPEG file.
9858*53ee8cc1Swenshuai.xi ///@return the sof marker offset of JPEG file
9859*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetSOFOffset(void)9860*53ee8cc1Swenshuai.xi MS_U32 _MApi_JPEG_GetSOFOffset(void)
9861*53ee8cc1Swenshuai.xi {
9862*53ee8cc1Swenshuai.xi     if(_bIsInit == FALSE)
9863*53ee8cc1Swenshuai.xi     {
9864*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
9865*53ee8cc1Swenshuai.xi         return 0;
9866*53ee8cc1Swenshuai.xi     }
9867*53ee8cc1Swenshuai.xi 
9868*53ee8cc1Swenshuai.xi     if(_bThumbnailAccessMode)
9869*53ee8cc1Swenshuai.xi     {
9870*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("%s: Thumbnail mode!!\n", __FUNCTION__);
9871*53ee8cc1Swenshuai.xi         return 0;
9872*53ee8cc1Swenshuai.xi     }
9873*53ee8cc1Swenshuai.xi 
9874*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s : u32SOFOffset =  0x%lx\n", __FUNCTION__ , u32SOFOffset);
9875*53ee8cc1Swenshuai.xi     return u32SOFOffset;
9876*53ee8cc1Swenshuai.xi }
9877*53ee8cc1Swenshuai.xi 
9878*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9879*53ee8cc1Swenshuai.xi /********************************************************************/
9880*53ee8cc1Swenshuai.xi ///Enable/Disable JPD CMYK support.
9881*53ee8cc1Swenshuai.xi ///@param bEnable \b IN enable/disable supporting JPD CMYK
9882*53ee8cc1Swenshuai.xi ///@return E_JPEG_OKAY/E_JPEG_FAILED
9883*53ee8cc1Swenshuai.xi ///Note: It need to be called before init. The default is JPD CMYK support.
9884*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SupportCMYK(MS_BOOL bEnable)9885*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_SupportCMYK(MS_BOOL bEnable)
9886*53ee8cc1Swenshuai.xi {
9887*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
9888*53ee8cc1Swenshuai.xi     bEnableCMYK = bEnable;
9889*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
9890*53ee8cc1Swenshuai.xi #else
9891*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("Not Support CMYK formant!!!\n");
9892*53ee8cc1Swenshuai.xi     UNUSED(bEnable);
9893*53ee8cc1Swenshuai.xi     return E_JPEG_FAILED;
9894*53ee8cc1Swenshuai.xi #endif
9895*53ee8cc1Swenshuai.xi }
9896*53ee8cc1Swenshuai.xi 
9897*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9898*53ee8cc1Swenshuai.xi /********************************************************************/
9899*53ee8cc1Swenshuai.xi ///Enable/Disable JPD RGB support.
9900*53ee8cc1Swenshuai.xi ///@param bEnable \b IN enable/disable supporting JPD RGB
9901*53ee8cc1Swenshuai.xi ///@return E_JPEG_OKAY/E_JPEG_FAILED
9902*53ee8cc1Swenshuai.xi ///Note: It need to be called before init. The default is JPD RGB support.
9903*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SupportRGB(MS_BOOL bEnable)9904*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_SupportRGB(MS_BOOL bEnable)
9905*53ee8cc1Swenshuai.xi {
9906*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
9907*53ee8cc1Swenshuai.xi     bEnableRGB = bEnable;
9908*53ee8cc1Swenshuai.xi     return E_JPEG_OKAY;
9909*53ee8cc1Swenshuai.xi #else
9910*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("Not Support RGB formant!!!\n");
9911*53ee8cc1Swenshuai.xi     UNUSED(bEnable);
9912*53ee8cc1Swenshuai.xi     return E_JPEG_FAILED;
9913*53ee8cc1Swenshuai.xi #endif
9914*53ee8cc1Swenshuai.xi }
9915*53ee8cc1Swenshuai.xi 
9916*53ee8cc1Swenshuai.xi 
9917*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
_MApi_JPEG_IsMPOFormat(void)9918*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_IsMPOFormat( void )
9919*53ee8cc1Swenshuai.xi {
9920*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("MApi_JPEG_IsMPOFormat=%d\n", bIsMPOFormat);
9921*53ee8cc1Swenshuai.xi     return bIsMPOFormat;
9922*53ee8cc1Swenshuai.xi }
9923*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO ** ppMPOIndex)9924*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO **ppMPOIndex)
9925*53ee8cc1Swenshuai.xi {
9926*53ee8cc1Swenshuai.xi     if(_stMPOIndex.num_of_image == 0xFFFFFFFF)
9927*53ee8cc1Swenshuai.xi     {
9928*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("No MPO Index\n");
9929*53ee8cc1Swenshuai.xi         return FALSE;
9930*53ee8cc1Swenshuai.xi     }
9931*53ee8cc1Swenshuai.xi 
9932*53ee8cc1Swenshuai.xi     *ppMPOIndex = &_stMPOIndex;
9933*53ee8cc1Swenshuai.xi     return TRUE;
9934*53ee8cc1Swenshuai.xi }
9935*53ee8cc1Swenshuai.xi 
_MApi_JPEG_GetMPOAttr(MS_U32 image_no,JPEG_MPO_ATTRIBUTE_INFO ** ppMPOAttr)9936*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_GetMPOAttr(MS_U32 image_no, JPEG_MPO_ATTRIBUTE_INFO **ppMPOAttr)
9937*53ee8cc1Swenshuai.xi {
9938*53ee8cc1Swenshuai.xi     if((JPEG_MPO_MAX_SUPPORT_IMAGE < image_no)
9939*53ee8cc1Swenshuai.xi     || (FALSE == _stMPOAttri[image_no - 1].used))
9940*53ee8cc1Swenshuai.xi     {
9941*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("No MPO Attribute with image no. %ld\n", image_no);
9942*53ee8cc1Swenshuai.xi         return FALSE;
9943*53ee8cc1Swenshuai.xi     }
9944*53ee8cc1Swenshuai.xi 
9945*53ee8cc1Swenshuai.xi     *ppMPOAttr = &_stMPOAttri[image_no - 1];
9946*53ee8cc1Swenshuai.xi     return TRUE;
9947*53ee8cc1Swenshuai.xi }
9948*53ee8cc1Swenshuai.xi 
_MApi_JPEG_DumpMPO(void)9949*53ee8cc1Swenshuai.xi void _MApi_JPEG_DumpMPO(void)
9950*53ee8cc1Swenshuai.xi {
9951*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
9952*53ee8cc1Swenshuai.xi 
9953*53ee8cc1Swenshuai.xi     if(_stMPOIndex.num_of_image == 0xFFFFFFFF)
9954*53ee8cc1Swenshuai.xi     {
9955*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("No MPO Index\n");
9956*53ee8cc1Swenshuai.xi         return;
9957*53ee8cc1Swenshuai.xi     }
9958*53ee8cc1Swenshuai.xi 
9959*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("start_of_offset = %ld, num_of_image = %ld\n", _stMPOIndex.start_of_offset, _stMPOIndex.num_of_image);
9960*53ee8cc1Swenshuai.xi     for(i = 0; i<JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
9961*53ee8cc1Swenshuai.xi     {
9962*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("mp_entry[%ld]:attribute = 0x%lx\n", i, _stMPOIndex.mp_entry[i].attribute);
9963*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("mp_entry[%ld]:size = 0x%lx\n", i, _stMPOIndex.mp_entry[i].size);
9964*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("mp_entry[%ld]:offset = 0x%lx\n", i, _stMPOIndex.mp_entry[i].offset);
9965*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("mp_entry[%ld]:image1_no = 0x%x\n", i, _stMPOIndex.mp_entry[i].image1_no);
9966*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("mp_entry[%ld]:image2_no = 0x%x\n", i, _stMPOIndex.mp_entry[i].image2_no);
9967*53ee8cc1Swenshuai.xi 
9968*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:MPIndividualNum = 0x%lx\n", i, _stMPOAttri[i].MPIndividualNum);
9969*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOrientation = 0x%lx\n", i, _stMPOAttri[i].PanOrientation);
9970*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_H.numerator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_H.numerator);
9971*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_H.denominator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_H.denominator);
9972*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_V.numerator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_V.numerator);
9973*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_V.denominator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_V.denominator);
9974*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:BaseViewpointNum = 0x%lx\n", i, _stMPOAttri[i].BaseViewpointNum);
9975*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:ConvergenceAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].ConvergenceAngle.s_numerator);
9976*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:ConvergenceAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].ConvergenceAngle.s_denominator);
9977*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:BaselineLength.numerator = 0x%lx\n", i, _stMPOAttri[i].BaselineLength.numerator);
9978*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:BaselineLength.denominator = 0x%lx\n", i, _stMPOAttri[i].BaselineLength.denominator);
9979*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:VerticalDivergence.s_numerator = 0x%lx\n", i, _stMPOAttri[i].VerticalDivergence.s_numerator);
9980*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:VerticalDivergence.s_denominator = 0x%lx\n", i, _stMPOAttri[i].VerticalDivergence.s_denominator);
9981*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_X.s_numerator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_X.s_numerator);
9982*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_X.s_denominator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_X.s_denominator);
9983*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Y.s_numerator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Y.s_numerator);
9984*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Y.s_denominator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Y.s_denominator);
9985*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Z.s_numerator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Z.s_numerator);
9986*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Z.s_denominator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Z.s_denominator);
9987*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:YawAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].YawAngle.s_numerator);
9988*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:YawAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].YawAngle.s_denominator);
9989*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PitchAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].PitchAngle.s_numerator);
9990*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PitchAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].PitchAngle.s_denominator);
9991*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:RollAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].RollAngle.s_numerator);
9992*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:RollAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].RollAngle.s_denominator);
9993*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:used = 0x%d\n", i, _stMPOAttri[i].used);
9994*53ee8cc1Swenshuai.xi     }
9995*53ee8cc1Swenshuai.xi     return;
9996*53ee8cc1Swenshuai.xi }
9997*53ee8cc1Swenshuai.xi 
_MApi_JPEG_SetMPOBuffer(MS_U32 read_offset,MS_U32 output_start)9998*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_SetMPOBuffer(MS_U32 read_offset, MS_U32 output_start)
9999*53ee8cc1Swenshuai.xi {
10000*53ee8cc1Swenshuai.xi     read_offset = MS_PA2KSEG1((MS_U32)read_offset);// | AEON_NON_CACHE_MASK;
10001*53ee8cc1Swenshuai.xi     output_start = MS_PA2KSEG1((MS_U32)output_start);// | AEON_NON_CACHE_MASK;
10002*53ee8cc1Swenshuai.xi 
10003*53ee8cc1Swenshuai.xi     if((read_offset < MRC_BUFFER_ADDR)
10004*53ee8cc1Swenshuai.xi     || (read_offset > (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE)))
10005*53ee8cc1Swenshuai.xi     {
10006*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("JPEG_SetMPOBuffer, read_offset invalid\n");
10007*53ee8cc1Swenshuai.xi         return FALSE;
10008*53ee8cc1Swenshuai.xi     }
10009*53ee8cc1Swenshuai.xi 
10010*53ee8cc1Swenshuai.xi     if(read_offset > (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE/2))
10011*53ee8cc1Swenshuai.xi     {
10012*53ee8cc1Swenshuai.xi         mpo_load_data = FALSE;
10013*53ee8cc1Swenshuai.xi     }
10014*53ee8cc1Swenshuai.xi 
10015*53ee8cc1Swenshuai.xi     if(output_start < MWC_BUFFER_ADDR)
10016*53ee8cc1Swenshuai.xi     {
10017*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_MSG("JPEG_SetMPOBuffer, output_start invalid\n");
10018*53ee8cc1Swenshuai.xi         return FALSE;
10019*53ee8cc1Swenshuai.xi     }
10020*53ee8cc1Swenshuai.xi 
10021*53ee8cc1Swenshuai.xi     _pu8In_buf_MPO_ofs = (MS_U8*)read_offset;
10022*53ee8cc1Swenshuai.xi     _u32In_buf_MPO_left = (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE) - read_offset;
10023*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("After MApi_JPEG_SetMPOBuffer(), _pu8In_buf_MPO_ofs=0x%lx, _u32In_buf_MPO_left=0x%lx=============\n", (MS_U32)_pu8In_buf_MPO_ofs, (MS_U32)_u32In_buf_MPO_left);
10024*53ee8cc1Swenshuai.xi     MWC_BUFFER_ADDR = output_start;
10025*53ee8cc1Swenshuai.xi     return TRUE;
10026*53ee8cc1Swenshuai.xi }
10027*53ee8cc1Swenshuai.xi 
10028*53ee8cc1Swenshuai.xi /********************************************************************/
10029*53ee8cc1Swenshuai.xi /// Set Max decoding resolution for MPO
10030*53ee8cc1Swenshuai.xi ///@param -u16Width \b IN : indicate max decoding width
10031*53ee8cc1Swenshuai.xi ///@param -u16Height \b IN : indicate max decoding height
10032*53ee8cc1Swenshuai.xi ///@return None
10033*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)10034*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
10035*53ee8cc1Swenshuai.xi {
10036*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: Width = %d, Height = %d\n", __FUNCTION__, u16Width, u16Height);
10037*53ee8cc1Swenshuai.xi     JPEG_MPO_MAX_WIDTH = u16Width;
10038*53ee8cc1Swenshuai.xi     JPEG_MPO_MAX_HEIGHT = u16Height;
10039*53ee8cc1Swenshuai.xi     return;
10040*53ee8cc1Swenshuai.xi }
10041*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
10042*53ee8cc1Swenshuai.xi /********************************************************************/
10043*53ee8cc1Swenshuai.xi /// Set Max decoding resolution of Progressive MPO
10044*53ee8cc1Swenshuai.xi ///@param -u16ProWidth \b IN : indicate max decoding width
10045*53ee8cc1Swenshuai.xi ///@param -u16ProHeight \b IN : indicate max decoding height
10046*53ee8cc1Swenshuai.xi ///@return None
10047*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)10048*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
10049*53ee8cc1Swenshuai.xi {
10050*53ee8cc1Swenshuai.xi     JPEG_DEBUG_API_MSG("%s: ProWidth = %d, ProHeight = %d\n", __FUNCTION__, u16ProWidth, u16ProHeight);
10051*53ee8cc1Swenshuai.xi     JPEG_MPO_PRO_MAX_WIDTH = u16ProWidth;
10052*53ee8cc1Swenshuai.xi     JPEG_MPO_PRO_MAX_HEIGHT = u16ProHeight;
10053*53ee8cc1Swenshuai.xi     return;
10054*53ee8cc1Swenshuai.xi }
10055*53ee8cc1Swenshuai.xi 
10056*53ee8cc1Swenshuai.xi #endif
10057*53ee8cc1Swenshuai.xi 
msAPI_JPEG_get_APP0_info(MS_U8 * unit,MS_U16 * x,MS_U16 * y)10058*53ee8cc1Swenshuai.xi void msAPI_JPEG_get_APP0_info( MS_U8 *unit,MS_U16 *x, MS_U16 *y )
10059*53ee8cc1Swenshuai.xi {
10060*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10061*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10062*53ee8cc1Swenshuai.xi     {
10063*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10064*53ee8cc1Swenshuai.xi         return;
10065*53ee8cc1Swenshuai.xi     }
10066*53ee8cc1Swenshuai.xi 
10067*53ee8cc1Swenshuai.xi     JPEG_GETAPP0INFO_PARAM App0Info;
10068*53ee8cc1Swenshuai.xi     memset(&App0Info , 0 ,sizeof(JPEG_GETAPP0INFO_PARAM));
10069*53ee8cc1Swenshuai.xi     App0Info.unit= unit;
10070*53ee8cc1Swenshuai.xi     App0Info.x= x;
10071*53ee8cc1Swenshuai.xi     App0Info.y= y;
10072*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_get_APP0_info\n");
10073*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_get_APP0_info, (void*)(&App0Info)) != UTOPIA_STATUS_SUCCESS)
10074*53ee8cc1Swenshuai.xi     {
10075*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10076*53ee8cc1Swenshuai.xi     }
10077*53ee8cc1Swenshuai.xi #else
10078*53ee8cc1Swenshuai.xi     _msAPI_JPEG_get_APP0_info(unit, x, y );
10079*53ee8cc1Swenshuai.xi #endif
10080*53ee8cc1Swenshuai.xi }
10081*53ee8cc1Swenshuai.xi 
MApi_JPEG_Init(JPEG_InitParam * pInitParam)10082*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_Init(JPEG_InitParam *pInitParam)
10083*53ee8cc1Swenshuai.xi {
10084*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10085*53ee8cc1Swenshuai.xi     if (pInstantJPD == NULL)
10086*53ee8cc1Swenshuai.xi     {
10087*53ee8cc1Swenshuai.xi         if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
10088*53ee8cc1Swenshuai.xi         {
10089*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Open JPD fail\n");
10090*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
10091*53ee8cc1Swenshuai.xi         }
10092*53ee8cc1Swenshuai.xi     }
10093*53ee8cc1Swenshuai.xi 
10094*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10095*53ee8cc1Swenshuai.xi     {
10096*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10097*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
10098*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
10099*53ee8cc1Swenshuai.xi     }
10100*53ee8cc1Swenshuai.xi 
10101*53ee8cc1Swenshuai.xi     JPEG_INIT_PARAM InitPara;
10102*53ee8cc1Swenshuai.xi     memset(&InitPara , 0 ,sizeof(JPEG_INIT_PARAM));
10103*53ee8cc1Swenshuai.xi     InitPara.pInitParam = pInitParam;
10104*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Init\n");
10105*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_Init, (void*)(&InitPara)) != UTOPIA_STATUS_SUCCESS)
10106*53ee8cc1Swenshuai.xi     {
10107*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10108*53ee8cc1Swenshuai.xi         InitPara.retVal= E_JPEG_FAILED;
10109*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
10110*53ee8cc1Swenshuai.xi         pInstantJPD = NULL;
10111*53ee8cc1Swenshuai.xi     }
10112*53ee8cc1Swenshuai.xi     return InitPara.retVal;
10113*53ee8cc1Swenshuai.xi #else
10114*53ee8cc1Swenshuai.xi     return _MApi_JPEG_Init(pInitParam);
10115*53ee8cc1Swenshuai.xi #endif
10116*53ee8cc1Swenshuai.xi }
10117*53ee8cc1Swenshuai.xi 
MApi_JPEG_DecodeHdr(void)10118*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_DecodeHdr(void)
10119*53ee8cc1Swenshuai.xi {
10120*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10121*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10122*53ee8cc1Swenshuai.xi     {
10123*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10124*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
10125*53ee8cc1Swenshuai.xi     }
10126*53ee8cc1Swenshuai.xi 
10127*53ee8cc1Swenshuai.xi     JPEG_RESULT_PARAM ResPara;
10128*53ee8cc1Swenshuai.xi     memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
10129*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_DecodeHdr\n");
10130*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_DecodeHdr, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
10131*53ee8cc1Swenshuai.xi     {
10132*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10133*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
10134*53ee8cc1Swenshuai.xi     }
10135*53ee8cc1Swenshuai.xi     return ResPara.retVal;
10136*53ee8cc1Swenshuai.xi #else
10137*53ee8cc1Swenshuai.xi     return _MApi_JPEG_DecodeHdr();
10138*53ee8cc1Swenshuai.xi #endif
10139*53ee8cc1Swenshuai.xi }
10140*53ee8cc1Swenshuai.xi 
MApi_JPEG_Decode(void)10141*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_Decode(void)
10142*53ee8cc1Swenshuai.xi {
10143*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10144*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10145*53ee8cc1Swenshuai.xi     {
10146*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10147*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
10148*53ee8cc1Swenshuai.xi     }
10149*53ee8cc1Swenshuai.xi 
10150*53ee8cc1Swenshuai.xi     JPEG_RESULT_PARAM ResPara;
10151*53ee8cc1Swenshuai.xi     memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
10152*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Decode\n");
10153*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_Decode, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
10154*53ee8cc1Swenshuai.xi     {
10155*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10156*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
10157*53ee8cc1Swenshuai.xi     }
10158*53ee8cc1Swenshuai.xi     return ResPara.retVal;
10159*53ee8cc1Swenshuai.xi #else
10160*53ee8cc1Swenshuai.xi     return _MApi_JPEG_Decode();
10161*53ee8cc1Swenshuai.xi #endif
10162*53ee8cc1Swenshuai.xi }
10163*53ee8cc1Swenshuai.xi 
MApi_JPEG_Exit(void)10164*53ee8cc1Swenshuai.xi void MApi_JPEG_Exit(void)
10165*53ee8cc1Swenshuai.xi {
10166*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10167*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10168*53ee8cc1Swenshuai.xi     {
10169*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10170*53ee8cc1Swenshuai.xi         return;
10171*53ee8cc1Swenshuai.xi     }
10172*53ee8cc1Swenshuai.xi 
10173*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Exit\n");
10174*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_Exit, NULL) != UTOPIA_STATUS_SUCCESS)
10175*53ee8cc1Swenshuai.xi     {
10176*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10177*53ee8cc1Swenshuai.xi     }
10178*53ee8cc1Swenshuai.xi     else
10179*53ee8cc1Swenshuai.xi     {
10180*53ee8cc1Swenshuai.xi         if(UtopiaClose(pInstantJPD) != UTOPIA_STATUS_SUCCESS)
10181*53ee8cc1Swenshuai.xi         {
10182*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Utopia Close JPD failed\n");
10183*53ee8cc1Swenshuai.xi             return;
10184*53ee8cc1Swenshuai.xi         }
10185*53ee8cc1Swenshuai.xi         pInstantJPD = NULL;
10186*53ee8cc1Swenshuai.xi     }
10187*53ee8cc1Swenshuai.xi 
10188*53ee8cc1Swenshuai.xi #else
10189*53ee8cc1Swenshuai.xi     _MApi_JPEG_Exit();
10190*53ee8cc1Swenshuai.xi #endif
10191*53ee8cc1Swenshuai.xi }
10192*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetErrorCode(void)10193*53ee8cc1Swenshuai.xi JPEG_ErrCode MApi_JPEG_GetErrorCode(void)
10194*53ee8cc1Swenshuai.xi {
10195*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10196*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10197*53ee8cc1Swenshuai.xi     {
10198*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10199*53ee8cc1Swenshuai.xi         return E_JPEG_NOT_INIT;
10200*53ee8cc1Swenshuai.xi     }
10201*53ee8cc1Swenshuai.xi 
10202*53ee8cc1Swenshuai.xi     JPEG_GETERRORCODE_PARAM GetErrorCode;
10203*53ee8cc1Swenshuai.xi     memset(&GetErrorCode , 0 ,sizeof(JPEG_GETERRORCODE_PARAM));
10204*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetErrorCode\n");
10205*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetErrorCode, (void*)(&GetErrorCode)) != UTOPIA_STATUS_SUCCESS)
10206*53ee8cc1Swenshuai.xi     {
10207*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10208*53ee8cc1Swenshuai.xi         return E_JPEG_NOT_INIT;
10209*53ee8cc1Swenshuai.xi     }
10210*53ee8cc1Swenshuai.xi     return GetErrorCode.ErrCode;
10211*53ee8cc1Swenshuai.xi #else
10212*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetErrorCode();
10213*53ee8cc1Swenshuai.xi #endif
10214*53ee8cc1Swenshuai.xi }
10215*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetJPDEventFlag(void)10216*53ee8cc1Swenshuai.xi JPEG_Event MApi_JPEG_GetJPDEventFlag(void)
10217*53ee8cc1Swenshuai.xi {
10218*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10219*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10220*53ee8cc1Swenshuai.xi     {
10221*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10222*53ee8cc1Swenshuai.xi         return 0;
10223*53ee8cc1Swenshuai.xi     }
10224*53ee8cc1Swenshuai.xi 
10225*53ee8cc1Swenshuai.xi     JPEG_JPEGEVENT_PARAM JpegEvent;
10226*53ee8cc1Swenshuai.xi     memset(&JpegEvent , 0 ,sizeof(JPEG_JPEGEVENT_PARAM));
10227*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetJPDEventFlag\n");
10228*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetJPDEventFlag, (void*)(&JpegEvent)) != UTOPIA_STATUS_SUCCESS)
10229*53ee8cc1Swenshuai.xi     {
10230*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10231*53ee8cc1Swenshuai.xi         return 0;
10232*53ee8cc1Swenshuai.xi     }
10233*53ee8cc1Swenshuai.xi     return JpegEvent.eEvtVal;
10234*53ee8cc1Swenshuai.xi #else
10235*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetJPDEventFlag();
10236*53ee8cc1Swenshuai.xi #endif
10237*53ee8cc1Swenshuai.xi }
10238*53ee8cc1Swenshuai.xi 
MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)10239*53ee8cc1Swenshuai.xi void MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)
10240*53ee8cc1Swenshuai.xi {
10241*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10242*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10243*53ee8cc1Swenshuai.xi     {
10244*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10245*53ee8cc1Swenshuai.xi         return;
10246*53ee8cc1Swenshuai.xi     }
10247*53ee8cc1Swenshuai.xi 
10248*53ee8cc1Swenshuai.xi     JPEG_JPEGEVENT_PARAM JpegEvent;
10249*53ee8cc1Swenshuai.xi     memset(&JpegEvent , 0 ,sizeof(JPEG_JPEGEVENT_PARAM));
10250*53ee8cc1Swenshuai.xi     JpegEvent.eEvtVal = eEvtVal;
10251*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetJPDEventFlag\n");
10252*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetJPDEventFlag, (void*)(&JpegEvent)) != UTOPIA_STATUS_SUCCESS)
10253*53ee8cc1Swenshuai.xi     {
10254*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10255*53ee8cc1Swenshuai.xi     }
10256*53ee8cc1Swenshuai.xi #else
10257*53ee8cc1Swenshuai.xi     _MApi_JPEG_SetJPDEventFlag(eEvtVal);
10258*53ee8cc1Swenshuai.xi #endif
10259*53ee8cc1Swenshuai.xi }
10260*53ee8cc1Swenshuai.xi 
MApi_JPEG_Rst(void)10261*53ee8cc1Swenshuai.xi void MApi_JPEG_Rst(void)
10262*53ee8cc1Swenshuai.xi {
10263*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10264*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10265*53ee8cc1Swenshuai.xi     {
10266*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10267*53ee8cc1Swenshuai.xi         return;
10268*53ee8cc1Swenshuai.xi     }
10269*53ee8cc1Swenshuai.xi 
10270*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Rst\n");
10271*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_Rst, NULL) != UTOPIA_STATUS_SUCCESS)
10272*53ee8cc1Swenshuai.xi     {
10273*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10274*53ee8cc1Swenshuai.xi     }
10275*53ee8cc1Swenshuai.xi #else
10276*53ee8cc1Swenshuai.xi     _MApi_JPEG_Rst();
10277*53ee8cc1Swenshuai.xi #endif
10278*53ee8cc1Swenshuai.xi }
10279*53ee8cc1Swenshuai.xi 
MApi_JPEG_PowerOn(void)10280*53ee8cc1Swenshuai.xi void MApi_JPEG_PowerOn(void)
10281*53ee8cc1Swenshuai.xi {
10282*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10283*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10284*53ee8cc1Swenshuai.xi     {
10285*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10286*53ee8cc1Swenshuai.xi         return;
10287*53ee8cc1Swenshuai.xi     }
10288*53ee8cc1Swenshuai.xi 
10289*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_PowerOn\n");
10290*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_PowerOn, NULL) != UTOPIA_STATUS_SUCCESS)
10291*53ee8cc1Swenshuai.xi     {
10292*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10293*53ee8cc1Swenshuai.xi     }
10294*53ee8cc1Swenshuai.xi #else
10295*53ee8cc1Swenshuai.xi     _MApi_JPEG_PowerOn();
10296*53ee8cc1Swenshuai.xi #endif
10297*53ee8cc1Swenshuai.xi }
10298*53ee8cc1Swenshuai.xi 
MApi_JPEG_PowerOff(void)10299*53ee8cc1Swenshuai.xi void MApi_JPEG_PowerOff(void)
10300*53ee8cc1Swenshuai.xi {
10301*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10302*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10303*53ee8cc1Swenshuai.xi     {
10304*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10305*53ee8cc1Swenshuai.xi         return;
10306*53ee8cc1Swenshuai.xi     }
10307*53ee8cc1Swenshuai.xi 
10308*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_PowerOff\n");
10309*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_PowerOff, NULL) != UTOPIA_STATUS_SUCCESS)
10310*53ee8cc1Swenshuai.xi     {
10311*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10312*53ee8cc1Swenshuai.xi     }
10313*53ee8cc1Swenshuai.xi #else
10314*53ee8cc1Swenshuai.xi     _MApi_JPEG_PowerOff();
10315*53ee8cc1Swenshuai.xi #endif
10316*53ee8cc1Swenshuai.xi }
10317*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetCurVidx(void)10318*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetCurVidx(void)
10319*53ee8cc1Swenshuai.xi {
10320*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10321*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10322*53ee8cc1Swenshuai.xi     {
10323*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10324*53ee8cc1Swenshuai.xi         return 0;
10325*53ee8cc1Swenshuai.xi     }
10326*53ee8cc1Swenshuai.xi 
10327*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10328*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10329*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetCurVidx\n");
10330*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetCurVidx, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10331*53ee8cc1Swenshuai.xi     {
10332*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10333*53ee8cc1Swenshuai.xi         return 0;
10334*53ee8cc1Swenshuai.xi     }
10335*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10336*53ee8cc1Swenshuai.xi #else
10337*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetCurVidx();
10338*53ee8cc1Swenshuai.xi #endif
10339*53ee8cc1Swenshuai.xi }
10340*53ee8cc1Swenshuai.xi 
MApi_JPEG_IsProgressive(void)10341*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_IsProgressive(void)
10342*53ee8cc1Swenshuai.xi {
10343*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10344*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10345*53ee8cc1Swenshuai.xi     {
10346*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10347*53ee8cc1Swenshuai.xi         return 0;
10348*53ee8cc1Swenshuai.xi     }
10349*53ee8cc1Swenshuai.xi 
10350*53ee8cc1Swenshuai.xi     JPEG_BOOL_PARAM bPARA;
10351*53ee8cc1Swenshuai.xi     memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
10352*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_IsProgressive\n");
10353*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_IsProgressive, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
10354*53ee8cc1Swenshuai.xi     {
10355*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10356*53ee8cc1Swenshuai.xi         return 0;
10357*53ee8cc1Swenshuai.xi     }
10358*53ee8cc1Swenshuai.xi     return bPARA.bValue;
10359*53ee8cc1Swenshuai.xi #else
10360*53ee8cc1Swenshuai.xi     return _MApi_JPEG_IsProgressive();
10361*53ee8cc1Swenshuai.xi #endif
10362*53ee8cc1Swenshuai.xi }
10363*53ee8cc1Swenshuai.xi 
MApi_JPEG_ThumbnailFound(void)10364*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_ThumbnailFound(void)
10365*53ee8cc1Swenshuai.xi {
10366*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10367*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10368*53ee8cc1Swenshuai.xi     {
10369*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10370*53ee8cc1Swenshuai.xi         return 0;
10371*53ee8cc1Swenshuai.xi     }
10372*53ee8cc1Swenshuai.xi 
10373*53ee8cc1Swenshuai.xi     JPEG_BOOL_PARAM bPARA;
10374*53ee8cc1Swenshuai.xi     memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
10375*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_ThumbnailFound\n");
10376*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_ThumbnailFound, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
10377*53ee8cc1Swenshuai.xi     {
10378*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10379*53ee8cc1Swenshuai.xi         return 0;
10380*53ee8cc1Swenshuai.xi     }
10381*53ee8cc1Swenshuai.xi     return bPARA.bValue;
10382*53ee8cc1Swenshuai.xi #else
10383*53ee8cc1Swenshuai.xi     return _MApi_JPEG_ThumbnailFound();
10384*53ee8cc1Swenshuai.xi #endif
10385*53ee8cc1Swenshuai.xi }
10386*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetWidth(void)10387*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetWidth(void)
10388*53ee8cc1Swenshuai.xi {
10389*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10390*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10391*53ee8cc1Swenshuai.xi     {
10392*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10393*53ee8cc1Swenshuai.xi         return 0;
10394*53ee8cc1Swenshuai.xi     }
10395*53ee8cc1Swenshuai.xi 
10396*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10397*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10398*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetWidth\n");
10399*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10400*53ee8cc1Swenshuai.xi     {
10401*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10402*53ee8cc1Swenshuai.xi         return 0;
10403*53ee8cc1Swenshuai.xi     }
10404*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10405*53ee8cc1Swenshuai.xi #else
10406*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetWidth();
10407*53ee8cc1Swenshuai.xi #endif
10408*53ee8cc1Swenshuai.xi }
10409*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetHeight(void)10410*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetHeight(void)
10411*53ee8cc1Swenshuai.xi {
10412*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10413*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10414*53ee8cc1Swenshuai.xi     {
10415*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10416*53ee8cc1Swenshuai.xi         return 0;
10417*53ee8cc1Swenshuai.xi     }
10418*53ee8cc1Swenshuai.xi 
10419*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10420*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10421*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetHeight\n");
10422*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10423*53ee8cc1Swenshuai.xi     {
10424*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10425*53ee8cc1Swenshuai.xi         return 0;
10426*53ee8cc1Swenshuai.xi     }
10427*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10428*53ee8cc1Swenshuai.xi #else
10429*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetHeight();
10430*53ee8cc1Swenshuai.xi #endif
10431*53ee8cc1Swenshuai.xi }
10432*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetOriginalWidth(void)10433*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetOriginalWidth(void)
10434*53ee8cc1Swenshuai.xi {
10435*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10436*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10437*53ee8cc1Swenshuai.xi     {
10438*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10439*53ee8cc1Swenshuai.xi         return 0;
10440*53ee8cc1Swenshuai.xi     }
10441*53ee8cc1Swenshuai.xi 
10442*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10443*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10444*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetOriginalWidth\n");
10445*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetOriginalWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10446*53ee8cc1Swenshuai.xi     {
10447*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10448*53ee8cc1Swenshuai.xi         return 0;
10449*53ee8cc1Swenshuai.xi     }
10450*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10451*53ee8cc1Swenshuai.xi #else
10452*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetOriginalWidth();
10453*53ee8cc1Swenshuai.xi #endif
10454*53ee8cc1Swenshuai.xi }
10455*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetOriginalHeight(void)10456*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetOriginalHeight(void)
10457*53ee8cc1Swenshuai.xi {
10458*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10459*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10460*53ee8cc1Swenshuai.xi     {
10461*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10462*53ee8cc1Swenshuai.xi         return 0;
10463*53ee8cc1Swenshuai.xi     }
10464*53ee8cc1Swenshuai.xi 
10465*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10466*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10467*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetOriginalHeight\n");
10468*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetOriginalHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10469*53ee8cc1Swenshuai.xi     {
10470*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10471*53ee8cc1Swenshuai.xi         return 0;
10472*53ee8cc1Swenshuai.xi     }
10473*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10474*53ee8cc1Swenshuai.xi #else
10475*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetOriginalHeight();
10476*53ee8cc1Swenshuai.xi #endif
10477*53ee8cc1Swenshuai.xi }
10478*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetNonAlignmentWidth(void)10479*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetNonAlignmentWidth(void)
10480*53ee8cc1Swenshuai.xi {
10481*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10482*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10483*53ee8cc1Swenshuai.xi     {
10484*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10485*53ee8cc1Swenshuai.xi         return 0;
10486*53ee8cc1Swenshuai.xi     }
10487*53ee8cc1Swenshuai.xi 
10488*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10489*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10490*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetNonAlignmentWidth\n");
10491*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetNonAlignmentWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10492*53ee8cc1Swenshuai.xi     {
10493*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10494*53ee8cc1Swenshuai.xi         return 0;
10495*53ee8cc1Swenshuai.xi     }
10496*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10497*53ee8cc1Swenshuai.xi #else
10498*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetNonAlignmentWidth();
10499*53ee8cc1Swenshuai.xi #endif
10500*53ee8cc1Swenshuai.xi }
10501*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetNonAlignmentHeight(void)10502*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetNonAlignmentHeight(void)
10503*53ee8cc1Swenshuai.xi {
10504*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10505*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10506*53ee8cc1Swenshuai.xi     {
10507*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10508*53ee8cc1Swenshuai.xi         return 0;
10509*53ee8cc1Swenshuai.xi     }
10510*53ee8cc1Swenshuai.xi 
10511*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10512*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10513*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetNonAlignmentHeight\n");
10514*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetNonAlignmentHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10515*53ee8cc1Swenshuai.xi     {
10516*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10517*53ee8cc1Swenshuai.xi         return 0;
10518*53ee8cc1Swenshuai.xi     }
10519*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10520*53ee8cc1Swenshuai.xi #else
10521*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetWidth();
10522*53ee8cc1Swenshuai.xi #endif
10523*53ee8cc1Swenshuai.xi }
10524*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetAlignedPitch(void)10525*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedPitch(void)
10526*53ee8cc1Swenshuai.xi {
10527*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10528*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10529*53ee8cc1Swenshuai.xi     {
10530*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10531*53ee8cc1Swenshuai.xi         return 0;
10532*53ee8cc1Swenshuai.xi     }
10533*53ee8cc1Swenshuai.xi 
10534*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10535*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10536*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedPitch\n");
10537*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetAlignedPitch, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10538*53ee8cc1Swenshuai.xi     {
10539*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10540*53ee8cc1Swenshuai.xi         return 0;
10541*53ee8cc1Swenshuai.xi     }
10542*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10543*53ee8cc1Swenshuai.xi #else
10544*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetAlignedPitch();
10545*53ee8cc1Swenshuai.xi #endif
10546*53ee8cc1Swenshuai.xi }
10547*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetAlignedPitch_H(void)10548*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedPitch_H(void)
10549*53ee8cc1Swenshuai.xi {
10550*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10551*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10552*53ee8cc1Swenshuai.xi     {
10553*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10554*53ee8cc1Swenshuai.xi         return 0;
10555*53ee8cc1Swenshuai.xi     }
10556*53ee8cc1Swenshuai.xi 
10557*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10558*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10559*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedPitch_H\n");
10560*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetAlignedPitch_H, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10561*53ee8cc1Swenshuai.xi     {
10562*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10563*53ee8cc1Swenshuai.xi         return 0;
10564*53ee8cc1Swenshuai.xi     }
10565*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10566*53ee8cc1Swenshuai.xi #else
10567*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetAlignedPitch_H();
10568*53ee8cc1Swenshuai.xi #endif
10569*53ee8cc1Swenshuai.xi }
10570*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetAlignedWidth(void)10571*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedWidth(void)
10572*53ee8cc1Swenshuai.xi {
10573*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10574*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10575*53ee8cc1Swenshuai.xi     {
10576*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10577*53ee8cc1Swenshuai.xi         return 0;
10578*53ee8cc1Swenshuai.xi     }
10579*53ee8cc1Swenshuai.xi 
10580*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10581*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10582*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedWidth\n");
10583*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetAlignedWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10584*53ee8cc1Swenshuai.xi     {
10585*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10586*53ee8cc1Swenshuai.xi         return 0;
10587*53ee8cc1Swenshuai.xi     }
10588*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10589*53ee8cc1Swenshuai.xi #else
10590*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetAlignedWidth();
10591*53ee8cc1Swenshuai.xi #endif
10592*53ee8cc1Swenshuai.xi }
10593*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetAlignedHeight(void)10594*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedHeight(void)
10595*53ee8cc1Swenshuai.xi {
10596*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10597*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10598*53ee8cc1Swenshuai.xi     {
10599*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10600*53ee8cc1Swenshuai.xi         return 0;
10601*53ee8cc1Swenshuai.xi     }
10602*53ee8cc1Swenshuai.xi 
10603*53ee8cc1Swenshuai.xi     JPEG_U16_PARAM U16PARA;
10604*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10605*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedHeight\n");
10606*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetAlignedHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10607*53ee8cc1Swenshuai.xi     {
10608*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10609*53ee8cc1Swenshuai.xi         return 0;
10610*53ee8cc1Swenshuai.xi     }
10611*53ee8cc1Swenshuai.xi     return U16PARA.u16Value;
10612*53ee8cc1Swenshuai.xi #else
10613*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetAlignedHeight();
10614*53ee8cc1Swenshuai.xi #endif
10615*53ee8cc1Swenshuai.xi }
10616*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetScaleDownFactor(void)10617*53ee8cc1Swenshuai.xi MS_U8 MApi_JPEG_GetScaleDownFactor(void)
10618*53ee8cc1Swenshuai.xi {
10619*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10620*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10621*53ee8cc1Swenshuai.xi     {
10622*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10623*53ee8cc1Swenshuai.xi         return 0;
10624*53ee8cc1Swenshuai.xi     }
10625*53ee8cc1Swenshuai.xi 
10626*53ee8cc1Swenshuai.xi     JPEG_U8_PARAM U8PARA;
10627*53ee8cc1Swenshuai.xi     memset(&U8PARA , 0 ,sizeof(JPEG_U8_PARAM));
10628*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetScaleDownFactor\n");
10629*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetScaleDownFactor, (void*)(&U8PARA)) != UTOPIA_STATUS_SUCCESS)
10630*53ee8cc1Swenshuai.xi     {
10631*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10632*53ee8cc1Swenshuai.xi         return 0;
10633*53ee8cc1Swenshuai.xi     }
10634*53ee8cc1Swenshuai.xi     return U8PARA.u8Value;
10635*53ee8cc1Swenshuai.xi #else
10636*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetScaleDownFactor();
10637*53ee8cc1Swenshuai.xi #endif
10638*53ee8cc1Swenshuai.xi }
10639*53ee8cc1Swenshuai.xi 
MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)10640*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
10641*53ee8cc1Swenshuai.xi {
10642*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10643*53ee8cc1Swenshuai.xi     if (pInstantJPD == NULL)
10644*53ee8cc1Swenshuai.xi     {
10645*53ee8cc1Swenshuai.xi         if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
10646*53ee8cc1Swenshuai.xi         {
10647*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Open JPD fail\n");
10648*53ee8cc1Swenshuai.xi             return;
10649*53ee8cc1Swenshuai.xi         }
10650*53ee8cc1Swenshuai.xi     }
10651*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10652*53ee8cc1Swenshuai.xi     {
10653*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10654*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
10655*53ee8cc1Swenshuai.xi         return;
10656*53ee8cc1Swenshuai.xi     }
10657*53ee8cc1Swenshuai.xi 
10658*53ee8cc1Swenshuai.xi     JPEG_RESOLUTION_PARAM Resol;
10659*53ee8cc1Swenshuai.xi     memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
10660*53ee8cc1Swenshuai.xi     Resol.u16Width= u16Width;
10661*53ee8cc1Swenshuai.xi     Resol.u16Height= u16Height;
10662*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMaxDecodeResolution\n");
10663*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
10664*53ee8cc1Swenshuai.xi     {
10665*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10666*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
10667*53ee8cc1Swenshuai.xi         pInstantJPD = NULL;
10668*53ee8cc1Swenshuai.xi     }
10669*53ee8cc1Swenshuai.xi #else
10670*53ee8cc1Swenshuai.xi     _MApi_JPEG_SetMaxDecodeResolution(u16Width, u16Height);
10671*53ee8cc1Swenshuai.xi #endif
10672*53ee8cc1Swenshuai.xi }
10673*53ee8cc1Swenshuai.xi 
MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)10674*53ee8cc1Swenshuai.xi void MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
10675*53ee8cc1Swenshuai.xi {
10676*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10677*53ee8cc1Swenshuai.xi     if (pInstantJPD == NULL)
10678*53ee8cc1Swenshuai.xi     {
10679*53ee8cc1Swenshuai.xi         if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
10680*53ee8cc1Swenshuai.xi         {
10681*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Open JPD fail\n");
10682*53ee8cc1Swenshuai.xi             return;
10683*53ee8cc1Swenshuai.xi         }
10684*53ee8cc1Swenshuai.xi     }
10685*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10686*53ee8cc1Swenshuai.xi     {
10687*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10688*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
10689*53ee8cc1Swenshuai.xi         return;
10690*53ee8cc1Swenshuai.xi     }
10691*53ee8cc1Swenshuai.xi 
10692*53ee8cc1Swenshuai.xi     JPEG_RESOLUTION_PARAM Resol;
10693*53ee8cc1Swenshuai.xi     memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
10694*53ee8cc1Swenshuai.xi     Resol.u16Width= u16ProWidth;
10695*53ee8cc1Swenshuai.xi     Resol.u16Height= u16ProHeight;
10696*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetProMaxDecodeResolution\n");
10697*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetProMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
10698*53ee8cc1Swenshuai.xi     {
10699*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10700*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
10701*53ee8cc1Swenshuai.xi         pInstantJPD = NULL;
10702*53ee8cc1Swenshuai.xi     }
10703*53ee8cc1Swenshuai.xi #else
10704*53ee8cc1Swenshuai.xi     _MApi_JPEG_SetProMaxDecodeResolution(u16ProWidth, u16ProHeight);
10705*53ee8cc1Swenshuai.xi #endif
10706*53ee8cc1Swenshuai.xi }
10707*53ee8cc1Swenshuai.xi 
MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)10708*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)
10709*53ee8cc1Swenshuai.xi {
10710*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10711*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10712*53ee8cc1Swenshuai.xi     {
10713*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10714*53ee8cc1Swenshuai.xi         return;
10715*53ee8cc1Swenshuai.xi     }
10716*53ee8cc1Swenshuai.xi 
10717*53ee8cc1Swenshuai.xi     JPEG_SETMBUFFERVALID_PARAM MBuffValid;
10718*53ee8cc1Swenshuai.xi     memset(&MBuffValid , 0 ,sizeof(JPEG_SETMBUFFERVALID_PARAM));
10719*53ee8cc1Swenshuai.xi     MBuffValid.u8MRBuffType = u8MRBuffType;
10720*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMRBufferValid\n");
10721*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMRBufferValid, (void*)(&MBuffValid)) != UTOPIA_STATUS_SUCCESS)
10722*53ee8cc1Swenshuai.xi     {
10723*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10724*53ee8cc1Swenshuai.xi     }
10725*53ee8cc1Swenshuai.xi #else
10726*53ee8cc1Swenshuai.xi     _MApi_JPEG_SetMRBufferValid(u8MRBuffType);
10727*53ee8cc1Swenshuai.xi #endif
10728*53ee8cc1Swenshuai.xi }
10729*53ee8cc1Swenshuai.xi 
MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead,MS_BOOL bEOFflag)10730*53ee8cc1Swenshuai.xi void MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead, MS_BOOL bEOFflag)
10731*53ee8cc1Swenshuai.xi {
10732*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10733*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10734*53ee8cc1Swenshuai.xi     {
10735*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10736*53ee8cc1Swenshuai.xi         return;
10737*53ee8cc1Swenshuai.xi     }
10738*53ee8cc1Swenshuai.xi 
10739*53ee8cc1Swenshuai.xi     JPEG_UPDATEREADINFO_PARAM ReadInfo;
10740*53ee8cc1Swenshuai.xi     memset(&ReadInfo , 0 ,sizeof(JPEG_UPDATEREADINFO_PARAM));
10741*53ee8cc1Swenshuai.xi     ReadInfo.u32DataRead = u32DataRead;
10742*53ee8cc1Swenshuai.xi     ReadInfo.bEOFflag = bEOFflag;
10743*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_UpdateReadInfo\n");
10744*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_UpdateReadInfo, (void*)(&ReadInfo)) != UTOPIA_STATUS_SUCCESS)
10745*53ee8cc1Swenshuai.xi     {
10746*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10747*53ee8cc1Swenshuai.xi     }
10748*53ee8cc1Swenshuai.xi #else
10749*53ee8cc1Swenshuai.xi     _MApi_JPEG_UpdateReadInfo(u32DataRead, bEOFflag);
10750*53ee8cc1Swenshuai.xi #endif
10751*53ee8cc1Swenshuai.xi }
10752*53ee8cc1Swenshuai.xi 
MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)10753*53ee8cc1Swenshuai.xi void MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)
10754*53ee8cc1Swenshuai.xi {
10755*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10756*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10757*53ee8cc1Swenshuai.xi     {
10758*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10759*53ee8cc1Swenshuai.xi         return;
10760*53ee8cc1Swenshuai.xi     }
10761*53ee8cc1Swenshuai.xi 
10762*53ee8cc1Swenshuai.xi     JPEG_PROCESSEOF_PARAM EofPara;
10763*53ee8cc1Swenshuai.xi     memset(&EofPara , 0 ,sizeof(JPEG_PROCESSEOF_PARAM));
10764*53ee8cc1Swenshuai.xi     EofPara.u8MRBuffType = u8MRBuffType;
10765*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_ProcessEOF\n");
10766*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_ProcessEOF, (void*)(&EofPara)) != UTOPIA_STATUS_SUCCESS)
10767*53ee8cc1Swenshuai.xi     {
10768*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10769*53ee8cc1Swenshuai.xi     }
10770*53ee8cc1Swenshuai.xi #else
10771*53ee8cc1Swenshuai.xi     _MApi_JPEG_ProcessEOF(u8MRBuffType);
10772*53ee8cc1Swenshuai.xi #endif
10773*53ee8cc1Swenshuai.xi }
10774*53ee8cc1Swenshuai.xi 
MApi_JPEG_SetErrCode(JPEG_ErrCode ErrStatus)10775*53ee8cc1Swenshuai.xi void MApi_JPEG_SetErrCode(JPEG_ErrCode ErrStatus)
10776*53ee8cc1Swenshuai.xi {
10777*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10778*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10779*53ee8cc1Swenshuai.xi     {
10780*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10781*53ee8cc1Swenshuai.xi         return;
10782*53ee8cc1Swenshuai.xi     }
10783*53ee8cc1Swenshuai.xi 
10784*53ee8cc1Swenshuai.xi     JPEG_SETERRORCODE_PARAM ErrCode;
10785*53ee8cc1Swenshuai.xi     memset(&ErrCode , 0 ,sizeof(JPEG_SETERRORCODE_PARAM));
10786*53ee8cc1Swenshuai.xi     ErrCode.ErrStatus = ErrStatus;
10787*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetErrCode\n");
10788*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetErrCode, (void*)(&ErrCode)) != UTOPIA_STATUS_SUCCESS)
10789*53ee8cc1Swenshuai.xi     {
10790*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10791*53ee8cc1Swenshuai.xi     }
10792*53ee8cc1Swenshuai.xi #else
10793*53ee8cc1Swenshuai.xi     _MApi_JPEG_SetErrCode(ErrStatus);
10794*53ee8cc1Swenshuai.xi #endif
10795*53ee8cc1Swenshuai.xi }
10796*53ee8cc1Swenshuai.xi 
MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)10797*53ee8cc1Swenshuai.xi void MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)
10798*53ee8cc1Swenshuai.xi {
10799*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10800*53ee8cc1Swenshuai.xi     if (pInstantJPD == NULL)
10801*53ee8cc1Swenshuai.xi     {
10802*53ee8cc1Swenshuai.xi         if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
10803*53ee8cc1Swenshuai.xi         {
10804*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Open JPD fail\n");
10805*53ee8cc1Swenshuai.xi             return;
10806*53ee8cc1Swenshuai.xi         }
10807*53ee8cc1Swenshuai.xi     }
10808*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10809*53ee8cc1Swenshuai.xi     {
10810*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10811*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
10812*53ee8cc1Swenshuai.xi         return;
10813*53ee8cc1Swenshuai.xi     }
10814*53ee8cc1Swenshuai.xi 
10815*53ee8cc1Swenshuai.xi     JPEG_U8_PARAM U8PARA;
10816*53ee8cc1Swenshuai.xi     memset(&U8PARA , 0 ,sizeof(JPEG_U8_PARAM));
10817*53ee8cc1Swenshuai.xi     U8PARA.u8Value = u8DbgLevel;
10818*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetDbgLevel\n");
10819*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetDbgLevel, (void*)(&U8PARA)) != UTOPIA_STATUS_SUCCESS)
10820*53ee8cc1Swenshuai.xi     {
10821*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10822*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
10823*53ee8cc1Swenshuai.xi         pInstantJPD = NULL;
10824*53ee8cc1Swenshuai.xi     }
10825*53ee8cc1Swenshuai.xi #else
10826*53ee8cc1Swenshuai.xi     _MApi_JPEG_SetDbgLevel(u8DbgLevel);
10827*53ee8cc1Swenshuai.xi #endif
10828*53ee8cc1Swenshuai.xi }
10829*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetDbgLevel(void)10830*53ee8cc1Swenshuai.xi MS_U8 MApi_JPEG_GetDbgLevel(void)
10831*53ee8cc1Swenshuai.xi {
10832*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10833*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10834*53ee8cc1Swenshuai.xi     {
10835*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10836*53ee8cc1Swenshuai.xi         return 0;
10837*53ee8cc1Swenshuai.xi     }
10838*53ee8cc1Swenshuai.xi 
10839*53ee8cc1Swenshuai.xi     JPEG_U8_PARAM U8PARA;
10840*53ee8cc1Swenshuai.xi     memset(&U8PARA , 0 ,sizeof(JPEG_U8_PARAM));
10841*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetDbgLevel\n");
10842*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetDbgLevel, (void*)(&U8PARA)) != UTOPIA_STATUS_SUCCESS)
10843*53ee8cc1Swenshuai.xi     {
10844*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10845*53ee8cc1Swenshuai.xi     }
10846*53ee8cc1Swenshuai.xi     return U8PARA.u8Value;
10847*53ee8cc1Swenshuai.xi #else
10848*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetDbgLevel();
10849*53ee8cc1Swenshuai.xi #endif
10850*53ee8cc1Swenshuai.xi }
10851*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetInfo(JPEG_Info * pJPEG_Info)10852*53ee8cc1Swenshuai.xi void MApi_JPEG_GetInfo(JPEG_Info *pJPEG_Info)
10853*53ee8cc1Swenshuai.xi {
10854*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10855*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10856*53ee8cc1Swenshuai.xi     {
10857*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10858*53ee8cc1Swenshuai.xi         return;
10859*53ee8cc1Swenshuai.xi     }
10860*53ee8cc1Swenshuai.xi 
10861*53ee8cc1Swenshuai.xi     JPEG_GETINFO_PARAM eGETINFO;
10862*53ee8cc1Swenshuai.xi     memset(&eGETINFO , 0 ,sizeof(JPEG_GETINFO_PARAM));
10863*53ee8cc1Swenshuai.xi     eGETINFO.pJPEG_Info = pJPEG_Info;
10864*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetInfo\n");
10865*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetInfo, (void*)(&eGETINFO)) != UTOPIA_STATUS_SUCCESS)
10866*53ee8cc1Swenshuai.xi     {
10867*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10868*53ee8cc1Swenshuai.xi     }
10869*53ee8cc1Swenshuai.xi #else
10870*53ee8cc1Swenshuai.xi     _MApi_JPEG_GetInfo(pJPEG_Info);
10871*53ee8cc1Swenshuai.xi #endif
10872*53ee8cc1Swenshuai.xi }
10873*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetStatus(JPEG_Status * pJPEG_Status)10874*53ee8cc1Swenshuai.xi void MApi_JPEG_GetStatus(JPEG_Status *pJPEG_Status)
10875*53ee8cc1Swenshuai.xi {
10876*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10877*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10878*53ee8cc1Swenshuai.xi     {
10879*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10880*53ee8cc1Swenshuai.xi         return;
10881*53ee8cc1Swenshuai.xi     }
10882*53ee8cc1Swenshuai.xi 
10883*53ee8cc1Swenshuai.xi     JPEG_GETSTATUS_PARAM eGETSTATUS;
10884*53ee8cc1Swenshuai.xi     memset(&eGETSTATUS , 0 ,sizeof(JPEG_GETSTATUS_PARAM));
10885*53ee8cc1Swenshuai.xi     eGETSTATUS.pJPEG_Status = pJPEG_Status;
10886*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetStatus\n");
10887*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetStatus, (void*)(&eGETSTATUS)) != UTOPIA_STATUS_SUCCESS)
10888*53ee8cc1Swenshuai.xi     {
10889*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10890*53ee8cc1Swenshuai.xi     }
10891*53ee8cc1Swenshuai.xi #else
10892*53ee8cc1Swenshuai.xi     _MApi_JPEG_GetStatus(pJPEG_Status);
10893*53ee8cc1Swenshuai.xi #endif
10894*53ee8cc1Swenshuai.xi }
10895*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetLibVer(const MSIF_Version ** ppVersion)10896*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetLibVer(const MSIF_Version **ppVersion)
10897*53ee8cc1Swenshuai.xi {
10898*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10899*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10900*53ee8cc1Swenshuai.xi     {
10901*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10902*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
10903*53ee8cc1Swenshuai.xi     }
10904*53ee8cc1Swenshuai.xi 
10905*53ee8cc1Swenshuai.xi     JPEG_GETLIBVER_PARAM eLIBVER;
10906*53ee8cc1Swenshuai.xi     memset(&eLIBVER , 0 ,sizeof(JPEG_GETLIBVER_PARAM));
10907*53ee8cc1Swenshuai.xi     eLIBVER.ppVersion = ppVersion;
10908*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetLibVer\n");
10909*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetLibVer, (void*)(&eLIBVER)) != UTOPIA_STATUS_SUCCESS)
10910*53ee8cc1Swenshuai.xi     {
10911*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10912*53ee8cc1Swenshuai.xi     }
10913*53ee8cc1Swenshuai.xi     return eLIBVER.retVal;
10914*53ee8cc1Swenshuai.xi #else
10915*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetLibVer(ppVersion);
10916*53ee8cc1Swenshuai.xi #endif
10917*53ee8cc1Swenshuai.xi }
10918*53ee8cc1Swenshuai.xi 
MApi_JPEG_HdlVidxChk(void)10919*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_HdlVidxChk(void)
10920*53ee8cc1Swenshuai.xi {
10921*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10922*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10923*53ee8cc1Swenshuai.xi     {
10924*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10925*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
10926*53ee8cc1Swenshuai.xi     }
10927*53ee8cc1Swenshuai.xi 
10928*53ee8cc1Swenshuai.xi     JPEG_RESULT_PARAM ResPara;
10929*53ee8cc1Swenshuai.xi     memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
10930*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_HdlVidxChk\n");
10931*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_HdlVidxChk, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
10932*53ee8cc1Swenshuai.xi     {
10933*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10934*53ee8cc1Swenshuai.xi     }
10935*53ee8cc1Swenshuai.xi     return ResPara.retVal;
10936*53ee8cc1Swenshuai.xi #else
10937*53ee8cc1Swenshuai.xi     return _MApi_JPEG_HdlVidxChk();
10938*53ee8cc1Swenshuai.xi #endif
10939*53ee8cc1Swenshuai.xi }
10940*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType * pBuffLoadType)10941*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType *pBuffLoadType)
10942*53ee8cc1Swenshuai.xi {
10943*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10944*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10945*53ee8cc1Swenshuai.xi     {
10946*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10947*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
10948*53ee8cc1Swenshuai.xi     }
10949*53ee8cc1Swenshuai.xi 
10950*53ee8cc1Swenshuai.xi     JPEG_GETBUFFLOADTYPE_PARAM eBufferLoad;
10951*53ee8cc1Swenshuai.xi     memset(&eBufferLoad , 0 ,sizeof(JPEG_GETBUFFLOADTYPE_PARAM));
10952*53ee8cc1Swenshuai.xi     eBufferLoad.pBuffLoadType = pBuffLoadType;
10953*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetBuffLoadType\n");
10954*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetBuffLoadType, (void*)(&eBufferLoad)) != UTOPIA_STATUS_SUCCESS)
10955*53ee8cc1Swenshuai.xi     {
10956*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10957*53ee8cc1Swenshuai.xi     }
10958*53ee8cc1Swenshuai.xi     return eBufferLoad.retVal;
10959*53ee8cc1Swenshuai.xi #else
10960*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetBuffLoadType(pBuffLoadType);
10961*53ee8cc1Swenshuai.xi #endif
10962*53ee8cc1Swenshuai.xi }
10963*53ee8cc1Swenshuai.xi 
MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)10964*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)
10965*53ee8cc1Swenshuai.xi {
10966*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10967*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10968*53ee8cc1Swenshuai.xi     {
10969*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10970*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
10971*53ee8cc1Swenshuai.xi     }
10972*53ee8cc1Swenshuai.xi 
10973*53ee8cc1Swenshuai.xi     JPEG_ENABLEISR_PARAM eISR;
10974*53ee8cc1Swenshuai.xi     memset(&eISR , 0 ,sizeof(JPEG_ENABLEISR_PARAM));
10975*53ee8cc1Swenshuai.xi     eISR.IsrCb = IsrCb;
10976*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_EnableISR\n");
10977*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_EnableISR, (void*)(&eISR)) != UTOPIA_STATUS_SUCCESS)
10978*53ee8cc1Swenshuai.xi     {
10979*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10980*53ee8cc1Swenshuai.xi     }
10981*53ee8cc1Swenshuai.xi     return eISR.retVal;
10982*53ee8cc1Swenshuai.xi #else
10983*53ee8cc1Swenshuai.xi     return _MApi_JPEG_EnableISR(IsrCb);
10984*53ee8cc1Swenshuai.xi #endif
10985*53ee8cc1Swenshuai.xi }
10986*53ee8cc1Swenshuai.xi 
MApi_JPEG_DisableISR(void)10987*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_DisableISR(void)
10988*53ee8cc1Swenshuai.xi {
10989*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10990*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
10991*53ee8cc1Swenshuai.xi     {
10992*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10993*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
10994*53ee8cc1Swenshuai.xi     }
10995*53ee8cc1Swenshuai.xi 
10996*53ee8cc1Swenshuai.xi     JPEG_RESULT_PARAM ResPara;
10997*53ee8cc1Swenshuai.xi     memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
10998*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_DisableISR\n");
10999*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_DisableISR, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
11000*53ee8cc1Swenshuai.xi     {
11001*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11002*53ee8cc1Swenshuai.xi     }
11003*53ee8cc1Swenshuai.xi     return ResPara.retVal;
11004*53ee8cc1Swenshuai.xi #else
11005*53ee8cc1Swenshuai.xi     return _MApi_JPEG_DisableISR();
11006*53ee8cc1Swenshuai.xi #endif
11007*53ee8cc1Swenshuai.xi }
11008*53ee8cc1Swenshuai.xi 
MApi_JPEG_WaitDone(void)11009*53ee8cc1Swenshuai.xi JPEG_DecodeStatus MApi_JPEG_WaitDone(void)
11010*53ee8cc1Swenshuai.xi {
11011*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11012*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11013*53ee8cc1Swenshuai.xi     {
11014*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11015*53ee8cc1Swenshuai.xi         return E_JPEG_DEC_DECODING;
11016*53ee8cc1Swenshuai.xi     }
11017*53ee8cc1Swenshuai.xi 
11018*53ee8cc1Swenshuai.xi     JPEG_WAITDONE_PARAM eWaitDone;
11019*53ee8cc1Swenshuai.xi     memset(&eWaitDone , 0 ,sizeof(JPEG_WAITDONE_PARAM));
11020*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_WaitDone\n");
11021*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_WaitDone, (void*)(&eWaitDone)) != UTOPIA_STATUS_SUCCESS)
11022*53ee8cc1Swenshuai.xi     {
11023*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11024*53ee8cc1Swenshuai.xi     }
11025*53ee8cc1Swenshuai.xi     return eWaitDone.retVal;
11026*53ee8cc1Swenshuai.xi #else
11027*53ee8cc1Swenshuai.xi     return _MApi_JPEG_WaitDone();
11028*53ee8cc1Swenshuai.xi #endif
11029*53ee8cc1Swenshuai.xi }
11030*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime * DateTime)11031*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime *DateTime)
11032*53ee8cc1Swenshuai.xi {
11033*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11034*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11035*53ee8cc1Swenshuai.xi     {
11036*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11037*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11038*53ee8cc1Swenshuai.xi     }
11039*53ee8cc1Swenshuai.xi 
11040*53ee8cc1Swenshuai.xi     JPEG_GETEXIFDATETIME_PARAM eEXIFDate;
11041*53ee8cc1Swenshuai.xi     memset(&eEXIFDate , 0 ,sizeof(JPEG_GETEXIFDATETIME_PARAM));
11042*53ee8cc1Swenshuai.xi     eEXIFDate.DateTime = DateTime;
11043*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFDateTime\n");
11044*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFDateTime, (void*)(&eEXIFDate)) != UTOPIA_STATUS_SUCCESS)
11045*53ee8cc1Swenshuai.xi     {
11046*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11047*53ee8cc1Swenshuai.xi     }
11048*53ee8cc1Swenshuai.xi     return eEXIFDate.retVal;
11049*53ee8cc1Swenshuai.xi #else
11050*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFDateTime(DateTime);
11051*53ee8cc1Swenshuai.xi #endif
11052*53ee8cc1Swenshuai.xi }
11053*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation * eOrientation)11054*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation *eOrientation)
11055*53ee8cc1Swenshuai.xi {
11056*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11057*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11058*53ee8cc1Swenshuai.xi     {
11059*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11060*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11061*53ee8cc1Swenshuai.xi     }
11062*53ee8cc1Swenshuai.xi 
11063*53ee8cc1Swenshuai.xi     JPEG_GETEXIFORIENTATION_PARAM eEXIFOri;
11064*53ee8cc1Swenshuai.xi     memset(&eEXIFOri , 0 ,sizeof(JPEG_GETEXIFORIENTATION_PARAM));
11065*53ee8cc1Swenshuai.xi     eEXIFOri.eOrientation = eOrientation;
11066*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFOrientation\n");
11067*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFOrientation, (void*)(&eEXIFOri)) != UTOPIA_STATUS_SUCCESS)
11068*53ee8cc1Swenshuai.xi     {
11069*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11070*53ee8cc1Swenshuai.xi     }
11071*53ee8cc1Swenshuai.xi     return eEXIFOri.retVal;
11072*53ee8cc1Swenshuai.xi #else
11073*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFOrientation(eOrientation);
11074*53ee8cc1Swenshuai.xi #endif
11075*53ee8cc1Swenshuai.xi }
11076*53ee8cc1Swenshuai.xi 
11077*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
MApi_JPEG_GetEXIFManufacturer(MS_U8 * pu8Manufacturer,MS_U8 u8size)11078*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFManufacturer(MS_U8 *pu8Manufacturer, MS_U8 u8size)
11079*53ee8cc1Swenshuai.xi {
11080*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11081*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11082*53ee8cc1Swenshuai.xi     {
11083*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11084*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11085*53ee8cc1Swenshuai.xi     }
11086*53ee8cc1Swenshuai.xi 
11087*53ee8cc1Swenshuai.xi     JPEG_GETEXIFSTRING_PARAM eEXIFStr;
11088*53ee8cc1Swenshuai.xi     memset(&eEXIFStr , 0 ,sizeof(JPEG_GETEXIFSTRING_PARAM));
11089*53ee8cc1Swenshuai.xi     eEXIFStr.pu8String = pu8Manufacturer;
11090*53ee8cc1Swenshuai.xi     eEXIFStr.u8size = u8size;
11091*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFManufacturer\n");
11092*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFManufacturer, (void*)(&eEXIFStr)) != UTOPIA_STATUS_SUCCESS)
11093*53ee8cc1Swenshuai.xi     {
11094*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11095*53ee8cc1Swenshuai.xi     }
11096*53ee8cc1Swenshuai.xi     return eEXIFStr.retVal;
11097*53ee8cc1Swenshuai.xi #else
11098*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFManufacturer(pu8Manufacturer, u8size);
11099*53ee8cc1Swenshuai.xi #endif
11100*53ee8cc1Swenshuai.xi }
11101*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFModel(MS_U8 * pu8Model,MS_U8 u8size)11102*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFModel(MS_U8 *pu8Model, MS_U8 u8size)
11103*53ee8cc1Swenshuai.xi {
11104*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11105*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11106*53ee8cc1Swenshuai.xi     {
11107*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11108*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11109*53ee8cc1Swenshuai.xi     }
11110*53ee8cc1Swenshuai.xi 
11111*53ee8cc1Swenshuai.xi     JPEG_GETEXIFSTRING_PARAM eEXIFStr;
11112*53ee8cc1Swenshuai.xi     memset(&eEXIFStr , 0 ,sizeof(JPEG_GETEXIFSTRING_PARAM));
11113*53ee8cc1Swenshuai.xi     eEXIFStr.pu8String = pu8Model;
11114*53ee8cc1Swenshuai.xi     eEXIFStr.u8size = u8size;
11115*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFModel\n");
11116*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFModel, (void*)(&eEXIFStr)) != UTOPIA_STATUS_SUCCESS)
11117*53ee8cc1Swenshuai.xi     {
11118*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11119*53ee8cc1Swenshuai.xi     }
11120*53ee8cc1Swenshuai.xi     return eEXIFStr.retVal;
11121*53ee8cc1Swenshuai.xi #else
11122*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFModel(pu8Model, u8size);
11123*53ee8cc1Swenshuai.xi #endif
11124*53ee8cc1Swenshuai.xi }
11125*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFFlash(MS_U16 * pu16Flash)11126*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFFlash(MS_U16 *pu16Flash)
11127*53ee8cc1Swenshuai.xi {
11128*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11129*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11130*53ee8cc1Swenshuai.xi     {
11131*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11132*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11133*53ee8cc1Swenshuai.xi     }
11134*53ee8cc1Swenshuai.xi 
11135*53ee8cc1Swenshuai.xi     JPEG_GETEXIFU16_PARAM U16PARA;
11136*53ee8cc1Swenshuai.xi     memset(&U16PARA , 0 ,sizeof(JPEG_GETEXIFU16_PARAM));
11137*53ee8cc1Swenshuai.xi     U16PARA.pu16Value = pu16Flash;
11138*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFFlash\n");
11139*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFFlash, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11140*53ee8cc1Swenshuai.xi     {
11141*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11142*53ee8cc1Swenshuai.xi     }
11143*53ee8cc1Swenshuai.xi     return U16PARA.retVal;
11144*53ee8cc1Swenshuai.xi #else
11145*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFFlash(pu16Flash);
11146*53ee8cc1Swenshuai.xi #endif
11147*53ee8cc1Swenshuai.xi }
11148*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 * pu32ISOSpeedRatings)11149*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 *pu32ISOSpeedRatings)
11150*53ee8cc1Swenshuai.xi {
11151*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11152*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11153*53ee8cc1Swenshuai.xi     {
11154*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11155*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11156*53ee8cc1Swenshuai.xi     }
11157*53ee8cc1Swenshuai.xi 
11158*53ee8cc1Swenshuai.xi     JPEG_GETEXIFU32_PARAM U32PARA;
11159*53ee8cc1Swenshuai.xi     memset(&U32PARA , 0 ,sizeof(JPEG_GETEXIFU32_PARAM));
11160*53ee8cc1Swenshuai.xi     U32PARA.pu32Value = pu32ISOSpeedRatings;
11161*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFISOSpeedRatings\n");
11162*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFISOSpeedRatings, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
11163*53ee8cc1Swenshuai.xi     {
11164*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11165*53ee8cc1Swenshuai.xi     }
11166*53ee8cc1Swenshuai.xi     return U32PARA.retVal;
11167*53ee8cc1Swenshuai.xi #else
11168*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFISOSpeedRatings(pu32ISOSpeedRatings);
11169*53ee8cc1Swenshuai.xi #endif
11170*53ee8cc1Swenshuai.xi }
11171*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL * pShutterSpeedValue)11172*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL *pShutterSpeedValue)
11173*53ee8cc1Swenshuai.xi {
11174*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11175*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11176*53ee8cc1Swenshuai.xi     {
11177*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11178*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11179*53ee8cc1Swenshuai.xi     }
11180*53ee8cc1Swenshuai.xi 
11181*53ee8cc1Swenshuai.xi     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11182*53ee8cc1Swenshuai.xi     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11183*53ee8cc1Swenshuai.xi     RATIONALPARA.pRational = pShutterSpeedValue;
11184*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFShutterSpeedValue\n");
11185*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFShutterSpeedValue, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11186*53ee8cc1Swenshuai.xi     {
11187*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11188*53ee8cc1Swenshuai.xi     }
11189*53ee8cc1Swenshuai.xi     return RATIONALPARA.retVal;
11190*53ee8cc1Swenshuai.xi #else
11191*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFShutterSpeedValue(pShutterSpeedValue);
11192*53ee8cc1Swenshuai.xi #endif
11193*53ee8cc1Swenshuai.xi }
11194*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL * pApertureValue)11195*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL *pApertureValue)
11196*53ee8cc1Swenshuai.xi {
11197*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11198*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11199*53ee8cc1Swenshuai.xi     {
11200*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11201*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11202*53ee8cc1Swenshuai.xi     }
11203*53ee8cc1Swenshuai.xi 
11204*53ee8cc1Swenshuai.xi     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11205*53ee8cc1Swenshuai.xi     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11206*53ee8cc1Swenshuai.xi     RATIONALPARA.pRational = pApertureValue;
11207*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFApertureValue\n");
11208*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFApertureValue, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11209*53ee8cc1Swenshuai.xi     {
11210*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11211*53ee8cc1Swenshuai.xi     }
11212*53ee8cc1Swenshuai.xi     return RATIONALPARA.retVal;
11213*53ee8cc1Swenshuai.xi #else
11214*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFApertureValue(pApertureValue);
11215*53ee8cc1Swenshuai.xi #endif
11216*53ee8cc1Swenshuai.xi }
11217*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL * pExposureBiasValue)11218*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL *pExposureBiasValue)
11219*53ee8cc1Swenshuai.xi {
11220*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11221*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11222*53ee8cc1Swenshuai.xi     {
11223*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11224*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11225*53ee8cc1Swenshuai.xi     }
11226*53ee8cc1Swenshuai.xi 
11227*53ee8cc1Swenshuai.xi     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11228*53ee8cc1Swenshuai.xi     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11229*53ee8cc1Swenshuai.xi     RATIONALPARA.pRational = pExposureBiasValue;
11230*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFExposureBiasValue\n");
11231*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFExposureBiasValue, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11232*53ee8cc1Swenshuai.xi     {
11233*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11234*53ee8cc1Swenshuai.xi     }
11235*53ee8cc1Swenshuai.xi     return RATIONALPARA.retVal;
11236*53ee8cc1Swenshuai.xi #else
11237*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFExposureBiasValue(pExposureBiasValue);
11238*53ee8cc1Swenshuai.xi #endif
11239*53ee8cc1Swenshuai.xi }
11240*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL * pFocalLength)11241*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL *pFocalLength)
11242*53ee8cc1Swenshuai.xi {
11243*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11244*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11245*53ee8cc1Swenshuai.xi     {
11246*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11247*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11248*53ee8cc1Swenshuai.xi     }
11249*53ee8cc1Swenshuai.xi 
11250*53ee8cc1Swenshuai.xi     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11251*53ee8cc1Swenshuai.xi     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11252*53ee8cc1Swenshuai.xi     RATIONALPARA.pRational = pFocalLength;
11253*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFFocalLength\n");
11254*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFFocalLength, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11255*53ee8cc1Swenshuai.xi     {
11256*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11257*53ee8cc1Swenshuai.xi     }
11258*53ee8cc1Swenshuai.xi     return RATIONALPARA.retVal;
11259*53ee8cc1Swenshuai.xi #else
11260*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFFocalLength(pFocalLength);
11261*53ee8cc1Swenshuai.xi #endif
11262*53ee8cc1Swenshuai.xi }
11263*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFImageWidth(MS_U32 * pu32ImageWidth)11264*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFImageWidth(MS_U32 *pu32ImageWidth)
11265*53ee8cc1Swenshuai.xi {
11266*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11267*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11268*53ee8cc1Swenshuai.xi     {
11269*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11270*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11271*53ee8cc1Swenshuai.xi     }
11272*53ee8cc1Swenshuai.xi 
11273*53ee8cc1Swenshuai.xi     JPEG_GETEXIFU32_PARAM U32PARA;
11274*53ee8cc1Swenshuai.xi     memset(&U32PARA , 0 ,sizeof(JPEG_GETEXIFU32_PARAM));
11275*53ee8cc1Swenshuai.xi     U32PARA.pu32Value = pu32ImageWidth;
11276*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFImageWidth\n");
11277*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFImageWidth, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
11278*53ee8cc1Swenshuai.xi     {
11279*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11280*53ee8cc1Swenshuai.xi     }
11281*53ee8cc1Swenshuai.xi     return U32PARA.retVal;
11282*53ee8cc1Swenshuai.xi #else
11283*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFImageWidth(pu32ImageWidth);
11284*53ee8cc1Swenshuai.xi #endif
11285*53ee8cc1Swenshuai.xi }
11286*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFImageHeight(MS_U32 * pu32ImageHeight)11287*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFImageHeight(MS_U32 *pu32ImageHeight)
11288*53ee8cc1Swenshuai.xi {
11289*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11290*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11291*53ee8cc1Swenshuai.xi     {
11292*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11293*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11294*53ee8cc1Swenshuai.xi     }
11295*53ee8cc1Swenshuai.xi 
11296*53ee8cc1Swenshuai.xi     JPEG_GETEXIFU32_PARAM U32PARA;
11297*53ee8cc1Swenshuai.xi     memset(&U32PARA , 0 ,sizeof(JPEG_GETEXIFU32_PARAM));
11298*53ee8cc1Swenshuai.xi     U32PARA.pu32Value = pu32ImageHeight;
11299*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFImageHeight\n");
11300*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFImageHeight, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
11301*53ee8cc1Swenshuai.xi     {
11302*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11303*53ee8cc1Swenshuai.xi     }
11304*53ee8cc1Swenshuai.xi     return U32PARA.retVal;
11305*53ee8cc1Swenshuai.xi #else
11306*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFImageHeight(pu32ImageHeight);
11307*53ee8cc1Swenshuai.xi #endif
11308*53ee8cc1Swenshuai.xi }
11309*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL * pExposureTime)11310*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL *pExposureTime)
11311*53ee8cc1Swenshuai.xi {
11312*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11313*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11314*53ee8cc1Swenshuai.xi     {
11315*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11316*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11317*53ee8cc1Swenshuai.xi     }
11318*53ee8cc1Swenshuai.xi 
11319*53ee8cc1Swenshuai.xi     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11320*53ee8cc1Swenshuai.xi     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11321*53ee8cc1Swenshuai.xi     RATIONALPARA.pRational = pExposureTime;
11322*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFExposureTime\n");
11323*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFExposureTime, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11324*53ee8cc1Swenshuai.xi     {
11325*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11326*53ee8cc1Swenshuai.xi     }
11327*53ee8cc1Swenshuai.xi     return RATIONALPARA.retVal;
11328*53ee8cc1Swenshuai.xi #else
11329*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFExposureTime(pExposureTime);
11330*53ee8cc1Swenshuai.xi #endif
11331*53ee8cc1Swenshuai.xi }
11332*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL * pFNumber)11333*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL *pFNumber)
11334*53ee8cc1Swenshuai.xi {
11335*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11336*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11337*53ee8cc1Swenshuai.xi     {
11338*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11339*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11340*53ee8cc1Swenshuai.xi     }
11341*53ee8cc1Swenshuai.xi 
11342*53ee8cc1Swenshuai.xi     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11343*53ee8cc1Swenshuai.xi     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11344*53ee8cc1Swenshuai.xi     RATIONALPARA.pRational = pFNumber;
11345*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFFNumber\n");
11346*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFFNumber, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11347*53ee8cc1Swenshuai.xi     {
11348*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11349*53ee8cc1Swenshuai.xi     }
11350*53ee8cc1Swenshuai.xi     return RATIONALPARA.retVal;
11351*53ee8cc1Swenshuai.xi #else
11352*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetEXIFFNumber(pFNumber);
11353*53ee8cc1Swenshuai.xi #endif
11354*53ee8cc1Swenshuai.xi }
11355*53ee8cc1Swenshuai.xi 
11356*53ee8cc1Swenshuai.xi #endif
11357*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetFreeMemory(MS_U32 size)11358*53ee8cc1Swenshuai.xi MS_PHYADDR MApi_JPEG_GetFreeMemory(MS_U32 size)
11359*53ee8cc1Swenshuai.xi {
11360*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11361*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11362*53ee8cc1Swenshuai.xi     {
11363*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11364*53ee8cc1Swenshuai.xi         return 0;
11365*53ee8cc1Swenshuai.xi     }
11366*53ee8cc1Swenshuai.xi 
11367*53ee8cc1Swenshuai.xi     JPEG_GETFREEMEMORY_PARAM MEMORYPARA;
11368*53ee8cc1Swenshuai.xi     memset(&MEMORYPARA , 0 ,sizeof(JPEG_GETFREEMEMORY_PARAM));
11369*53ee8cc1Swenshuai.xi     MEMORYPARA.size = size;
11370*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetFreeMemory\n");
11371*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetFreeMemory, (void*)(&MEMORYPARA)) != UTOPIA_STATUS_SUCCESS)
11372*53ee8cc1Swenshuai.xi     {
11373*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11374*53ee8cc1Swenshuai.xi     }
11375*53ee8cc1Swenshuai.xi     return MEMORYPARA.addr;
11376*53ee8cc1Swenshuai.xi #else
11377*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetFreeMemory(size);
11378*53ee8cc1Swenshuai.xi #endif
11379*53ee8cc1Swenshuai.xi }
11380*53ee8cc1Swenshuai.xi 
11381*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetDataOffset(void)11382*53ee8cc1Swenshuai.xi MS_U32 MApi_JPEG_GetDataOffset(void)
11383*53ee8cc1Swenshuai.xi {
11384*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11385*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11386*53ee8cc1Swenshuai.xi     {
11387*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11388*53ee8cc1Swenshuai.xi         return 0;
11389*53ee8cc1Swenshuai.xi     }
11390*53ee8cc1Swenshuai.xi 
11391*53ee8cc1Swenshuai.xi     JPEG_U32_PARAM U32PARA;
11392*53ee8cc1Swenshuai.xi     memset(&U32PARA , 0 ,sizeof(JPEG_U32_PARAM));
11393*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetDataOffset\n");
11394*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetDataOffset, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
11395*53ee8cc1Swenshuai.xi     {
11396*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11397*53ee8cc1Swenshuai.xi         return 0;
11398*53ee8cc1Swenshuai.xi     }
11399*53ee8cc1Swenshuai.xi     return U32PARA.u32Value;
11400*53ee8cc1Swenshuai.xi #else
11401*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetDataOffset();
11402*53ee8cc1Swenshuai.xi #endif
11403*53ee8cc1Swenshuai.xi }
11404*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetSOFOffset(void)11405*53ee8cc1Swenshuai.xi MS_U32 MApi_JPEG_GetSOFOffset(void)
11406*53ee8cc1Swenshuai.xi {
11407*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11408*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11409*53ee8cc1Swenshuai.xi     {
11410*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11411*53ee8cc1Swenshuai.xi         return 0;
11412*53ee8cc1Swenshuai.xi     }
11413*53ee8cc1Swenshuai.xi 
11414*53ee8cc1Swenshuai.xi     JPEG_U32_PARAM U32PARA;
11415*53ee8cc1Swenshuai.xi     memset(&U32PARA , 0 ,sizeof(JPEG_U32_PARAM));
11416*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetSOFOffset\n");
11417*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetSOFOffset, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
11418*53ee8cc1Swenshuai.xi     {
11419*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11420*53ee8cc1Swenshuai.xi         return 0;
11421*53ee8cc1Swenshuai.xi     }
11422*53ee8cc1Swenshuai.xi     return U32PARA.u32Value;
11423*53ee8cc1Swenshuai.xi #else
11424*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetSOFOffset();
11425*53ee8cc1Swenshuai.xi #endif
11426*53ee8cc1Swenshuai.xi }
11427*53ee8cc1Swenshuai.xi 
MApi_JPEG_SupportCMYK(MS_BOOL bEnable)11428*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_SupportCMYK(MS_BOOL bEnable)
11429*53ee8cc1Swenshuai.xi {
11430*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11431*53ee8cc1Swenshuai.xi     if (pInstantJPD == NULL)
11432*53ee8cc1Swenshuai.xi     {
11433*53ee8cc1Swenshuai.xi         if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
11434*53ee8cc1Swenshuai.xi         {
11435*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Open JPD fail\n");
11436*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
11437*53ee8cc1Swenshuai.xi         }
11438*53ee8cc1Swenshuai.xi     }
11439*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11440*53ee8cc1Swenshuai.xi     {
11441*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11442*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
11443*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11444*53ee8cc1Swenshuai.xi     }
11445*53ee8cc1Swenshuai.xi 
11446*53ee8cc1Swenshuai.xi     JPEG_SUPPORTCMYK_PARAM CMYKRGB;
11447*53ee8cc1Swenshuai.xi     memset(&CMYKRGB , 0 ,sizeof(JPEG_SUPPORTCMYK_PARAM));
11448*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SupportCMYK\n");
11449*53ee8cc1Swenshuai.xi     CMYKRGB.bEnable = bEnable;
11450*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SupportCMYK, (void*)(&CMYKRGB)) != UTOPIA_STATUS_SUCCESS)
11451*53ee8cc1Swenshuai.xi     {
11452*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11453*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
11454*53ee8cc1Swenshuai.xi         pInstantJPD = NULL;
11455*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11456*53ee8cc1Swenshuai.xi     }
11457*53ee8cc1Swenshuai.xi     return CMYKRGB.retVal;
11458*53ee8cc1Swenshuai.xi #else
11459*53ee8cc1Swenshuai.xi     return _MApi_JPEG_SupportCMYK(bEnable);
11460*53ee8cc1Swenshuai.xi #endif
11461*53ee8cc1Swenshuai.xi }
11462*53ee8cc1Swenshuai.xi 
MApi_JPEG_SupportRGB(MS_BOOL bEnable)11463*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_SupportRGB(MS_BOOL bEnable)
11464*53ee8cc1Swenshuai.xi {
11465*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11466*53ee8cc1Swenshuai.xi     if (pInstantJPD == NULL)
11467*53ee8cc1Swenshuai.xi     {
11468*53ee8cc1Swenshuai.xi         if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
11469*53ee8cc1Swenshuai.xi         {
11470*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Open JPD fail\n");
11471*53ee8cc1Swenshuai.xi             return E_JPEG_FAILED;
11472*53ee8cc1Swenshuai.xi         }
11473*53ee8cc1Swenshuai.xi     }
11474*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11475*53ee8cc1Swenshuai.xi     {
11476*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11477*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
11478*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11479*53ee8cc1Swenshuai.xi     }
11480*53ee8cc1Swenshuai.xi 
11481*53ee8cc1Swenshuai.xi     JPEG_SUPPORTCMYK_PARAM CMYKRGB;
11482*53ee8cc1Swenshuai.xi     memset(&CMYKRGB , 0 ,sizeof(JPEG_SUPPORTCMYK_PARAM));
11483*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SupportRGB\n");
11484*53ee8cc1Swenshuai.xi     CMYKRGB.bEnable = bEnable;
11485*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SupportRGB, (void*)(&CMYKRGB)) != UTOPIA_STATUS_SUCCESS)
11486*53ee8cc1Swenshuai.xi     {
11487*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11488*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
11489*53ee8cc1Swenshuai.xi         pInstantJPD = NULL;
11490*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11491*53ee8cc1Swenshuai.xi     }
11492*53ee8cc1Swenshuai.xi     return CMYKRGB.retVal;
11493*53ee8cc1Swenshuai.xi #else
11494*53ee8cc1Swenshuai.xi     return _MApi_JPEG_SupportRGB(bEnable);
11495*53ee8cc1Swenshuai.xi #endif
11496*53ee8cc1Swenshuai.xi }
11497*53ee8cc1Swenshuai.xi 
MApi_JPEG_SetMHEG5(MS_BOOL bEnable)11498*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMHEG5(MS_BOOL bEnable)
11499*53ee8cc1Swenshuai.xi {
11500*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11501*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11502*53ee8cc1Swenshuai.xi     {
11503*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11504*53ee8cc1Swenshuai.xi         return;
11505*53ee8cc1Swenshuai.xi     }
11506*53ee8cc1Swenshuai.xi 
11507*53ee8cc1Swenshuai.xi     JPEG_BOOL_PARAM bPARA;
11508*53ee8cc1Swenshuai.xi     memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
11509*53ee8cc1Swenshuai.xi     bPARA.bValue= bEnable;
11510*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMHEG5\n");
11511*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMHEG5, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
11512*53ee8cc1Swenshuai.xi     {
11513*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11514*53ee8cc1Swenshuai.xi         return;
11515*53ee8cc1Swenshuai.xi     }
11516*53ee8cc1Swenshuai.xi     return;
11517*53ee8cc1Swenshuai.xi #else
11518*53ee8cc1Swenshuai.xi     _MApi_JPEG_SetMHEG5(bEnable);
11519*53ee8cc1Swenshuai.xi #endif
11520*53ee8cc1Swenshuai.xi }
11521*53ee8cc1Swenshuai.xi 
11522*53ee8cc1Swenshuai.xi 
11523*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
11524*53ee8cc1Swenshuai.xi //For MPO
MApi_JPEG_IsMPOFormat(void)11525*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_IsMPOFormat(void)
11526*53ee8cc1Swenshuai.xi {
11527*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11528*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11529*53ee8cc1Swenshuai.xi     {
11530*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11531*53ee8cc1Swenshuai.xi         return 0;
11532*53ee8cc1Swenshuai.xi     }
11533*53ee8cc1Swenshuai.xi 
11534*53ee8cc1Swenshuai.xi     JPEG_BOOL_PARAM bPARA;
11535*53ee8cc1Swenshuai.xi     memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
11536*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_IsMPOFormat\n");
11537*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_IsMPOFormat, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
11538*53ee8cc1Swenshuai.xi     {
11539*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11540*53ee8cc1Swenshuai.xi         return 0;
11541*53ee8cc1Swenshuai.xi     }
11542*53ee8cc1Swenshuai.xi     return bPARA.bValue;
11543*53ee8cc1Swenshuai.xi #else
11544*53ee8cc1Swenshuai.xi     return _MApi_JPEG_IsMPOFormat();
11545*53ee8cc1Swenshuai.xi #endif
11546*53ee8cc1Swenshuai.xi }
11547*53ee8cc1Swenshuai.xi 
11548*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO ** ppMPOIndex)11549*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO **ppMPOIndex)
11550*53ee8cc1Swenshuai.xi {
11551*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11552*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11553*53ee8cc1Swenshuai.xi     {
11554*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11555*53ee8cc1Swenshuai.xi         return 0;
11556*53ee8cc1Swenshuai.xi     }
11557*53ee8cc1Swenshuai.xi 
11558*53ee8cc1Swenshuai.xi     JPEG_GETMPOINDEX_PARAM eMPOIndex;
11559*53ee8cc1Swenshuai.xi     memset(&eMPOIndex , 0 ,sizeof(JPEG_GETMPOINDEX_PARAM));
11560*53ee8cc1Swenshuai.xi     eMPOIndex.ppMPOIndex = ppMPOIndex;
11561*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetMPOIndex\n");
11562*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetMPOIndex, (void*)(&eMPOIndex)) != UTOPIA_STATUS_SUCCESS)
11563*53ee8cc1Swenshuai.xi     {
11564*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11565*53ee8cc1Swenshuai.xi         return 0;
11566*53ee8cc1Swenshuai.xi     }
11567*53ee8cc1Swenshuai.xi     return eMPOIndex.bretVal;
11568*53ee8cc1Swenshuai.xi #else
11569*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetMPOIndex(ppMPOIndex);
11570*53ee8cc1Swenshuai.xi #endif
11571*53ee8cc1Swenshuai.xi }
11572*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetMPOAttr(MS_U32 image_no,JPEG_MPO_ATTRIBUTE_INFO ** ppMPOAttr)11573*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_GetMPOAttr(MS_U32 image_no, JPEG_MPO_ATTRIBUTE_INFO **ppMPOAttr)
11574*53ee8cc1Swenshuai.xi {
11575*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11576*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11577*53ee8cc1Swenshuai.xi     {
11578*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11579*53ee8cc1Swenshuai.xi         return 0;
11580*53ee8cc1Swenshuai.xi     }
11581*53ee8cc1Swenshuai.xi 
11582*53ee8cc1Swenshuai.xi     JPEG_GETMPOATTR_PARAM eMPOAttr;
11583*53ee8cc1Swenshuai.xi     memset(&eMPOAttr , 0 ,sizeof(JPEG_GETMPOATTR_PARAM));
11584*53ee8cc1Swenshuai.xi     eMPOAttr.image_no = image_no;
11585*53ee8cc1Swenshuai.xi     eMPOAttr.ppMPOAttr = ppMPOAttr;
11586*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetMPOAttr\n");
11587*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetMPOAttr, (void*)(&eMPOAttr)) != UTOPIA_STATUS_SUCCESS)
11588*53ee8cc1Swenshuai.xi     {
11589*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11590*53ee8cc1Swenshuai.xi         return 0;
11591*53ee8cc1Swenshuai.xi     }
11592*53ee8cc1Swenshuai.xi     return eMPOAttr.bretVal;
11593*53ee8cc1Swenshuai.xi #else
11594*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetMPOAttr(image_no, ppMPOAttr);
11595*53ee8cc1Swenshuai.xi #endif
11596*53ee8cc1Swenshuai.xi }
11597*53ee8cc1Swenshuai.xi 
MApi_JPEG_DumpMPO(void)11598*53ee8cc1Swenshuai.xi void MApi_JPEG_DumpMPO(void)
11599*53ee8cc1Swenshuai.xi {
11600*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11601*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11602*53ee8cc1Swenshuai.xi     {
11603*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11604*53ee8cc1Swenshuai.xi         return;
11605*53ee8cc1Swenshuai.xi     }
11606*53ee8cc1Swenshuai.xi 
11607*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_DumpMPO\n");
11608*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_DumpMPO, NULL) != UTOPIA_STATUS_SUCCESS)
11609*53ee8cc1Swenshuai.xi     {
11610*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11611*53ee8cc1Swenshuai.xi     }
11612*53ee8cc1Swenshuai.xi #else
11613*53ee8cc1Swenshuai.xi     _MApi_JPEG_DumpMPO();
11614*53ee8cc1Swenshuai.xi #endif
11615*53ee8cc1Swenshuai.xi }
11616*53ee8cc1Swenshuai.xi 
MApi_JPEG_SetMPOBuffer(MS_U32 read_offset,MS_U32 output_start)11617*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_SetMPOBuffer(MS_U32 read_offset, MS_U32 output_start)
11618*53ee8cc1Swenshuai.xi {
11619*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11620*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11621*53ee8cc1Swenshuai.xi     {
11622*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11623*53ee8cc1Swenshuai.xi         return 0;
11624*53ee8cc1Swenshuai.xi     }
11625*53ee8cc1Swenshuai.xi 
11626*53ee8cc1Swenshuai.xi     JPEG_SETMPOBUFFER_PARAM eMPOBuff;
11627*53ee8cc1Swenshuai.xi     memset(&eMPOBuff , 0 ,sizeof(JPEG_SETMPOBUFFER_PARAM));
11628*53ee8cc1Swenshuai.xi     eMPOBuff.read_offset = read_offset;
11629*53ee8cc1Swenshuai.xi     eMPOBuff.output_start = output_start;
11630*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMPOBuffer\n");
11631*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMPOBuffer, (void*)(&eMPOBuff)) != UTOPIA_STATUS_SUCCESS)
11632*53ee8cc1Swenshuai.xi     {
11633*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11634*53ee8cc1Swenshuai.xi         return 0;
11635*53ee8cc1Swenshuai.xi     }
11636*53ee8cc1Swenshuai.xi     return eMPOBuff.bretVal;
11637*53ee8cc1Swenshuai.xi #else
11638*53ee8cc1Swenshuai.xi     return _MApi_JPEG_SetMPOBuffer(read_offset, output_start);
11639*53ee8cc1Swenshuai.xi #endif
11640*53ee8cc1Swenshuai.xi }
11641*53ee8cc1Swenshuai.xi 
MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)11642*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
11643*53ee8cc1Swenshuai.xi {
11644*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11645*53ee8cc1Swenshuai.xi     if (pInstantJPD == NULL)
11646*53ee8cc1Swenshuai.xi     {
11647*53ee8cc1Swenshuai.xi         if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
11648*53ee8cc1Swenshuai.xi         {
11649*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Open JPD fail\n");
11650*53ee8cc1Swenshuai.xi             return;
11651*53ee8cc1Swenshuai.xi         }
11652*53ee8cc1Swenshuai.xi     }
11653*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11654*53ee8cc1Swenshuai.xi     {
11655*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11656*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
11657*53ee8cc1Swenshuai.xi         return;
11658*53ee8cc1Swenshuai.xi     }
11659*53ee8cc1Swenshuai.xi 
11660*53ee8cc1Swenshuai.xi     JPEG_RESOLUTION_PARAM Resol;
11661*53ee8cc1Swenshuai.xi     memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
11662*53ee8cc1Swenshuai.xi     Resol.u16Width= u16Width;
11663*53ee8cc1Swenshuai.xi     Resol.u16Height= u16Height;
11664*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMPOMaxDecodeResolution\n");
11665*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMPOMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
11666*53ee8cc1Swenshuai.xi     {
11667*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11668*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
11669*53ee8cc1Swenshuai.xi         pInstantJPD = NULL;
11670*53ee8cc1Swenshuai.xi     }
11671*53ee8cc1Swenshuai.xi #else
11672*53ee8cc1Swenshuai.xi     _MApi_JPEG_SetMPOMaxDecodeResolution(u16Width, u16Height);
11673*53ee8cc1Swenshuai.xi #endif
11674*53ee8cc1Swenshuai.xi }
11675*53ee8cc1Swenshuai.xi 
MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)11676*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
11677*53ee8cc1Swenshuai.xi {
11678*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11679*53ee8cc1Swenshuai.xi     if (pInstantJPD == NULL)
11680*53ee8cc1Swenshuai.xi     {
11681*53ee8cc1Swenshuai.xi         if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
11682*53ee8cc1Swenshuai.xi         {
11683*53ee8cc1Swenshuai.xi             JPEG_DEBUG_API_ERR("Open JPD fail\n");
11684*53ee8cc1Swenshuai.xi             return;
11685*53ee8cc1Swenshuai.xi         }
11686*53ee8cc1Swenshuai.xi     }
11687*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11688*53ee8cc1Swenshuai.xi     {
11689*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11690*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
11691*53ee8cc1Swenshuai.xi         return;
11692*53ee8cc1Swenshuai.xi     }
11693*53ee8cc1Swenshuai.xi 
11694*53ee8cc1Swenshuai.xi     JPEG_RESOLUTION_PARAM Resol;
11695*53ee8cc1Swenshuai.xi     memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
11696*53ee8cc1Swenshuai.xi     Resol.u16Width= u16ProWidth;
11697*53ee8cc1Swenshuai.xi     Resol.u16Height= u16ProHeight;
11698*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMPOProMaxDecodeResolution\n");
11699*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMPOProMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
11700*53ee8cc1Swenshuai.xi     {
11701*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11702*53ee8cc1Swenshuai.xi         UtopiaClose(pInstantJPD);
11703*53ee8cc1Swenshuai.xi         pInstantJPD = NULL;
11704*53ee8cc1Swenshuai.xi     }
11705*53ee8cc1Swenshuai.xi #else
11706*53ee8cc1Swenshuai.xi     _MApi_JPEG_SetMPOProMaxDecodeResolution(u16ProWidth, u16ProHeight);
11707*53ee8cc1Swenshuai.xi #endif
11708*53ee8cc1Swenshuai.xi }
11709*53ee8cc1Swenshuai.xi 
11710*53ee8cc1Swenshuai.xi #endif
11711*53ee8cc1Swenshuai.xi 
MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID,MS_U32 * param,MS_U32 u32size)11712*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID, MS_U32 *param, MS_U32 u32size)
11713*53ee8cc1Swenshuai.xi {
11714*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11715*53ee8cc1Swenshuai.xi     if(pInstantJPD==NULL)
11716*53ee8cc1Swenshuai.xi     {
11717*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11718*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11719*53ee8cc1Swenshuai.xi     }
11720*53ee8cc1Swenshuai.xi 
11721*53ee8cc1Swenshuai.xi     JPEG_GET_CTRL_PARAM eGetCTRL;
11722*53ee8cc1Swenshuai.xi     memset(&eGetCTRL , 0 ,sizeof(JPEG_GET_CTRL_PARAM));
11723*53ee8cc1Swenshuai.xi     eGetCTRL.eGetID = eGetID;
11724*53ee8cc1Swenshuai.xi     eGetCTRL.param = param;
11725*53ee8cc1Swenshuai.xi     eGetCTRL.u32size = u32size;
11726*53ee8cc1Swenshuai.xi 
11727*53ee8cc1Swenshuai.xi     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetControl\n");
11728*53ee8cc1Swenshuai.xi     if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetControl, (void*)(&eGetCTRL)) != UTOPIA_STATUS_SUCCESS)
11729*53ee8cc1Swenshuai.xi     {
11730*53ee8cc1Swenshuai.xi         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11731*53ee8cc1Swenshuai.xi         return E_JPEG_FAILED;
11732*53ee8cc1Swenshuai.xi     }
11733*53ee8cc1Swenshuai.xi     return eGetCTRL.retVal;
11734*53ee8cc1Swenshuai.xi #else
11735*53ee8cc1Swenshuai.xi     return _MApi_JPEG_GetControl(eGetID, param, u32size);
11736*53ee8cc1Swenshuai.xi #endif
11737*53ee8cc1Swenshuai.xi }
11738*53ee8cc1Swenshuai.xi 
MApi_JPEG_EnableOJPD(MS_BOOL bOnOff)11739*53ee8cc1Swenshuai.xi void MApi_JPEG_EnableOJPD(MS_BOOL bOnOff)
11740*53ee8cc1Swenshuai.xi {
11741*53ee8cc1Swenshuai.xi     // wrapper only
11742*53ee8cc1Swenshuai.xi     UNUSED(bOnOff);
11743*53ee8cc1Swenshuai.xi     return;
11744*53ee8cc1Swenshuai.xi }
MApi_JPEG_Init_UsingOJPD(JPEG_InitParam * pInitParam)11745*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_Init_UsingOJPD(JPEG_InitParam *pInitParam)
11746*53ee8cc1Swenshuai.xi {
11747*53ee8cc1Swenshuai.xi     // wrapper only
11748*53ee8cc1Swenshuai.xi     UNUSED(pInitParam);
11749*53ee8cc1Swenshuai.xi     return E_JPEG_FAILED;
11750*53ee8cc1Swenshuai.xi }
MApi_JPEG_SetNJPDInstance(MS_U8 JPDNum)11751*53ee8cc1Swenshuai.xi void MApi_JPEG_SetNJPDInstance(MS_U8 JPDNum)
11752*53ee8cc1Swenshuai.xi {
11753*53ee8cc1Swenshuai.xi     // wrapper only
11754*53ee8cc1Swenshuai.xi     UNUSED(JPDNum);
11755*53ee8cc1Swenshuai.xi     return;
11756*53ee8cc1Swenshuai.xi }
MApi_JPEG_SetVerificationMode(NJPEG_VerificationMode VerificationMode)11757*53ee8cc1Swenshuai.xi void MApi_JPEG_SetVerificationMode(NJPEG_VerificationMode VerificationMode)
11758*53ee8cc1Swenshuai.xi {
11759*53ee8cc1Swenshuai.xi     // wrapper only
11760*53ee8cc1Swenshuai.xi     UNUSED(VerificationMode);
11761*53ee8cc1Swenshuai.xi     return;
11762*53ee8cc1Swenshuai.xi }
MApi_JPEG_GetVerificationMode(void)11763*53ee8cc1Swenshuai.xi NJPEG_VerificationMode MApi_JPEG_GetVerificationMode(void)
11764*53ee8cc1Swenshuai.xi {
11765*53ee8cc1Swenshuai.xi     // wrapper only
11766*53ee8cc1Swenshuai.xi     return E_NJPEG00_NONE;
11767*53ee8cc1Swenshuai.xi }
MApi_NJPD_Debug(void)11768*53ee8cc1Swenshuai.xi void MApi_NJPD_Debug(void)
11769*53ee8cc1Swenshuai.xi {
11770*53ee8cc1Swenshuai.xi     // wrapper only
11771*53ee8cc1Swenshuai.xi     return;
11772*53ee8cc1Swenshuai.xi }
11773*53ee8cc1Swenshuai.xi 
11774*53ee8cc1Swenshuai.xi 
11775