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 //-------------------------------------------------------------------------------------------------
132*53ee8cc1Swenshuai.xi // Local Compiler Options
133*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
134*53ee8cc1Swenshuai.xi // PS. CMODEL always supports progressive mode decode
135*53ee8cc1Swenshuai.xi #define SUPPORT_PROGRESSIVE_MODE 1
136*53ee8cc1Swenshuai.xi
137*53ee8cc1Swenshuai.xi #define ENABLE_JPEG_NO_SIZE_LOWER_BOUND 0
138*53ee8cc1Swenshuai.xi
139*53ee8cc1Swenshuai.xi #define SUPPORT_PROGRESSIVE_SCLAEDOWN_MODE 1 //CL82399
140*53ee8cc1Swenshuai.xi
141*53ee8cc1Swenshuai.xi #define SW_OPTIMIZE 0
142*53ee8cc1Swenshuai.xi #define SW_JPD_RGB_CMYK 1
143*53ee8cc1Swenshuai.xi #ifdef CMODEL
144*53ee8cc1Swenshuai.xi // This funcion is not ready in CMODEL
145*53ee8cc1Swenshuai.xi #undef SW_JPD_RGB_CMYK
146*53ee8cc1Swenshuai.xi #define SW_JPD_RGB_CMYK 0
147*53ee8cc1Swenshuai.xi #endif
148*53ee8cc1Swenshuai.xi
149*53ee8cc1Swenshuai.xi /* Need to check whether OS support jump API or not */
150*53ee8cc1Swenshuai.xi #ifdef CMODEL
151*53ee8cc1Swenshuai.xi #define JPD_LONGJUMP_SUPPORT
152*53ee8cc1Swenshuai.xi #endif
153*53ee8cc1Swenshuai.xi #if 0
154*53ee8cc1Swenshuai.xi #if !defined(MSOS_TYPE_ECOS)
155*53ee8cc1Swenshuai.xi #define USE_LIBC
156*53ee8cc1Swenshuai.xi #endif
157*53ee8cc1Swenshuai.xi #ifndef USE_LIBC
158*53ee8cc1Swenshuai.xi #define jmp_buf MS_U32
159*53ee8cc1Swenshuai.xi #define setjmp(jmp_state) FALSE
160*53ee8cc1Swenshuai.xi #define longjmp(jmp_state, status)
161*53ee8cc1Swenshuai.xi #endif
162*53ee8cc1Swenshuai.xi #endif
163*53ee8cc1Swenshuai.xi
164*53ee8cc1Swenshuai.xi #define MJPEG_SW_PARSING_IN_MIU0 FALSE // TRUE
165*53ee8cc1Swenshuai.xi #define PRINT_JPD_DECODE_TIME 0
166*53ee8cc1Swenshuai.xi #define LOG_DATA_TO_USB 0
167*53ee8cc1Swenshuai.xi
168*53ee8cc1Swenshuai.xi
169*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
170*53ee8cc1Swenshuai.xi #include "../drv/wdt/drvWDT.h"
171*53ee8cc1Swenshuai.xi #endif
172*53ee8cc1Swenshuai.xi
173*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
174*53ee8cc1Swenshuai.xi // Local Defines
175*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
176*53ee8cc1Swenshuai.xi // Max. allocated blocks
177*53ee8cc1Swenshuai.xi #ifdef CMODEL
178*53ee8cc1Swenshuai.xi #define JPEG_MAXBLOCKS 100
179*53ee8cc1Swenshuai.xi #else
180*53ee8cc1Swenshuai.xi #define JPEG_MAXBLOCKS 50
181*53ee8cc1Swenshuai.xi #endif
182*53ee8cc1Swenshuai.xi
183*53ee8cc1Swenshuai.xi #define DEFAULT_DECODE_TIMEOUT 100
184*53ee8cc1Swenshuai.xi
185*53ee8cc1Swenshuai.xi //fractional bits in scale factors
186*53ee8cc1Swenshuai.xi #define IFAST_SCALE_BITS 2
187*53ee8cc1Swenshuai.xi
188*53ee8cc1Swenshuai.xi #define JPEG_TIFF_SOI_OFFSET 0x0201
189*53ee8cc1Swenshuai.xi #define JPEG_TIFF_JPEG_IMG_BYTES 0x0202
190*53ee8cc1Swenshuai.xi
191*53ee8cc1Swenshuai.xi #define JPEG_TIFF_BIG_ENDIAN 0x4D4D
192*53ee8cc1Swenshuai.xi #define JPEG_TIFF_LITTLE_ENDIAN 0x4949
193*53ee8cc1Swenshuai.xi
194*53ee8cc1Swenshuai.xi //EXIF Tag
195*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_MANUFACTURER 0x010F
196*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_MODEL 0x0110
197*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_ORIENTATION 0x0112
198*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_DATETIME_MOD 0x0132
199*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_EXPOSURE_TIME 0x829A
200*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_F_NUMBER 0x829D
201*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_IFD_POINTER 0x8769
202*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_EXPOSURE_PROGRAM 0x8822
203*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_ISO_SPEED_RATING 0x8827
204*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_DATETIME_ORI 0x9003
205*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_SHUTTER_SPEED 0x9201
206*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_APERTURE 0x9202
207*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_EXPOSURE_BIAS 0x9204
208*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_FLASH 0x9209
209*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_FOCAL_LENGTH 0x920A
210*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_IMAGE_WIDTH 0xA002
211*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_IMAGE_HEIGHT 0xA003
212*53ee8cc1Swenshuai.xi
213*53ee8cc1Swenshuai.xi #define JPEG_MANUFACTURER_SIZE 32
214*53ee8cc1Swenshuai.xi #define JPEG_MODEL_SIZE 128
215*53ee8cc1Swenshuai.xi
216*53ee8cc1Swenshuai.xi #define MIN_READBUFFER_SIZE 128
217*53ee8cc1Swenshuai.xi
218*53ee8cc1Swenshuai.xi #define MRC_BUFFER_ADDR _u32ReadBufferAddr
219*53ee8cc1Swenshuai.xi #define MRC_BUFFER_SIZE _u32ReadBufferSize
220*53ee8cc1Swenshuai.xi #define MWC_BUFFER_ADDR _u32WriteBufferAddr
221*53ee8cc1Swenshuai.xi #define MWC_BUFFER_SIZE _u32WriteBufferSize
222*53ee8cc1Swenshuai.xi #define INTERNAL_BUFFER_ADDR _u32InternalBufferAddr
223*53ee8cc1Swenshuai.xi #define INTERNAL_BUFFER_SIZE _u32InternalBufferSize
224*53ee8cc1Swenshuai.xi
225*53ee8cc1Swenshuai.xi #define HUFF_EXTEND_TBL(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
226*53ee8cc1Swenshuai.xi
227*53ee8cc1Swenshuai.xi #define HUFF_EXTEND_P(x,s) HUFF_EXTEND_TBL(x,s)
228*53ee8cc1Swenshuai.xi
229*53ee8cc1Swenshuai.xi /* EXIF parsing section */
230*53ee8cc1Swenshuai.xi #define EndianChangeL(_x) \
231*53ee8cc1Swenshuai.xi ((((_x) & 0xff) << 24) | (((_x) & 0xff00) << 8) | (((_x) & 0xff0000) >> 8) | (((_x) & 0xff000000) >> 24))
232*53ee8cc1Swenshuai.xi
233*53ee8cc1Swenshuai.xi #define EndianChangeS(_x) \
234*53ee8cc1Swenshuai.xi ((((_x) & 0xff) << 8) | (((_x) & 0xff00) >> 8))
235*53ee8cc1Swenshuai.xi
236*53ee8cc1Swenshuai.xi #define JPEG_TAG_EXIF EndianChangeL(0x45786966)
237*53ee8cc1Swenshuai.xi
238*53ee8cc1Swenshuai.xi #define JPEG_ABS(x) (((x)>=0)?(x):(-(x)))
239*53ee8cc1Swenshuai.xi
240*53ee8cc1Swenshuai.xi #if SUPPORT_OJPD
241*53ee8cc1Swenshuai.xi static APP0_Unit App0_Unit_Data;
242*53ee8cc1Swenshuai.xi
243*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
244*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
245*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16PaddingMcuNumber;
246*53ee8cc1Swenshuai.xi
247*53ee8cc1Swenshuai.xi MS_U32 u32_Decode_Line;
248*53ee8cc1Swenshuai.xi MS_U8 *u8Out_buf;
249*53ee8cc1Swenshuai.xi //#define DCTSIZE 8
250*53ee8cc1Swenshuai.xi //#define DCTELEM int
251*53ee8cc1Swenshuai.xi #define PASS1_BITS 2
252*53ee8cc1Swenshuai.xi #define FIX_3_0727 ((MS_S32)25172) /* FIX(3.072711026) */
253*53ee8cc1Swenshuai.xi #define FIX_2_5629 ((MS_S32)20995) /* FIX(2.562915447) */
254*53ee8cc1Swenshuai.xi #define FIX_2_0531 ((MS_S32)16819) /* FIX(2.053119869) */
255*53ee8cc1Swenshuai.xi #define FIX_1_9615 ((MS_S32)16069) /* FIX(1.961570560) */
256*53ee8cc1Swenshuai.xi #define FIX_1_8477 ((MS_S32)15137) /* FIX(1.847759065) */
257*53ee8cc1Swenshuai.xi #define FIX_1_5013 ((MS_S32)12299) /* FIX(1.501321110) */
258*53ee8cc1Swenshuai.xi #define FIX_1_1758 ((MS_S32)9633) /* FIX(1.175875602) */
259*53ee8cc1Swenshuai.xi #define FIX_0_8999 ((MS_S32)7373) /* FIX(0.899976223) */
260*53ee8cc1Swenshuai.xi #define FIX_0_7653 ((MS_S32)6270) /* FIX(0.765366865) */
261*53ee8cc1Swenshuai.xi #define FIX_0_5411 ((MS_S32)4433) /* FIX(0.541196100) */
262*53ee8cc1Swenshuai.xi #define FIX_0_3901 ((MS_S32)3196) /* FIX(0.390180644) */
263*53ee8cc1Swenshuai.xi #define FIX_0_2986 ((MS_S32)2446) /* FIX(0.298631336) */
264*53ee8cc1Swenshuai.xi #define SCALE_DONE ((MS_S32) 1)
265*53ee8cc1Swenshuai.xi #define DESCALE(a,m) (((a) + (SCALE_DONE << ((m)-1))) >> (m))
266*53ee8cc1Swenshuai.xi #define clamp(i) if (i & 0xFF00) i = (((~i) >> 15) & 0xFF);
267*53ee8cc1Swenshuai.xi #define SCALEBITS 16
268*53ee8cc1Swenshuai.xi #define ONE_HALF ((MS_S32) 1 << (SCALEBITS-1))
269*53ee8cc1Swenshuai.xi #define FIX(x) ((MS_S32) ((x) * (1L<<SCALEBITS) + 0.5))
270*53ee8cc1Swenshuai.xi
271*53ee8cc1Swenshuai.xi
272*53ee8cc1Swenshuai.xi #define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
273*53ee8cc1Swenshuai.xi
274*53ee8cc1Swenshuai.xi #ifdef CMODEL
275*53ee8cc1Swenshuai.xi // Same as drvJPD.h
276*53ee8cc1Swenshuai.xi // JPD Downscale Ratio
277*53ee8cc1Swenshuai.xi // Bellows are 1, 1/2, 1/4 and 1/8 in order
278*53ee8cc1Swenshuai.xi typedef enum
279*53ee8cc1Swenshuai.xi {
280*53ee8cc1Swenshuai.xi E_JPD_DOWNSCALE_ORG = 0x00
281*53ee8cc1Swenshuai.xi , E_JPD_DOWNSCALE_HALF = 0x01
282*53ee8cc1Swenshuai.xi , E_JPD_DOWNSCALE_FOURTH = 0x02
283*53ee8cc1Swenshuai.xi , E_JPD_DOWNSCALE_EIGHTH = 0x03
284*53ee8cc1Swenshuai.xi } JPD_DownScale;
285*53ee8cc1Swenshuai.xi #endif
286*53ee8cc1Swenshuai.xi #endif
287*53ee8cc1Swenshuai.xi
288*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
289*53ee8cc1Swenshuai.xi FILE *logBinfp;
290*53ee8cc1Swenshuai.xi
291*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_MSG(format, args...) do{if(logBinfp) fprintf(logBinfp, format, ##args);}while(0)
292*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_ERR(format, args...) do{if(logBinfp) fprintf(logBinfp, format, ##args);}while(0)
293*53ee8cc1Swenshuai.xi #else
294*53ee8cc1Swenshuai.xi
295*53ee8cc1Swenshuai.xi #ifndef ANDROID
296*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_MSG(format, args...) do{if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) printf(format, ##args);}while(0)
297*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_ERR(format, args...) do{if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) printf(format, ##args);}while(0)
298*53ee8cc1Swenshuai.xi #else
299*53ee8cc1Swenshuai.xi #define LOG_TAG "API_JPEG"
300*53ee8cc1Swenshuai.xi #include <cutils/log.h>
301*53ee8cc1Swenshuai.xi #ifndef LOGD
302*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_MSG(format, args...) do{if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) ALOGI(format, ##args);}while(0)
303*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_ERR(format, args...) do{if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) ALOGE(format, ##args);}while(0)
304*53ee8cc1Swenshuai.xi #else
305*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_MSG(format, args...) do{if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) LOGI(format, ##args);}while(0)
306*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_ERR(format, args...) do{if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) LOGE(format, ##args);}while(0)
307*53ee8cc1Swenshuai.xi #endif
308*53ee8cc1Swenshuai.xi
309*53ee8cc1Swenshuai.xi #endif
310*53ee8cc1Swenshuai.xi
311*53ee8cc1Swenshuai.xi #endif
312*53ee8cc1Swenshuai.xi #define printf_red(args...) do{ printf("\033[1;31m"); printf(args); printf("\033[m"); }while(0)
313*53ee8cc1Swenshuai.xi
314*53ee8cc1Swenshuai.xi #define JPEG_OVER_BUFFER_RET(addr, buf_addr, buf_size) \
315*53ee8cc1Swenshuai.xi do \
316*53ee8cc1Swenshuai.xi { \
317*53ee8cc1Swenshuai.xi if(((MS_U32)(addr) < (MS_U32)(buf_addr)) \
318*53ee8cc1Swenshuai.xi || ((MS_U32)(addr) >= ((MS_U32)(buf_addr) + (MS_U32)(buf_size)))) \
319*53ee8cc1Swenshuai.xi { \
320*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d] invalid address 0x%lx\n", __FUNCTION__, __LINE__, (MS_U32)(addr)); \
321*53ee8cc1Swenshuai.xi return FALSE; \
322*53ee8cc1Swenshuai.xi } \
323*53ee8cc1Swenshuai.xi } \
324*53ee8cc1Swenshuai.xi while(0)
325*53ee8cc1Swenshuai.xi
326*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
327*53ee8cc1Swenshuai.xi // Local Structures
328*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
329*53ee8cc1Swenshuai.xi //JPEG header marker id
330*53ee8cc1Swenshuai.xi typedef enum
331*53ee8cc1Swenshuai.xi {
332*53ee8cc1Swenshuai.xi E_JPEG_SOF0 = 0xC0
333*53ee8cc1Swenshuai.xi , E_JPEG_SOF1 = 0xC1
334*53ee8cc1Swenshuai.xi , E_JPEG_SOF2 = 0xC2
335*53ee8cc1Swenshuai.xi , E_JPEG_SOF3 = 0xC3
336*53ee8cc1Swenshuai.xi , E_JPEG_SOF5 = 0xC5
337*53ee8cc1Swenshuai.xi , E_JPEG_SOF6 = 0xC6
338*53ee8cc1Swenshuai.xi , E_JPEG_SOF7 = 0xC7
339*53ee8cc1Swenshuai.xi , E_JPEG_JPG = 0xC8
340*53ee8cc1Swenshuai.xi , E_JPEG_SOF9 = 0xC9
341*53ee8cc1Swenshuai.xi , E_JPEG_SOF10 = 0xCA
342*53ee8cc1Swenshuai.xi , E_JPEG_SOF11 = 0xCB
343*53ee8cc1Swenshuai.xi , E_JPEG_SOF13 = 0xCD
344*53ee8cc1Swenshuai.xi , E_JPEG_SOF14 = 0xCE
345*53ee8cc1Swenshuai.xi , E_JPEG_SOF15 = 0xCF
346*53ee8cc1Swenshuai.xi , E_JPEG_DHT = 0xC4
347*53ee8cc1Swenshuai.xi , E_JPEG_DAC = 0xCC
348*53ee8cc1Swenshuai.xi , E_JPEG_RST0 = 0xD0
349*53ee8cc1Swenshuai.xi , E_JPEG_RST1 = 0xD1
350*53ee8cc1Swenshuai.xi , E_JPEG_RST2 = 0xD2
351*53ee8cc1Swenshuai.xi , E_JPEG_RST3 = 0xD3
352*53ee8cc1Swenshuai.xi , E_JPEG_RST4 = 0xD4
353*53ee8cc1Swenshuai.xi , E_JPEG_RST5 = 0xD5
354*53ee8cc1Swenshuai.xi , E_JPEG_RST6 = 0xD6
355*53ee8cc1Swenshuai.xi , E_JPEG_RST7 = 0xD7
356*53ee8cc1Swenshuai.xi , E_JPEG_SOI = 0xD8
357*53ee8cc1Swenshuai.xi , E_JPEG_EOI = 0xD9
358*53ee8cc1Swenshuai.xi , E_JPEG_SOS = 0xDA
359*53ee8cc1Swenshuai.xi , E_JPEG_DQT = 0xDB
360*53ee8cc1Swenshuai.xi , E_JPEG_DNL = 0xDC
361*53ee8cc1Swenshuai.xi , E_JPEG_DRI = 0xDD
362*53ee8cc1Swenshuai.xi , E_JPEG_DHP = 0xDE
363*53ee8cc1Swenshuai.xi , E_JPEG_EXP = 0xDF
364*53ee8cc1Swenshuai.xi , E_JPEG_APP0 = 0xE0
365*53ee8cc1Swenshuai.xi , E_JPEG_APP1 = 0xE1
366*53ee8cc1Swenshuai.xi , E_JPEG_APP2 = 0xE2
367*53ee8cc1Swenshuai.xi , E_JPEG_APP3 = 0xE3
368*53ee8cc1Swenshuai.xi , E_JPEG_APP4 = 0xE4
369*53ee8cc1Swenshuai.xi , E_JPEG_APP5 = 0xE5
370*53ee8cc1Swenshuai.xi , E_JPEG_APP6 = 0xE6
371*53ee8cc1Swenshuai.xi , E_JPEG_APP7 = 0xE7
372*53ee8cc1Swenshuai.xi , E_JPEG_APP8 = 0xE8
373*53ee8cc1Swenshuai.xi , E_JPEG_APP9 = 0xE9
374*53ee8cc1Swenshuai.xi , E_JPEG_APP10 = 0xEA
375*53ee8cc1Swenshuai.xi , E_JPEG_APP11 = 0xEB
376*53ee8cc1Swenshuai.xi , E_JPEG_APP12 = 0xEC
377*53ee8cc1Swenshuai.xi , E_JPEG_APP13 = 0xED
378*53ee8cc1Swenshuai.xi , E_JPEG_APP14 = 0xEE
379*53ee8cc1Swenshuai.xi , E_JPEG_APP15 = 0xEF
380*53ee8cc1Swenshuai.xi , E_JPEG_JPG0 = 0xF0
381*53ee8cc1Swenshuai.xi , E_JPEG_JPG1 = 0xF1
382*53ee8cc1Swenshuai.xi , E_JPEG_JPG2 = 0xF2
383*53ee8cc1Swenshuai.xi , E_JPEG_JPG3 = 0xF3
384*53ee8cc1Swenshuai.xi , E_JPEG_JPG4 = 0xF4
385*53ee8cc1Swenshuai.xi , E_JPEG_JPG5 = 0xF5
386*53ee8cc1Swenshuai.xi , E_JPEG_JPG6 = 0xF6
387*53ee8cc1Swenshuai.xi , E_JPEG_JPG7 = 0xF7
388*53ee8cc1Swenshuai.xi , E_JPEG_JPG8 = 0xF8
389*53ee8cc1Swenshuai.xi , E_JPEG_JPG9 = 0xF9
390*53ee8cc1Swenshuai.xi , E_JPEG_JPG10 = 0xFA
391*53ee8cc1Swenshuai.xi , E_JPEG_JPG11 = 0xFB
392*53ee8cc1Swenshuai.xi , E_JPEG_JPG12 = 0xFC
393*53ee8cc1Swenshuai.xi , E_JPEG_JPG13 = 0xFD
394*53ee8cc1Swenshuai.xi , E_JPEG_COM = 0xFE
395*53ee8cc1Swenshuai.xi , E_JPEG_TEM = 0x01
396*53ee8cc1Swenshuai.xi , E_JPEG_ERROR = 0x100
397*53ee8cc1Swenshuai.xi } JPEG_HdrMarker;
398*53ee8cc1Swenshuai.xi
399*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
400*53ee8cc1Swenshuai.xi typedef enum
401*53ee8cc1Swenshuai.xi {
402*53ee8cc1Swenshuai.xi E_RLE_DC = 0,
403*53ee8cc1Swenshuai.xi E_RLE_AC,
404*53ee8cc1Swenshuai.xi E_RLE_ZRL,
405*53ee8cc1Swenshuai.xi E_RLE_EOB,
406*53ee8cc1Swenshuai.xi } JPEG_RLESymbol;
407*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
408*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Name: JPEG_CoeffBuf
409*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Description: The info of coefficient for JPEG decode
410*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
411*53ee8cc1Swenshuai.xi typedef struct
412*53ee8cc1Swenshuai.xi {
413*53ee8cc1Swenshuai.xi MS_U8 *pu8Data; ///<data of coefficient of DC, AC
414*53ee8cc1Swenshuai.xi MS_U16 u16Block_num_x; ///<the number of block for width
415*53ee8cc1Swenshuai.xi MS_U16 u16Block_num_y; ///<the number of block for height
416*53ee8cc1Swenshuai.xi MS_U16 u16Block_size; ///<block size
417*53ee8cc1Swenshuai.xi MS_U8 u8Block_len_x; ///<The width of block
418*53ee8cc1Swenshuai.xi MS_U8 u8Block_len_y; ///<The height of block
419*53ee8cc1Swenshuai.xi } JPEG_CoeffBuf, *PJPEG_CoeffBuf;
420*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
421*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Name: JPEG_SVLD
422*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Description: The info of SVLD for JPEG decode
423*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
424*53ee8cc1Swenshuai.xi typedef struct
425*53ee8cc1Swenshuai.xi {
426*53ee8cc1Swenshuai.xi union
427*53ee8cc1Swenshuai.xi {
428*53ee8cc1Swenshuai.xi struct
429*53ee8cc1Swenshuai.xi {
430*53ee8cc1Swenshuai.xi MS_U32 amp :11; ///<The amplitude of value of VLI
431*53ee8cc1Swenshuai.xi MS_U32 sign :1; ///<The sign of value of VLI
432*53ee8cc1Swenshuai.xi MS_U32 run :4; ///<run value
433*53ee8cc1Swenshuai.xi MS_U32 sym_type :2; ///<symbol type
434*53ee8cc1Swenshuai.xi MS_U32 blk_type :2; ///<YUV type
435*53ee8cc1Swenshuai.xi MS_U32 EOP :1; ///<End of picture
436*53ee8cc1Swenshuai.xi MS_U32 trash :11; ///<reserved
437*53ee8cc1Swenshuai.xi };
438*53ee8cc1Swenshuai.xi
439*53ee8cc1Swenshuai.xi struct
440*53ee8cc1Swenshuai.xi {
441*53ee8cc1Swenshuai.xi MS_U8 byte0; ///<byte0 of SVLD
442*53ee8cc1Swenshuai.xi MS_U8 byte1; ///<byte1 of SVLD
443*53ee8cc1Swenshuai.xi MS_U8 byte2; ///<byte2 of SVLD
444*53ee8cc1Swenshuai.xi MS_U8 byte3; ///<byte3 of SVLD
445*53ee8cc1Swenshuai.xi };
446*53ee8cc1Swenshuai.xi };
447*53ee8cc1Swenshuai.xi } JPEG_SVLD;
448*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
449*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Name: JPEG_HdrChk
450*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Description: The info of header checking for JPEG decode
451*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
452*53ee8cc1Swenshuai.xi typedef union
453*53ee8cc1Swenshuai.xi {
454*53ee8cc1Swenshuai.xi struct
455*53ee8cc1Swenshuai.xi {
456*53ee8cc1Swenshuai.xi MS_U8 DQT:1;///<has Quant Table?
457*53ee8cc1Swenshuai.xi MS_U8 DHT:1;///<has Huffman Table?
458*53ee8cc1Swenshuai.xi // MS_U8 SOF:1;
459*53ee8cc1Swenshuai.xi // MS_U8 SOS:1;
460*53ee8cc1Swenshuai.xi };
461*53ee8cc1Swenshuai.xi MS_U8 result; ///<wildcard for header check
462*53ee8cc1Swenshuai.xi } JPEG_HdrChk;
463*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
464*53ee8cc1Swenshuai.xi typedef MS_BOOL ( *Pdecode_block_func )( MS_U8, MS_U16, MS_U16 );
465*53ee8cc1Swenshuai.xi
466*53ee8cc1Swenshuai.xi
467*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
468*53ee8cc1Swenshuai.xi // Global Variables
469*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
470*53ee8cc1Swenshuai.xi
471*53ee8cc1Swenshuai.xi
472*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
473*53ee8cc1Swenshuai.xi // Local Variables
474*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
475*53ee8cc1Swenshuai.xi #ifdef CMODEL
476*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_HEIGHT = 0xFFFF;
477*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_WIDTH = 0xFFFF;
478*53ee8cc1Swenshuai.xi #else
479*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_HEIGHT = 1200;
480*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_WIDTH = 1600;
481*53ee8cc1Swenshuai.xi #endif
482*53ee8cc1Swenshuai.xi
483*53ee8cc1Swenshuai.xi // max progressive resolution setting
484*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_PRO_MAX_HEIGHT = 768;
485*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_PRO_MAX_WIDTH = 1024;
486*53ee8cc1Swenshuai.xi
487*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 MAX_JPEG_WIDTH_HD = 0;
488*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 MAX_JPEG_HEIGHT_HD = 0;
489*53ee8cc1Swenshuai.xi
490*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
491*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_MAX_HEIGHT = 1200;
492*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_MAX_WIDTH = 1600;
493*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_PRO_MAX_HEIGHT = 768;
494*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_PRO_MAX_WIDTH = 1024;
495*53ee8cc1Swenshuai.xi #endif
496*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
497*53ee8cc1Swenshuai.xi #if 0
498*53ee8cc1Swenshuai.xi // Default Table for JPEG
499*53ee8cc1Swenshuai.xi const MS_U16 g16GRPINFO_TBL[128]=
500*53ee8cc1Swenshuai.xi {
501*53ee8cc1Swenshuai.xi 0x0000,
502*53ee8cc1Swenshuai.xi 0x0000,
503*53ee8cc1Swenshuai.xi 0x0000,
504*53ee8cc1Swenshuai.xi 0x0100,
505*53ee8cc1Swenshuai.xi 0x0010,
506*53ee8cc1Swenshuai.xi 0x0140,
507*53ee8cc1Swenshuai.xi 0x0060,
508*53ee8cc1Swenshuai.xi 0x01e0,
509*53ee8cc1Swenshuai.xi 0x0070,
510*53ee8cc1Swenshuai.xi 0x01f0,
511*53ee8cc1Swenshuai.xi 0x0080,
512*53ee8cc1Swenshuai.xi 0x01f8,
513*53ee8cc1Swenshuai.xi 0x0090,
514*53ee8cc1Swenshuai.xi 0x01fc,
515*53ee8cc1Swenshuai.xi 0x00a0,
516*53ee8cc1Swenshuai.xi 0x01fe,
517*53ee8cc1Swenshuai.xi 0x00b0,
518*53ee8cc1Swenshuai.xi 0x01ff,
519*53ee8cc1Swenshuai.xi 0x0000,
520*53ee8cc1Swenshuai.xi 0x0000,
521*53ee8cc1Swenshuai.xi 0x0000,
522*53ee8cc1Swenshuai.xi 0x0000,
523*53ee8cc1Swenshuai.xi 0x0000,
524*53ee8cc1Swenshuai.xi 0x0000,
525*53ee8cc1Swenshuai.xi 0x0000,
526*53ee8cc1Swenshuai.xi 0x0000,
527*53ee8cc1Swenshuai.xi 0x0000,
528*53ee8cc1Swenshuai.xi 0x0000,
529*53ee8cc1Swenshuai.xi 0x0000,
530*53ee8cc1Swenshuai.xi 0x0000,
531*53ee8cc1Swenshuai.xi 0x0000,
532*53ee8cc1Swenshuai.xi 0x0000,
533*53ee8cc1Swenshuai.xi 0x0000,
534*53ee8cc1Swenshuai.xi 0x0000,
535*53ee8cc1Swenshuai.xi 0x0000,
536*53ee8cc1Swenshuai.xi 0x0100,
537*53ee8cc1Swenshuai.xi 0x0030,
538*53ee8cc1Swenshuai.xi 0x01c0,
539*53ee8cc1Swenshuai.xi 0x0040,
540*53ee8cc1Swenshuai.xi 0x01e0,
541*53ee8cc1Swenshuai.xi 0x0050,
542*53ee8cc1Swenshuai.xi 0x01f0,
543*53ee8cc1Swenshuai.xi 0x0060,
544*53ee8cc1Swenshuai.xi 0x01f8,
545*53ee8cc1Swenshuai.xi 0x0070,
546*53ee8cc1Swenshuai.xi 0x01fc,
547*53ee8cc1Swenshuai.xi 0x0080,
548*53ee8cc1Swenshuai.xi 0x01fe,
549*53ee8cc1Swenshuai.xi 0x0090,
550*53ee8cc1Swenshuai.xi 0x01ff,
551*53ee8cc1Swenshuai.xi 0x80a0,
552*53ee8cc1Swenshuai.xi 0x01ff,
553*53ee8cc1Swenshuai.xi 0xc0b0,
554*53ee8cc1Swenshuai.xi 0x01ff,
555*53ee8cc1Swenshuai.xi 0x0000,
556*53ee8cc1Swenshuai.xi 0x0000,
557*53ee8cc1Swenshuai.xi 0x0000,
558*53ee8cc1Swenshuai.xi 0x0000,
559*53ee8cc1Swenshuai.xi 0x0000,
560*53ee8cc1Swenshuai.xi 0x0000,
561*53ee8cc1Swenshuai.xi 0x0000,
562*53ee8cc1Swenshuai.xi 0x0000,
563*53ee8cc1Swenshuai.xi 0x0000,
564*53ee8cc1Swenshuai.xi 0x0000,
565*53ee8cc1Swenshuai.xi 0x0000,
566*53ee8cc1Swenshuai.xi 0x0000,
567*53ee8cc1Swenshuai.xi 0x0000,
568*53ee8cc1Swenshuai.xi 0x0100,
569*53ee8cc1Swenshuai.xi 0x0002,
570*53ee8cc1Swenshuai.xi 0x0180,
571*53ee8cc1Swenshuai.xi 0x0003,
572*53ee8cc1Swenshuai.xi 0x01a0,
573*53ee8cc1Swenshuai.xi 0x0006,
574*53ee8cc1Swenshuai.xi 0x01d0,
575*53ee8cc1Swenshuai.xi 0x0009,
576*53ee8cc1Swenshuai.xi 0x01e8,
577*53ee8cc1Swenshuai.xi 0x000b,
578*53ee8cc1Swenshuai.xi 0x01f0,
579*53ee8cc1Swenshuai.xi 0x000f,
580*53ee8cc1Swenshuai.xi 0x01f8,
581*53ee8cc1Swenshuai.xi 0x0012,
582*53ee8cc1Swenshuai.xi 0x01fb,
583*53ee8cc1Swenshuai.xi 0x8017,
584*53ee8cc1Swenshuai.xi 0x01fd,
585*53ee8cc1Swenshuai.xi 0xc01c,
586*53ee8cc1Swenshuai.xi 0x01fe,
587*53ee8cc1Swenshuai.xi 0x4020,
588*53ee8cc1Swenshuai.xi 0x01ff,
589*53ee8cc1Swenshuai.xi 0x0000,
590*53ee8cc1Swenshuai.xi 0x0000,
591*53ee8cc1Swenshuai.xi 0x0000,
592*53ee8cc1Swenshuai.xi 0x0000,
593*53ee8cc1Swenshuai.xi 0x8024,
594*53ee8cc1Swenshuai.xi 0x01ff,
595*53ee8cc1Swenshuai.xi 0x8225,
596*53ee8cc1Swenshuai.xi 0x01ff,
597*53ee8cc1Swenshuai.xi 0x0000,
598*53ee8cc1Swenshuai.xi 0x0000,
599*53ee8cc1Swenshuai.xi 0x0000,
600*53ee8cc1Swenshuai.xi 0x0100,
601*53ee8cc1Swenshuai.xi 0x0002,
602*53ee8cc1Swenshuai.xi 0x0180,
603*53ee8cc1Swenshuai.xi 0x0003,
604*53ee8cc1Swenshuai.xi 0x01a0,
605*53ee8cc1Swenshuai.xi 0x0005,
606*53ee8cc1Swenshuai.xi 0x01c0,
607*53ee8cc1Swenshuai.xi 0x0009,
608*53ee8cc1Swenshuai.xi 0x01e0,
609*53ee8cc1Swenshuai.xi 0x000d,
610*53ee8cc1Swenshuai.xi 0x01f0,
611*53ee8cc1Swenshuai.xi 0x0010,
612*53ee8cc1Swenshuai.xi 0x01f6,
613*53ee8cc1Swenshuai.xi 0x0014,
614*53ee8cc1Swenshuai.xi 0x01fa,
615*53ee8cc1Swenshuai.xi 0x801b,
616*53ee8cc1Swenshuai.xi 0x01fd,
617*53ee8cc1Swenshuai.xi 0xc020,
618*53ee8cc1Swenshuai.xi 0x01fe,
619*53ee8cc1Swenshuai.xi 0x4024,
620*53ee8cc1Swenshuai.xi 0x01ff,
621*53ee8cc1Swenshuai.xi 0x0000,
622*53ee8cc1Swenshuai.xi 0x0000,
623*53ee8cc1Swenshuai.xi 0x8028,
624*53ee8cc1Swenshuai.xi 0x01ff,
625*53ee8cc1Swenshuai.xi 0x8429,
626*53ee8cc1Swenshuai.xi 0x01ff,
627*53ee8cc1Swenshuai.xi 0x882b,
628*53ee8cc1Swenshuai.xi 0x01ff
629*53ee8cc1Swenshuai.xi };
630*53ee8cc1Swenshuai.xi #endif
631*53ee8cc1Swenshuai.xi #if 0
632*53ee8cc1Swenshuai.xi const MS_U16 g16SYMIDX_TBL[]=
633*53ee8cc1Swenshuai.xi {
634*53ee8cc1Swenshuai.xi 0x0001,
635*53ee8cc1Swenshuai.xi 0x0102,
636*53ee8cc1Swenshuai.xi 0x0203,
637*53ee8cc1Swenshuai.xi 0x0300,
638*53ee8cc1Swenshuai.xi 0x1104,
639*53ee8cc1Swenshuai.xi 0x0411,
640*53ee8cc1Swenshuai.xi 0x0505,
641*53ee8cc1Swenshuai.xi 0x2112,
642*53ee8cc1Swenshuai.xi 0x3121,
643*53ee8cc1Swenshuai.xi 0x0631,
644*53ee8cc1Swenshuai.xi 0x1241,
645*53ee8cc1Swenshuai.xi 0x4106,
646*53ee8cc1Swenshuai.xi 0x5113,
647*53ee8cc1Swenshuai.xi 0x0751,
648*53ee8cc1Swenshuai.xi 0x6161,
649*53ee8cc1Swenshuai.xi 0x7107,
650*53ee8cc1Swenshuai.xi 0x1322,
651*53ee8cc1Swenshuai.xi 0x2271,
652*53ee8cc1Swenshuai.xi 0x3214,
653*53ee8cc1Swenshuai.xi 0x8132,
654*53ee8cc1Swenshuai.xi 0x0881,
655*53ee8cc1Swenshuai.xi 0x1491,
656*53ee8cc1Swenshuai.xi 0x42a1,
657*53ee8cc1Swenshuai.xi 0x9108,
658*53ee8cc1Swenshuai.xi 0xa123,
659*53ee8cc1Swenshuai.xi 0xb142,
660*53ee8cc1Swenshuai.xi 0xc1b1,
661*53ee8cc1Swenshuai.xi 0x09c1,
662*53ee8cc1Swenshuai.xi 0x2315,
663*53ee8cc1Swenshuai.xi 0x3352,
664*53ee8cc1Swenshuai.xi 0x52d1,
665*53ee8cc1Swenshuai.xi 0xf0f0,
666*53ee8cc1Swenshuai.xi 0x1524,
667*53ee8cc1Swenshuai.xi 0x6233,
668*53ee8cc1Swenshuai.xi 0x7262,
669*53ee8cc1Swenshuai.xi 0xd172,
670*53ee8cc1Swenshuai.xi 0x0a82,
671*53ee8cc1Swenshuai.xi 0x1609,
672*53ee8cc1Swenshuai.xi 0x240a,
673*53ee8cc1Swenshuai.xi 0x3416,
674*53ee8cc1Swenshuai.xi 0xe117,
675*53ee8cc1Swenshuai.xi 0x2518,
676*53ee8cc1Swenshuai.xi 0xf119,
677*53ee8cc1Swenshuai.xi 0x171a,
678*53ee8cc1Swenshuai.xi 0x1825,
679*53ee8cc1Swenshuai.xi 0x1926,
680*53ee8cc1Swenshuai.xi 0x1a27,
681*53ee8cc1Swenshuai.xi 0x2628,
682*53ee8cc1Swenshuai.xi 0x2729,
683*53ee8cc1Swenshuai.xi 0x282a,
684*53ee8cc1Swenshuai.xi 0x2934,
685*53ee8cc1Swenshuai.xi 0x2a35,
686*53ee8cc1Swenshuai.xi 0x3536,
687*53ee8cc1Swenshuai.xi 0x3637,
688*53ee8cc1Swenshuai.xi 0x3738,
689*53ee8cc1Swenshuai.xi 0x3839,
690*53ee8cc1Swenshuai.xi 0x393a,
691*53ee8cc1Swenshuai.xi 0x3a43,
692*53ee8cc1Swenshuai.xi 0x4344,
693*53ee8cc1Swenshuai.xi 0x4445,
694*53ee8cc1Swenshuai.xi 0x4546,
695*53ee8cc1Swenshuai.xi 0x4647,
696*53ee8cc1Swenshuai.xi 0x4748,
697*53ee8cc1Swenshuai.xi 0x4849,
698*53ee8cc1Swenshuai.xi 0x494a,
699*53ee8cc1Swenshuai.xi 0x4a53,
700*53ee8cc1Swenshuai.xi 0x5354,
701*53ee8cc1Swenshuai.xi 0x5455,
702*53ee8cc1Swenshuai.xi 0x5556,
703*53ee8cc1Swenshuai.xi 0x5657,
704*53ee8cc1Swenshuai.xi 0x5758,
705*53ee8cc1Swenshuai.xi 0x5859,
706*53ee8cc1Swenshuai.xi 0x595a,
707*53ee8cc1Swenshuai.xi 0x5a63,
708*53ee8cc1Swenshuai.xi 0x6364,
709*53ee8cc1Swenshuai.xi 0x6465,
710*53ee8cc1Swenshuai.xi 0x6566,
711*53ee8cc1Swenshuai.xi 0x6667,
712*53ee8cc1Swenshuai.xi 0x6768,
713*53ee8cc1Swenshuai.xi 0x6869,
714*53ee8cc1Swenshuai.xi 0x696a,
715*53ee8cc1Swenshuai.xi 0x6a73,
716*53ee8cc1Swenshuai.xi 0x7374,
717*53ee8cc1Swenshuai.xi 0x7475,
718*53ee8cc1Swenshuai.xi 0x7576,
719*53ee8cc1Swenshuai.xi 0x7677,
720*53ee8cc1Swenshuai.xi 0x7778,
721*53ee8cc1Swenshuai.xi 0x7879,
722*53ee8cc1Swenshuai.xi 0x797a,
723*53ee8cc1Swenshuai.xi 0x7a83,
724*53ee8cc1Swenshuai.xi 0x8284,
725*53ee8cc1Swenshuai.xi 0x8385,
726*53ee8cc1Swenshuai.xi 0x8486,
727*53ee8cc1Swenshuai.xi 0x8587,
728*53ee8cc1Swenshuai.xi 0x8688,
729*53ee8cc1Swenshuai.xi 0x8789,
730*53ee8cc1Swenshuai.xi 0x888a,
731*53ee8cc1Swenshuai.xi 0x8992,
732*53ee8cc1Swenshuai.xi 0x8a93,
733*53ee8cc1Swenshuai.xi 0x9294,
734*53ee8cc1Swenshuai.xi 0x9395,
735*53ee8cc1Swenshuai.xi 0x9496,
736*53ee8cc1Swenshuai.xi 0x9597,
737*53ee8cc1Swenshuai.xi 0x9698,
738*53ee8cc1Swenshuai.xi 0x9799,
739*53ee8cc1Swenshuai.xi 0x989a,
740*53ee8cc1Swenshuai.xi 0x99a2,
741*53ee8cc1Swenshuai.xi 0x9aa3,
742*53ee8cc1Swenshuai.xi 0xa2a4,
743*53ee8cc1Swenshuai.xi 0xa3a5,
744*53ee8cc1Swenshuai.xi 0xa4a6,
745*53ee8cc1Swenshuai.xi 0xa5a7,
746*53ee8cc1Swenshuai.xi 0xa6a8,
747*53ee8cc1Swenshuai.xi 0xa7a9,
748*53ee8cc1Swenshuai.xi 0xa8aa,
749*53ee8cc1Swenshuai.xi 0xa9b2,
750*53ee8cc1Swenshuai.xi 0xaab3,
751*53ee8cc1Swenshuai.xi 0xb2b4,
752*53ee8cc1Swenshuai.xi 0xb3b5,
753*53ee8cc1Swenshuai.xi 0xb4b6,
754*53ee8cc1Swenshuai.xi 0xb5b7,
755*53ee8cc1Swenshuai.xi 0xb6b8,
756*53ee8cc1Swenshuai.xi 0xb7b9,
757*53ee8cc1Swenshuai.xi 0xb8ba,
758*53ee8cc1Swenshuai.xi 0xb9c2,
759*53ee8cc1Swenshuai.xi 0xbac3,
760*53ee8cc1Swenshuai.xi 0xc2c4,
761*53ee8cc1Swenshuai.xi 0xc3c5,
762*53ee8cc1Swenshuai.xi 0xc4c6,
763*53ee8cc1Swenshuai.xi 0xc5c7,
764*53ee8cc1Swenshuai.xi 0xc6c8,
765*53ee8cc1Swenshuai.xi 0xc7c9,
766*53ee8cc1Swenshuai.xi 0xc8ca,
767*53ee8cc1Swenshuai.xi 0xc9d2,
768*53ee8cc1Swenshuai.xi 0xcad3,
769*53ee8cc1Swenshuai.xi 0xd2d4,
770*53ee8cc1Swenshuai.xi 0xd3d5,
771*53ee8cc1Swenshuai.xi 0xd4d6,
772*53ee8cc1Swenshuai.xi 0xd5d7,
773*53ee8cc1Swenshuai.xi 0xd6d8,
774*53ee8cc1Swenshuai.xi 0xd7d9,
775*53ee8cc1Swenshuai.xi 0xd8da,
776*53ee8cc1Swenshuai.xi 0xd9e1,
777*53ee8cc1Swenshuai.xi 0xdae2,
778*53ee8cc1Swenshuai.xi 0xe2e3,
779*53ee8cc1Swenshuai.xi 0xe3e4,
780*53ee8cc1Swenshuai.xi 0xe4e5,
781*53ee8cc1Swenshuai.xi 0xe5e6,
782*53ee8cc1Swenshuai.xi 0xe6e7,
783*53ee8cc1Swenshuai.xi 0xe7e8,
784*53ee8cc1Swenshuai.xi 0xe8e9,
785*53ee8cc1Swenshuai.xi 0xe9ea,
786*53ee8cc1Swenshuai.xi 0xeaf1,
787*53ee8cc1Swenshuai.xi 0xf2f2,
788*53ee8cc1Swenshuai.xi 0xf3f3,
789*53ee8cc1Swenshuai.xi 0xf4f4,
790*53ee8cc1Swenshuai.xi 0xf5f5,
791*53ee8cc1Swenshuai.xi 0xf6f6,
792*53ee8cc1Swenshuai.xi 0xf7f7,
793*53ee8cc1Swenshuai.xi 0xf8f8,
794*53ee8cc1Swenshuai.xi 0xf9f9,
795*53ee8cc1Swenshuai.xi 0xfafa,
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 0x0000,
876*53ee8cc1Swenshuai.xi 0x0000,
877*53ee8cc1Swenshuai.xi 0x0000,
878*53ee8cc1Swenshuai.xi 0x0000,
879*53ee8cc1Swenshuai.xi 0x0000,
880*53ee8cc1Swenshuai.xi 0x0000,
881*53ee8cc1Swenshuai.xi 0x0000,
882*53ee8cc1Swenshuai.xi 0x0000,
883*53ee8cc1Swenshuai.xi 0x0000,
884*53ee8cc1Swenshuai.xi 0x0000,
885*53ee8cc1Swenshuai.xi 0x0000,
886*53ee8cc1Swenshuai.xi 0x0000,
887*53ee8cc1Swenshuai.xi 0x0000,
888*53ee8cc1Swenshuai.xi 0x0000,
889*53ee8cc1Swenshuai.xi 0x0000,
890*53ee8cc1Swenshuai.xi 0x0000,
891*53ee8cc1Swenshuai.xi 0x0101,
892*53ee8cc1Swenshuai.xi 0x0202,
893*53ee8cc1Swenshuai.xi 0x0303,
894*53ee8cc1Swenshuai.xi 0x0404,
895*53ee8cc1Swenshuai.xi 0x0505,
896*53ee8cc1Swenshuai.xi 0x0606,
897*53ee8cc1Swenshuai.xi 0x0707,
898*53ee8cc1Swenshuai.xi 0x0808,
899*53ee8cc1Swenshuai.xi 0x0909,
900*53ee8cc1Swenshuai.xi 0x0a0a,
901*53ee8cc1Swenshuai.xi 0x0b0b,
902*53ee8cc1Swenshuai.xi 0x0000,
903*53ee8cc1Swenshuai.xi 0x0000,
904*53ee8cc1Swenshuai.xi 0x0000,
905*53ee8cc1Swenshuai.xi 0x0000
906*53ee8cc1Swenshuai.xi };
907*53ee8cc1Swenshuai.xi #endif
908*53ee8cc1Swenshuai.xi #if 0
909*53ee8cc1Swenshuai.xi const MS_U16 g16IQ_TBL[128]=
910*53ee8cc1Swenshuai.xi {
911*53ee8cc1Swenshuai.xi 0x0010,
912*53ee8cc1Swenshuai.xi 0x000b,
913*53ee8cc1Swenshuai.xi 0x000a,
914*53ee8cc1Swenshuai.xi 0x0010,
915*53ee8cc1Swenshuai.xi 0x0018,
916*53ee8cc1Swenshuai.xi 0x0028,
917*53ee8cc1Swenshuai.xi 0x0033,
918*53ee8cc1Swenshuai.xi 0x003d,
919*53ee8cc1Swenshuai.xi 0x000c,
920*53ee8cc1Swenshuai.xi 0x000c,
921*53ee8cc1Swenshuai.xi 0x000e,
922*53ee8cc1Swenshuai.xi 0x0013,
923*53ee8cc1Swenshuai.xi 0x001a,
924*53ee8cc1Swenshuai.xi 0x003a,
925*53ee8cc1Swenshuai.xi 0x003c,
926*53ee8cc1Swenshuai.xi 0x0037,
927*53ee8cc1Swenshuai.xi 0x000e,
928*53ee8cc1Swenshuai.xi 0x000d,
929*53ee8cc1Swenshuai.xi 0x0010,
930*53ee8cc1Swenshuai.xi 0x0018,
931*53ee8cc1Swenshuai.xi 0x0028,
932*53ee8cc1Swenshuai.xi 0x0039,
933*53ee8cc1Swenshuai.xi 0x0045,
934*53ee8cc1Swenshuai.xi 0x0038,
935*53ee8cc1Swenshuai.xi 0x000e,
936*53ee8cc1Swenshuai.xi 0x0011,
937*53ee8cc1Swenshuai.xi 0x0016,
938*53ee8cc1Swenshuai.xi 0x001d,
939*53ee8cc1Swenshuai.xi 0x0033,
940*53ee8cc1Swenshuai.xi 0x0057,
941*53ee8cc1Swenshuai.xi 0x0050,
942*53ee8cc1Swenshuai.xi 0x003e,
943*53ee8cc1Swenshuai.xi 0x0012,
944*53ee8cc1Swenshuai.xi 0x0016,
945*53ee8cc1Swenshuai.xi 0x0025,
946*53ee8cc1Swenshuai.xi 0x0038,
947*53ee8cc1Swenshuai.xi 0x0044,
948*53ee8cc1Swenshuai.xi 0x006d,
949*53ee8cc1Swenshuai.xi 0x0067,
950*53ee8cc1Swenshuai.xi 0x004d,
951*53ee8cc1Swenshuai.xi 0x0018,
952*53ee8cc1Swenshuai.xi 0x0023,
953*53ee8cc1Swenshuai.xi 0x0037,
954*53ee8cc1Swenshuai.xi 0x0040,
955*53ee8cc1Swenshuai.xi 0x0051,
956*53ee8cc1Swenshuai.xi 0x0068,
957*53ee8cc1Swenshuai.xi 0x0071,
958*53ee8cc1Swenshuai.xi 0x005c,
959*53ee8cc1Swenshuai.xi 0x0031,
960*53ee8cc1Swenshuai.xi 0x0040,
961*53ee8cc1Swenshuai.xi 0x004e,
962*53ee8cc1Swenshuai.xi 0x0057,
963*53ee8cc1Swenshuai.xi 0x0067,
964*53ee8cc1Swenshuai.xi 0x0079,
965*53ee8cc1Swenshuai.xi 0x0078,
966*53ee8cc1Swenshuai.xi 0x0065,
967*53ee8cc1Swenshuai.xi 0x0048,
968*53ee8cc1Swenshuai.xi 0x005c,
969*53ee8cc1Swenshuai.xi 0x005f,
970*53ee8cc1Swenshuai.xi 0x0062,
971*53ee8cc1Swenshuai.xi 0x0070,
972*53ee8cc1Swenshuai.xi 0x0064,
973*53ee8cc1Swenshuai.xi 0x0067,
974*53ee8cc1Swenshuai.xi 0x0063,
975*53ee8cc1Swenshuai.xi 0x0011,
976*53ee8cc1Swenshuai.xi 0x0012,
977*53ee8cc1Swenshuai.xi 0x0018,
978*53ee8cc1Swenshuai.xi 0x002f,
979*53ee8cc1Swenshuai.xi 0x0063,
980*53ee8cc1Swenshuai.xi 0x0063,
981*53ee8cc1Swenshuai.xi 0x0063,
982*53ee8cc1Swenshuai.xi 0x0063,
983*53ee8cc1Swenshuai.xi 0x0012,
984*53ee8cc1Swenshuai.xi 0x0015,
985*53ee8cc1Swenshuai.xi 0x001a,
986*53ee8cc1Swenshuai.xi 0x0042,
987*53ee8cc1Swenshuai.xi 0x0063,
988*53ee8cc1Swenshuai.xi 0x0063,
989*53ee8cc1Swenshuai.xi 0x0063,
990*53ee8cc1Swenshuai.xi 0x0063,
991*53ee8cc1Swenshuai.xi 0x0018,
992*53ee8cc1Swenshuai.xi 0x001a,
993*53ee8cc1Swenshuai.xi 0x0038,
994*53ee8cc1Swenshuai.xi 0x0063,
995*53ee8cc1Swenshuai.xi 0x0063,
996*53ee8cc1Swenshuai.xi 0x0063,
997*53ee8cc1Swenshuai.xi 0x0063,
998*53ee8cc1Swenshuai.xi 0x0063,
999*53ee8cc1Swenshuai.xi 0x002f,
1000*53ee8cc1Swenshuai.xi 0x0042,
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 0x0063,
1024*53ee8cc1Swenshuai.xi 0x0063,
1025*53ee8cc1Swenshuai.xi 0x0063,
1026*53ee8cc1Swenshuai.xi 0x0063,
1027*53ee8cc1Swenshuai.xi 0x0063,
1028*53ee8cc1Swenshuai.xi 0x0063,
1029*53ee8cc1Swenshuai.xi 0x0063,
1030*53ee8cc1Swenshuai.xi 0x0063,
1031*53ee8cc1Swenshuai.xi 0x0063,
1032*53ee8cc1Swenshuai.xi 0x0063,
1033*53ee8cc1Swenshuai.xi 0x0063,
1034*53ee8cc1Swenshuai.xi 0x0063,
1035*53ee8cc1Swenshuai.xi 0x0063,
1036*53ee8cc1Swenshuai.xi 0x0063,
1037*53ee8cc1Swenshuai.xi 0x0063,
1038*53ee8cc1Swenshuai.xi 0x0063
1039*53ee8cc1Swenshuai.xi };
1040*53ee8cc1Swenshuai.xi #endif
1041*53ee8cc1Swenshuai.xi
1042*53ee8cc1Swenshuai.xi /* entry n is (-1 << n) + 1 */
1043*53ee8cc1Swenshuai.xi static const MS_S32 extend_offset[16] =
1044*53ee8cc1Swenshuai.xi {
1045*53ee8cc1Swenshuai.xi 0, (( -1)<<1)+1, ((-1)<<2)+1, ((-1)<<3) + 1, ((-1)<<4)+1, ((-1)<<5)+1,
1046*53ee8cc1Swenshuai.xi ((-1)<<6)+1, ((-1)<<7)+1, ((-1)<<8)+1, ((-1)<<9)+1, ((-1) <<10)+1,
1047*53ee8cc1Swenshuai.xi ((-1)<<11)+1, ((-1)<<12)+1, ((-1)<<13)+1, ((-1)<<14)+1, ((-1)<<15)+1
1048*53ee8cc1Swenshuai.xi };
1049*53ee8cc1Swenshuai.xi
1050*53ee8cc1Swenshuai.xi /* entry n is 2**(n-1) */
1051*53ee8cc1Swenshuai.xi static const MS_S32 extend_test[16] =
1052*53ee8cc1Swenshuai.xi {
1053*53ee8cc1Swenshuai.xi 0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000
1054*53ee8cc1Swenshuai.xi };
1055*53ee8cc1Swenshuai.xi
1056*53ee8cc1Swenshuai.xi static const MS_S32 extend_mask[] =
1057*53ee8cc1Swenshuai.xi {
1058*53ee8cc1Swenshuai.xi 0, (1<<0), (1<<1), (1<<2), (1<<3), (1<<4), (1<<5), (1<<6), (1<<7), (1<<8),
1059*53ee8cc1Swenshuai.xi (1<<9), (1<<10), (1<<11), (1<<12), (1<<13), (1<<14), (1<<15), (1<<16),
1060*53ee8cc1Swenshuai.xi };
1061*53ee8cc1Swenshuai.xi
1062*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ReadBufferAddr;
1063*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ReadBufferSize;
1064*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32WriteBufferAddr;
1065*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32WriteBufferSize;
1066*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32InternalBufferAddr;
1067*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32InternalBufferSize;
1068*53ee8cc1Swenshuai.xi
1069*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32RLEOffset; // offset to record the current RLE access address
1070*53ee8cc1Swenshuai.xi
1071*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_HdrChk _HeadCheck;
1072*53ee8cc1Swenshuai.xi
1073*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_BLOCK_TYPE _s16dc_pred[3];
1074*53ee8cc1Swenshuai.xi
1075*53ee8cc1Swenshuai.xi // The width/height may be the thumbnail or original image size, it based on decoding mode
1076*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Image_x_size;
1077*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Image_y_size;
1078*53ee8cc1Swenshuai.xi
1079*53ee8cc1Swenshuai.xi // The original size of this JPEG file after alignment
1080*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16OriginalImage_x_size;
1081*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16OriginalImage_y_size;
1082*53ee8cc1Swenshuai.xi
1083*53ee8cc1Swenshuai.xi // The original size before alignment
1084*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16NonAlignmentImage_x_size;
1085*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16NonAlignmentImage_y_size;
1086*53ee8cc1Swenshuai.xi
1087*53ee8cc1Swenshuai.xi // The width/height/pitch of image for displaying.
1088*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImageWidth;
1089*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImagePitch;
1090*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImageHeight;
1091*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImagePitch_H;
1092*53ee8cc1Swenshuai.xi
1093*53ee8cc1Swenshuai.xi // Scale Down Factor
1094*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8ScaleDownFactor;
1095*53ee8cc1Swenshuai.xi
1096*53ee8cc1Swenshuai.xi ////JPEG_STATIC PJPEG_FILE_FileSystem_t _pStream;
1097*53ee8cc1Swenshuai.xi
1098*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8DecodeType = E_JPEG_TYPE_MAIN;
1099*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bProgressive_flag;
1100*53ee8cc1Swenshuai.xi
1101*53ee8cc1Swenshuai.xi #ifndef CMODEL
1102*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8DownScaleRatio;
1103*53ee8cc1Swenshuai.xi #endif
1104*53ee8cc1Swenshuai.xi
1105*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bFirstRLE;
1106*53ee8cc1Swenshuai.xi
1107*53ee8cc1Swenshuai.xi /******* Thumbnail related *******/
1108*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bThumbnailFound;
1109*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bThumbnailAccessMode;
1110*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ThumbnailOffset;
1111*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16ThumbnailSize;
1112*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bTiffBigEndian;
1113*53ee8cc1Swenshuai.xi
1114*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ThumbnailBufferOffset; // keep track of thumb buffer access address
1115*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u16ThumbnailBufferSize; // keep track of thumb buffer size
1116*53ee8cc1Swenshuai.xi /*****************************/
1117*53ee8cc1Swenshuai.xi
1118*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_HuffInfo _Huff_info[JPEG_MAXHUFFTABLES];
1119*53ee8cc1Swenshuai.xi
1120*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_QuantTbl _QuantTables[JPEG_MAXQUANTTABLES]; /* pointer to quantization tables */
1121*53ee8cc1Swenshuai.xi
1122*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comps_in_frame; /* # of components in frame */
1123*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_h_samp[JPEG_MAXCOMPONENTS]; /* component's horizontal sampling factor */
1124*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_v_samp[JPEG_MAXCOMPONENTS]; /* component's vertical sampling factor */
1125*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_quant[JPEG_MAXCOMPONENTS]; /* component's quantization table selector */
1126*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_ident[JPEG_MAXCOMPONENTS]; /* component's ID */
1127*53ee8cc1Swenshuai.xi
1128*53ee8cc1Swenshuai.xi // The Luma and Chroma (YU) component ID, default is 1 & 2
1129*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8LumaCi = 1;
1130*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8ChromaCi = 2;
1131*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Chroma2Ci = 3;
1132*53ee8cc1Swenshuai.xi
1133*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Comp_h_blocks[JPEG_MAXCOMPONENTS];
1134*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Comp_v_blocks[JPEG_MAXCOMPONENTS];
1135*53ee8cc1Swenshuai.xi
1136*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comps_in_scan; /* # of components in scan */
1137*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_list[JPEG_MAXCOMPSINSCAN]; /* components in this scan */
1138*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_dc_tab[JPEG_MAXCOMPONENTS]; /* component's DC Huffman coding table selector */
1139*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_ac_tab[JPEG_MAXCOMPONENTS]; /* component's AC Huffman coding table selector */
1140*53ee8cc1Swenshuai.xi
1141*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Spectral_start; /* spectral selection start */
1142*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Spectral_end; /* spectral selection end */
1143*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Successive_low; /* successive approximation low */
1144*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Successive_high; /* successive approximation high */
1145*53ee8cc1Swenshuai.xi
1146*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Blocks_per_mcu;
1147*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Max_blocks_per_row;
1148*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Mcus_per_row;
1149*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Mcus_per_col;
1150*53ee8cc1Swenshuai.xi
1151*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Mcu_org[JPEG_MAXBLOCKSPERMCU];
1152*53ee8cc1Swenshuai.xi
1153*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 gu8Max_mcu_x_size; /* MCU's max. X size in pixels */
1154*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 gu8Max_mcu_y_size; /* MCU's max. Y size in pixels */
1155*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 gu16Max_mcus_per_row;
1156*53ee8cc1Swenshuai.xi
1157*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
1158*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Total_lines_left; /* total # lines left in image */
1159*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Block_y_mcu[JPEG_MAXCOMPONENTS];
1160*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_HuffTbl _Huff_tbls[JPEG_MAXHUFFTABLES];
1161*53ee8cc1Swenshuai.xi JPEG_STATIC PJPEG_CoeffBuf _DC_Coeffs[JPEG_MAXCOMPONENTS];
1162*53ee8cc1Swenshuai.xi JPEG_STATIC PJPEG_CoeffBuf _AC_Coeffs[JPEG_MAXCOMPONENTS];
1163*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Last_dc_val[JPEG_MAXCOMPONENTS];
1164*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EOB_run;
1165*53ee8cc1Swenshuai.xi #ifdef CMODEL
1166*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 gu16Mcu_lines_left; /* total # lines left in this MCU */
1167*53ee8cc1Swenshuai.xi #endif
1168*53ee8cc1Swenshuai.xi #endif
1169*53ee8cc1Swenshuai.xi
1170*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Max_blocks_per_mcu;
1171*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Max_mcus_per_col;
1172*53ee8cc1Swenshuai.xi
1173*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 gu8Scan_type; /* Grey, Yh1v1, Yh1v2, Yh2v1, Yh2v2,
1174*53ee8cc1Swenshuai.xi CMYK111, CMYK4114 */
1175*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 *_pu8In_buf_ofs;
1176*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32In_buf_left;
1177*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Tem_flag;
1178*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bEOF_flag;
1179*53ee8cc1Swenshuai.xi
1180*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 *_pu8In_buf;
1181*53ee8cc1Swenshuai.xi
1182*53ee8cc1Swenshuai.xi JPEG_STATIC MS_S16 _s16Bits_left;
1183*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Bit_buf;
1184*53ee8cc1Swenshuai.xi
1185*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Restart_interval;
1186*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Restarts_left;
1187*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Next_restart_num;
1188*53ee8cc1Swenshuai.xi
1189*53ee8cc1Swenshuai.xi JPEG_STATIC void *_pBlocks[JPEG_MAXBLOCKS]; /* list of all dynamically allocated blocks */
1190*53ee8cc1Swenshuai.xi
1191*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_ErrCode _Error_code;
1192*53ee8cc1Swenshuai.xi
1193*53ee8cc1Swenshuai.xi #ifdef CMODEL
1194*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bReady_flag;
1195*53ee8cc1Swenshuai.xi #endif
1196*53ee8cc1Swenshuai.xi
1197*53ee8cc1Swenshuai.xi //#ifdef USE_LIBC
1198*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
1199*53ee8cc1Swenshuai.xi JPEG_STATIC jmp_buf _jmp_state;
1200*53ee8cc1Swenshuai.xi #endif
1201*53ee8cc1Swenshuai.xi //#endif
1202*53ee8cc1Swenshuai.xi
1203*53ee8cc1Swenshuai.xi ////JPEG_STATIC MS_S32 _Total_Decoded_Size = 0;
1204*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI - harold
1205*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 NumPics;
1206*53ee8cc1Swenshuai.xi #endif
1207*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Total_bytes_read;
1208*53ee8cc1Swenshuai.xi
1209*53ee8cc1Swenshuai.xi //JPEG_STATIC MS_U8 *_pu32ExifHeaderAddr;
1210*53ee8cc1Swenshuai.xi
1211*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_FillHdrFunc _pFillHdrFunc = NULL;
1212*53ee8cc1Swenshuai.xi
1213*53ee8cc1Swenshuai.xi #ifdef CMODEL
1214*53ee8cc1Swenshuai.xi extern const MS_U8 _u8ZAG[64];
1215*53ee8cc1Swenshuai.xi extern const MS_U8 _u8Jpeg_zigzag_order[64];
1216*53ee8cc1Swenshuai.xi #elif SW_JPD_RGB_CMYK
1217*53ee8cc1Swenshuai.xi static const MS_U8 _u8ZAG[64+1] =
1218*53ee8cc1Swenshuai.xi {
1219*53ee8cc1Swenshuai.xi 0, 1, 8, 16, 9, 2, 3, 10,
1220*53ee8cc1Swenshuai.xi 17, 24, 32, 25, 18, 11, 4, 5,
1221*53ee8cc1Swenshuai.xi 12, 19, 26, 33, 40, 48, 41, 34,
1222*53ee8cc1Swenshuai.xi 27, 20, 13, 6, 7, 14, 21, 28,
1223*53ee8cc1Swenshuai.xi 35, 42, 49, 56, 57, 50, 43, 36,
1224*53ee8cc1Swenshuai.xi 29, 22, 15, 23, 30, 37, 44, 51,
1225*53ee8cc1Swenshuai.xi 58, 59, 52, 45, 38, 31, 39, 46,
1226*53ee8cc1Swenshuai.xi 53, 60, 61, 54, 47, 55, 62, 63
1227*53ee8cc1Swenshuai.xi ,0
1228*53ee8cc1Swenshuai.xi };
1229*53ee8cc1Swenshuai.xi #endif
1230*53ee8cc1Swenshuai.xi
1231*53ee8cc1Swenshuai.xi JPEG_STATIC MSIF_Version _api_jpeg_version =
1232*53ee8cc1Swenshuai.xi {
1233*53ee8cc1Swenshuai.xi .DDI = { JPEG_API_VERSION },
1234*53ee8cc1Swenshuai.xi };
1235*53ee8cc1Swenshuai.xi
1236*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8JPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
1237*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bMHEG5 = FALSE;
1238*53ee8cc1Swenshuai.xi
1239*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _JPD_PreVIdx = 0; //For H/W bug, some cases can not exit after decode done
1240*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _JPD_IsDecoding = FALSE; //For H/W bug, some cases can not exit after decode done
1241*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _JPD_ReCheckTime = 0; //For H/W bug, some cases can not exit after decode done
1242*53ee8cc1Swenshuai.xi
1243*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _Progressive_ROI_flag = FALSE; //CL82399
1244*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 ROI_width; //CL82399
1245*53ee8cc1Swenshuai.xi
1246*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_BuffLoadType u8PreLHFlag = E_JPEG_BUFFER_NONE;
1247*53ee8cc1Swenshuai.xi
1248*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 u32MRCheckCount = 0;
1249*53ee8cc1Swenshuai.xi
1250*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bIsInit = FALSE;
1251*53ee8cc1Swenshuai.xi
1252*53ee8cc1Swenshuai.xi ///JPEG_STATIC MS_U32 jpeg_input = 0;
1253*53ee8cc1Swenshuai.xi ///#define JPEG_GO do{scanf("%d", &jpeg_input);}while(0)
1254*53ee8cc1Swenshuai.xi
1255*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
1256*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *_ps16Block_seg[JPEG_MAXBLOCKSPERROW];
1257*53ee8cc1Swenshuai.xi MS_U8 _u8Block_max_zag_set[JPEG_MAXBLOCKSPERROW];
1258*53ee8cc1Swenshuai.xi MS_U8 *gpu8Sample_buf;
1259*53ee8cc1Swenshuai.xi MS_S32 gs32Crr[256];
1260*53ee8cc1Swenshuai.xi MS_S32 gs32Cbb[256];
1261*53ee8cc1Swenshuai.xi MS_S32 gs32Crg[256];
1262*53ee8cc1Swenshuai.xi MS_S32 gs32Cbg[256];
1263*53ee8cc1Swenshuai.xi
1264*53ee8cc1Swenshuai.xi MS_U8 *pgu8Scan_line_0;
1265*53ee8cc1Swenshuai.xi MS_U8 *pgu8scan_line_1;
1266*53ee8cc1Swenshuai.xi
1267*53ee8cc1Swenshuai.xi //JPEG_STATIC MS_U16 _u16Real_dest_bytes_per_scan_line;
1268*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Dest_bytes_per_scan_line; /* rounded up */
1269*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Dest_bytes_per_pixel; /* currently, 4 (RGB) or 1 (Y) */
1270*53ee8cc1Swenshuai.xi
1271*53ee8cc1Swenshuai.xi #if ( ! SUPPORT_PROGRESSIVE_MODE) && ( ! defined(CMODEL))
1272*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Total_lines_left; /* total # lines left in image */
1273*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Block_y_mcu[JPEG_MAXCOMPONENTS];
1274*53ee8cc1Swenshuai.xi //JPEG_STATIC MS_U16 gu16Mcu_lines_left; /* total # lines left in this MCU */
1275*53ee8cc1Swenshuai.xi #endif
1276*53ee8cc1Swenshuai.xi #endif
1277*53ee8cc1Swenshuai.xi
1278*53ee8cc1Swenshuai.xi /*===========================================================================*/
1279*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL __bIsMjpeg = FALSE;
1280*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 __u32RealMjpegBase = 0x00000000;
1281*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 __u32TrickyMjpegBase = 0x00000000;
1282*53ee8cc1Swenshuai.xi /*===========================================================================*/
1283*53ee8cc1Swenshuai.xi
1284*53ee8cc1Swenshuai.xi //The info of JPEG EXIF
1285*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_EXIF_DateTime _stEXIF_DateTime;
1286*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_EXIF_Orientation _eEXIF_Orientation;
1287*53ee8cc1Swenshuai.xi
1288*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
1289*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8EXIF_Manufacturer[JPEG_MANUFACTURER_SIZE];
1290*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8EXIF_Model[JPEG_MODEL_SIZE];
1291*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16EXIF_Exposureprogram;
1292*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16EXIF_Flash;
1293*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EXIF_ISOSpeedRatings;
1294*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ExposureTime;
1295*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_FNumber;
1296*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ShutterSpeedValue;
1297*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ApertureValue;
1298*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ExposureBiasValue;
1299*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_FocalLength;
1300*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EXIF_ImageWidth;
1301*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EXIF_ImageHeight;
1302*53ee8cc1Swenshuai.xi #endif
1303*53ee8cc1Swenshuai.xi
1304*53ee8cc1Swenshuai.xi //record data offset
1305*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 u32DataOffset = 0;
1306*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 u32SOFOffset = 0; //for SEC request, they need to know the offset of SOF marker
1307*53ee8cc1Swenshuai.xi
1308*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bIs3HuffTbl = FALSE;
1309*53ee8cc1Swenshuai.xi
1310*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
1311*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bEnableCMYK = TRUE;
1312*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bEnableRGB = TRUE;
1313*53ee8cc1Swenshuai.xi #endif
1314*53ee8cc1Swenshuai.xi
1315*53ee8cc1Swenshuai.xi
1316*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
1317*53ee8cc1Swenshuai.xi //MPO buffer
1318*53ee8cc1Swenshuai.xi static MS_U8 *_pu8In_buf_MPO_ofs;
1319*53ee8cc1Swenshuai.xi static MS_U32 _u32In_buf_MPO_left = 0xFFFFFFFFUL;
1320*53ee8cc1Swenshuai.xi
1321*53ee8cc1Swenshuai.xi static MS_BOOL mpo_load_data = TRUE; //check whether load data when start decode or fill buffer.
1322*53ee8cc1Swenshuai.xi static MS_BOOL bIsMPOFormat = FALSE;
1323*53ee8cc1Swenshuai.xi static MS_U32 u32MPFOffset = 0;
1324*53ee8cc1Swenshuai.xi #endif
1325*53ee8cc1Swenshuai.xi
1326*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
1327*53ee8cc1Swenshuai.xi static MS_U32 u32MeasureDecodeTime;
1328*53ee8cc1Swenshuai.xi static MS_U32 u32MeasureDecodeTimeSW;
1329*53ee8cc1Swenshuai.xi static MS_U32 u32MeasureDecodeTimeHW;
1330*53ee8cc1Swenshuai.xi #endif
1331*53ee8cc1Swenshuai.xi
1332*53ee8cc1Swenshuai.xi static MS_U32 u32CRC;
1333*53ee8cc1Swenshuai.xi
verJPD_CRC32_Init(void)1334*53ee8cc1Swenshuai.xi static void verJPD_CRC32_Init(void)
1335*53ee8cc1Swenshuai.xi {
1336*53ee8cc1Swenshuai.xi u32CRC = 0xFFFFFFFF;
1337*53ee8cc1Swenshuai.xi }
1338*53ee8cc1Swenshuai.xi
1339*53ee8cc1Swenshuai.xi
verJPD_CRC32_GetResult(void)1340*53ee8cc1Swenshuai.xi static MS_U32 verJPD_CRC32_GetResult(void)
1341*53ee8cc1Swenshuai.xi {
1342*53ee8cc1Swenshuai.xi return (~u32CRC);
1343*53ee8cc1Swenshuai.xi }
1344*53ee8cc1Swenshuai.xi
1345*53ee8cc1Swenshuai.xi
verJPD_Init_CRC_Table(MS_U32 * u32CRCtemptable)1346*53ee8cc1Swenshuai.xi static void verJPD_Init_CRC_Table(MS_U32 *u32CRCtemptable)
1347*53ee8cc1Swenshuai.xi {
1348*53ee8cc1Swenshuai.xi
1349*53ee8cc1Swenshuai.xi MS_U32 i,j,tmp, result;
1350*53ee8cc1Swenshuai.xi
1351*53ee8cc1Swenshuai.xi for(i=0;i<=0xFF;i++)
1352*53ee8cc1Swenshuai.xi {
1353*53ee8cc1Swenshuai.xi tmp=i;
1354*53ee8cc1Swenshuai.xi result=0;
1355*53ee8cc1Swenshuai.xi
1356*53ee8cc1Swenshuai.xi for(j=1;j<9;j++)
1357*53ee8cc1Swenshuai.xi {
1358*53ee8cc1Swenshuai.xi if(tmp & 1)
1359*53ee8cc1Swenshuai.xi {
1360*53ee8cc1Swenshuai.xi result |= (1 << (8 - j));
1361*53ee8cc1Swenshuai.xi }
1362*53ee8cc1Swenshuai.xi tmp >>= 1;
1363*53ee8cc1Swenshuai.xi }
1364*53ee8cc1Swenshuai.xi
1365*53ee8cc1Swenshuai.xi u32CRCtemptable[i]=result<<24;
1366*53ee8cc1Swenshuai.xi for(j=0; j<8; j++)
1367*53ee8cc1Swenshuai.xi {
1368*53ee8cc1Swenshuai.xi u32CRCtemptable[i] = (u32CRCtemptable[i] << 1) ^ ((u32CRCtemptable[i] & (1 << 31)) ? 0x04C11DB7 : 0);
1369*53ee8cc1Swenshuai.xi }
1370*53ee8cc1Swenshuai.xi
1371*53ee8cc1Swenshuai.xi tmp=u32CRCtemptable[i];
1372*53ee8cc1Swenshuai.xi result=0;
1373*53ee8cc1Swenshuai.xi
1374*53ee8cc1Swenshuai.xi for(j=1;j<33;j++)
1375*53ee8cc1Swenshuai.xi {
1376*53ee8cc1Swenshuai.xi if(tmp & 1)
1377*53ee8cc1Swenshuai.xi {
1378*53ee8cc1Swenshuai.xi result |= (1 << (32 - j));
1379*53ee8cc1Swenshuai.xi }
1380*53ee8cc1Swenshuai.xi tmp >>= 1;
1381*53ee8cc1Swenshuai.xi }
1382*53ee8cc1Swenshuai.xi u32CRCtemptable[i]=result;
1383*53ee8cc1Swenshuai.xi }
1384*53ee8cc1Swenshuai.xi }
1385*53ee8cc1Swenshuai.xi
verJPD_CRC32_Update(const MS_U8 * pu8Data,MS_U32 u32Size)1386*53ee8cc1Swenshuai.xi static void verJPD_CRC32_Update(const MS_U8 *pu8Data, MS_U32 u32Size)
1387*53ee8cc1Swenshuai.xi {
1388*53ee8cc1Swenshuai.xi MS_U32 u32CRCTable[256];
1389*53ee8cc1Swenshuai.xi MS_U32 u32LoopCounter;
1390*53ee8cc1Swenshuai.xi
1391*53ee8cc1Swenshuai.xi if (pu8Data == NULL || u32Size == 0) return;
1392*53ee8cc1Swenshuai.xi
1393*53ee8cc1Swenshuai.xi verJPD_Init_CRC_Table(u32CRCTable);
1394*53ee8cc1Swenshuai.xi
1395*53ee8cc1Swenshuai.xi #if 0
1396*53ee8cc1Swenshuai.xi MS_U32 i;
1397*53ee8cc1Swenshuai.xi for(i = 0;i<256;i++)
1398*53ee8cc1Swenshuai.xi {
1399*53ee8cc1Swenshuai.xi printf("0x%08x,\n", u32CRCTable[i]);
1400*53ee8cc1Swenshuai.xi }
1401*53ee8cc1Swenshuai.xi #endif
1402*53ee8cc1Swenshuai.xi
1403*53ee8cc1Swenshuai.xi for (u32LoopCounter=0; u32LoopCounter<u32Size; u32LoopCounter++)
1404*53ee8cc1Swenshuai.xi {
1405*53ee8cc1Swenshuai.xi u32CRC = (u32CRC >> 8) ^ u32CRCTable[ pu8Data[u32LoopCounter] ^ (MS_U8)(u32CRC & 0xFF) ];
1406*53ee8cc1Swenshuai.xi }
1407*53ee8cc1Swenshuai.xi }
1408*53ee8cc1Swenshuai.xi
1409*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1410*53ee8cc1Swenshuai.xi // Local Function Prototypes
1411*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1412*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI - harold
1413*53ee8cc1Swenshuai.xi JPEG_STATIC void MSAPI_MJPEG_Get_Pics(void);
1414*53ee8cc1Swenshuai.xi #endif // not implement for new MDDI - harold
1415*53ee8cc1Swenshuai.xi
1416*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_terminate(JPEG_ErrCode status);
1417*53ee8cc1Swenshuai.xi
1418*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_init(void);
1419*53ee8cc1Swenshuai.xi
1420*53ee8cc1Swenshuai.xi #ifndef CMODEL
1421*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_StartDecode(void);
1422*53ee8cc1Swenshuai.xi #endif
1423*53ee8cc1Swenshuai.xi
1424*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_GetAlignedResolution(MS_U16 *width, MS_U16 *height);
1425*53ee8cc1Swenshuai.xi
1426*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
1427*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_transform_row( void );
1428*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_Result msAPI_JPEG_Baseline_Decode(void);
1429*53ee8cc1Swenshuai.xi #endif //SW_JPD_RGB_CMYK
1430*53ee8cc1Swenshuai.xi
1431*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_GetECS(void);
1432*53ee8cc1Swenshuai.xi
1433*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1434*53ee8cc1Swenshuai.xi // Debug Functions
1435*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1436*53ee8cc1Swenshuai.xi
1437*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1438*53ee8cc1Swenshuai.xi // Local Functions
1439*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1440*53ee8cc1Swenshuai.xi
JPEG_OVER_BUFFER(MS_U32 addr,MS_U32 buf_addr,MS_U32 buf_size)1441*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_OVER_BUFFER(MS_U32 addr, MS_U32 buf_addr, MS_U32 buf_size)
1442*53ee8cc1Swenshuai.xi {
1443*53ee8cc1Swenshuai.xi if((addr < buf_addr)
1444*53ee8cc1Swenshuai.xi || (addr >= (buf_addr+ buf_size)))
1445*53ee8cc1Swenshuai.xi {
1446*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d] invalid address 0x%lx\n", __FUNCTION__, __LINE__, addr);
1447*53ee8cc1Swenshuai.xi return TRUE;
1448*53ee8cc1Swenshuai.xi }
1449*53ee8cc1Swenshuai.xi return FALSE;
1450*53ee8cc1Swenshuai.xi }
1451*53ee8cc1Swenshuai.xi
1452*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1453*53ee8cc1Swenshuai.xi // Refill the input buffer.
1454*53ee8cc1Swenshuai.xi // This method will sit in a loop until (A) the buffer is full or (B)
1455*53ee8cc1Swenshuai.xi // the stream's read() method reports an end of file condition.
JPEG_fill_read_buffer(void)1456*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_fill_read_buffer(void)
1457*53ee8cc1Swenshuai.xi {
1458*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer:\n");
1459*53ee8cc1Swenshuai.xi _u32In_buf_left = 0;
1460*53ee8cc1Swenshuai.xi _pu8In_buf_ofs = _pu8In_buf;
1461*53ee8cc1Swenshuai.xi
1462*53ee8cc1Swenshuai.xi if(_bEOF_flag
1463*53ee8cc1Swenshuai.xi && (FALSE == _bThumbnailAccessMode))
1464*53ee8cc1Swenshuai.xi {
1465*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer : EOF!!!\n");
1466*53ee8cc1Swenshuai.xi return TRUE;
1467*53ee8cc1Swenshuai.xi }
1468*53ee8cc1Swenshuai.xi
1469*53ee8cc1Swenshuai.xi if(_bThumbnailAccessMode)
1470*53ee8cc1Swenshuai.xi {
1471*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Fill Thumbnail, buffer left = %ld, buffer offset = %ld\n", _u16ThumbnailBufferSize, _u32ThumbnailBufferOffset);
1472*53ee8cc1Swenshuai.xi if(_u16ThumbnailBufferSize>=MRC_BUFFER_SIZE)
1473*53ee8cc1Swenshuai.xi {
1474*53ee8cc1Swenshuai.xi JPEG_memcpy((void *)(_pu8In_buf + _u32In_buf_left), (void *)(INTERNAL_BUFFER_ADDR + _u32ThumbnailBufferOffset), MRC_BUFFER_SIZE);
1475*53ee8cc1Swenshuai.xi _u32In_buf_left = MRC_BUFFER_SIZE;
1476*53ee8cc1Swenshuai.xi _u32ThumbnailBufferOffset += MRC_BUFFER_SIZE;
1477*53ee8cc1Swenshuai.xi _u16ThumbnailBufferSize -= MRC_BUFFER_SIZE;
1478*53ee8cc1Swenshuai.xi }
1479*53ee8cc1Swenshuai.xi else
1480*53ee8cc1Swenshuai.xi {
1481*53ee8cc1Swenshuai.xi JPEG_memcpy((void *)(_pu8In_buf + _u32In_buf_left), (void *)(INTERNAL_BUFFER_ADDR + _u32ThumbnailBufferOffset), _u16ThumbnailBufferSize);
1482*53ee8cc1Swenshuai.xi _bEOF_flag = TRUE;
1483*53ee8cc1Swenshuai.xi _u32In_buf_left = _u16ThumbnailBufferSize;
1484*53ee8cc1Swenshuai.xi _u32ThumbnailBufferOffset += _u16ThumbnailBufferSize;
1485*53ee8cc1Swenshuai.xi _u16ThumbnailBufferSize = 0;
1486*53ee8cc1Swenshuai.xi }
1487*53ee8cc1Swenshuai.xi }
1488*53ee8cc1Swenshuai.xi else
1489*53ee8cc1Swenshuai.xi {
1490*53ee8cc1Swenshuai.xi if(_pFillHdrFunc)
1491*53ee8cc1Swenshuai.xi {
1492*53ee8cc1Swenshuai.xi MS_S32 byte_read = _pFillHdrFunc((MS_PHYADDR)MS_VA2PA((MS_U32)_pu8In_buf), MRC_BUFFER_SIZE);
1493*53ee8cc1Swenshuai.xi if(byte_read < 0)
1494*53ee8cc1Swenshuai.xi {
1495*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_STREAM_READ);
1496*53ee8cc1Swenshuai.xi return FALSE;
1497*53ee8cc1Swenshuai.xi }
1498*53ee8cc1Swenshuai.xi _u32In_buf_left = byte_read;
1499*53ee8cc1Swenshuai.xi }
1500*53ee8cc1Swenshuai.xi else
1501*53ee8cc1Swenshuai.xi {
1502*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_pFillHdrFunc is not registered!!\n");
1503*53ee8cc1Swenshuai.xi if (bMHEG5)
1504*53ee8cc1Swenshuai.xi {
1505*53ee8cc1Swenshuai.xi _u32In_buf_left = MRC_BUFFER_SIZE;
1506*53ee8cc1Swenshuai.xi }
1507*53ee8cc1Swenshuai.xi else
1508*53ee8cc1Swenshuai.xi {
1509*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_NOT_ENOUGH_HEADER_INFO);
1510*53ee8cc1Swenshuai.xi return FALSE;
1511*53ee8cc1Swenshuai.xi }
1512*53ee8cc1Swenshuai.xi }
1513*53ee8cc1Swenshuai.xi }
1514*53ee8cc1Swenshuai.xi #if 0
1515*53ee8cc1Swenshuai.xi else
1516*53ee8cc1Swenshuai.xi {
1517*53ee8cc1Swenshuai.xi do
1518*53ee8cc1Swenshuai.xi {
1519*53ee8cc1Swenshuai.xi MS_S32 bytes_read = _pStream->read( _pu8In_buf + _u32In_buf_left, MRC_BUFFER_SIZE - _u32In_buf_left, &_bEOF_flag, _pStream);//, 0 );
1520*53ee8cc1Swenshuai.xi if ( bytes_read == -1 )
1521*53ee8cc1Swenshuai.xi {
1522*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_STREAM_READ );
1523*53ee8cc1Swenshuai.xi }
1524*53ee8cc1Swenshuai.xi _u32In_buf_left += bytes_read;
1525*53ee8cc1Swenshuai.xi //// _Total_Decoded_Size += bytes_read;
1526*53ee8cc1Swenshuai.xi } while ( ( _u32In_buf_left < MRC_BUFFER_SIZE ) && ( !_bEOF_flag ) );
1527*53ee8cc1Swenshuai.xi }
1528*53ee8cc1Swenshuai.xi
1529*53ee8cc1Swenshuai.xi _u32Total_bytes_read += _u32In_buf_left;
1530*53ee8cc1Swenshuai.xi #endif
1531*53ee8cc1Swenshuai.xi
1532*53ee8cc1Swenshuai.xi u32DataOffset += MRC_BUFFER_SIZE;
1533*53ee8cc1Swenshuai.xi return TRUE;
1534*53ee8cc1Swenshuai.xi }
JPEG_force_fill_read_buffer(MS_U32 u32Size)1535*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_force_fill_read_buffer(MS_U32 u32Size)
1536*53ee8cc1Swenshuai.xi {
1537*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer:\n");
1538*53ee8cc1Swenshuai.xi _u32In_buf_left = u32Size;
1539*53ee8cc1Swenshuai.xi _pu8In_buf_ofs = _pu8In_buf;
1540*53ee8cc1Swenshuai.xi
1541*53ee8cc1Swenshuai.xi if(_bEOF_flag)
1542*53ee8cc1Swenshuai.xi {
1543*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer : EOF!!!\n");
1544*53ee8cc1Swenshuai.xi return TRUE;
1545*53ee8cc1Swenshuai.xi }
1546*53ee8cc1Swenshuai.xi
1547*53ee8cc1Swenshuai.xi if(_pFillHdrFunc)
1548*53ee8cc1Swenshuai.xi {
1549*53ee8cc1Swenshuai.xi MS_S32 byte_read = _pFillHdrFunc((MS_PHYADDR)MS_VA2PA((MS_U32)_pu8In_buf+u32Size), MRC_BUFFER_SIZE-u32Size);
1550*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@@@fill byte_read=0x%lx\n", byte_read);
1551*53ee8cc1Swenshuai.xi if(byte_read < 0)
1552*53ee8cc1Swenshuai.xi {
1553*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_STREAM_READ);
1554*53ee8cc1Swenshuai.xi return FALSE;
1555*53ee8cc1Swenshuai.xi }
1556*53ee8cc1Swenshuai.xi _u32In_buf_left += byte_read;
1557*53ee8cc1Swenshuai.xi }
1558*53ee8cc1Swenshuai.xi else
1559*53ee8cc1Swenshuai.xi {
1560*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_pFillHdrFunc is not registered!!\n");
1561*53ee8cc1Swenshuai.xi return FALSE;
1562*53ee8cc1Swenshuai.xi }
1563*53ee8cc1Swenshuai.xi
1564*53ee8cc1Swenshuai.xi return TRUE;
1565*53ee8cc1Swenshuai.xi }
1566*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1567*53ee8cc1Swenshuai.xi // Logical rotate left operation.
JPEG_rol(MS_U32 i,MS_U8 j)1568*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_rol(MS_U32 i, MS_U8 j)
1569*53ee8cc1Swenshuai.xi {
1570*53ee8cc1Swenshuai.xi return ( ( i << j ) | ( i >> ( 32 - j ) ) );
1571*53ee8cc1Swenshuai.xi }
1572*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1573*53ee8cc1Swenshuai.xi // Retrieve one character from the input stream.
JPEG_get_char(void)1574*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 JPEG_get_char(void)
1575*53ee8cc1Swenshuai.xi {
1576*53ee8cc1Swenshuai.xi MS_U8 c;
1577*53ee8cc1Swenshuai.xi
1578*53ee8cc1Swenshuai.xi // Any bytes remaining in buffer?
1579*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
1580*53ee8cc1Swenshuai.xi {
1581*53ee8cc1Swenshuai.xi // Try to get more bytes.
1582*53ee8cc1Swenshuai.xi if(!JPEG_fill_read_buffer())
1583*53ee8cc1Swenshuai.xi {
1584*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_get_char : JPEG_fill_read_buffer failed!!!\n");
1585*53ee8cc1Swenshuai.xi _u32In_buf_left = 0;
1586*53ee8cc1Swenshuai.xi }
1587*53ee8cc1Swenshuai.xi // Still nothing to get?
1588*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
1589*53ee8cc1Swenshuai.xi {
1590*53ee8cc1Swenshuai.xi // Padd the end of the stream with 0xFF 0xD9 (EOI marker)
1591*53ee8cc1Swenshuai.xi // FIXME: Is there a better padding pattern to use?
1592*53ee8cc1Swenshuai.xi MS_U8 t = _u8Tem_flag;
1593*53ee8cc1Swenshuai.xi _u8Tem_flag ^= 1;
1594*53ee8cc1Swenshuai.xi if ( t )
1595*53ee8cc1Swenshuai.xi {
1596*53ee8cc1Swenshuai.xi return ( 0xD9 );
1597*53ee8cc1Swenshuai.xi }
1598*53ee8cc1Swenshuai.xi else
1599*53ee8cc1Swenshuai.xi {
1600*53ee8cc1Swenshuai.xi return ( 0xFF );
1601*53ee8cc1Swenshuai.xi }
1602*53ee8cc1Swenshuai.xi }
1603*53ee8cc1Swenshuai.xi }
1604*53ee8cc1Swenshuai.xi
1605*53ee8cc1Swenshuai.xi c = *_pu8In_buf_ofs++;
1606*53ee8cc1Swenshuai.xi _u32In_buf_left--;
1607*53ee8cc1Swenshuai.xi
1608*53ee8cc1Swenshuai.xi return ( c );
1609*53ee8cc1Swenshuai.xi }
1610*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1611*53ee8cc1Swenshuai.xi // Same as previus method, except can indicate if the character is
1612*53ee8cc1Swenshuai.xi // a "padd" character or not.
JPEG_get_charP(MS_BOOL * Ppadding_flag)1613*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 JPEG_get_charP(MS_BOOL *Ppadding_flag)
1614*53ee8cc1Swenshuai.xi {
1615*53ee8cc1Swenshuai.xi MS_U8 c;
1616*53ee8cc1Swenshuai.xi
1617*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
1618*53ee8cc1Swenshuai.xi {
1619*53ee8cc1Swenshuai.xi if(!JPEG_fill_read_buffer())
1620*53ee8cc1Swenshuai.xi {
1621*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_get_charP : JPEG_fill_read_buffer failed!!!\n");
1622*53ee8cc1Swenshuai.xi _u32In_buf_left = 0;
1623*53ee8cc1Swenshuai.xi }
1624*53ee8cc1Swenshuai.xi
1625*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
1626*53ee8cc1Swenshuai.xi {
1627*53ee8cc1Swenshuai.xi *Ppadding_flag = TRUE;
1628*53ee8cc1Swenshuai.xi #if 1
1629*53ee8cc1Swenshuai.xi _u8Tem_flag ^= 1;
1630*53ee8cc1Swenshuai.xi // This function is called during when progressive huffman decoding
1631*53ee8cc1Swenshuai.xi // Should not padding 0xFFD9 at this state
1632*53ee8cc1Swenshuai.xi return 0;
1633*53ee8cc1Swenshuai.xi #else
1634*53ee8cc1Swenshuai.xi MS_U8 t;
1635*53ee8cc1Swenshuai.xi t = _u8Tem_flag;
1636*53ee8cc1Swenshuai.xi _u8Tem_flag ^= 1;
1637*53ee8cc1Swenshuai.xi if ( t )
1638*53ee8cc1Swenshuai.xi {
1639*53ee8cc1Swenshuai.xi return ( 0xD9 );
1640*53ee8cc1Swenshuai.xi }
1641*53ee8cc1Swenshuai.xi else
1642*53ee8cc1Swenshuai.xi {
1643*53ee8cc1Swenshuai.xi return ( 0xFF );
1644*53ee8cc1Swenshuai.xi }
1645*53ee8cc1Swenshuai.xi #endif
1646*53ee8cc1Swenshuai.xi }
1647*53ee8cc1Swenshuai.xi }
1648*53ee8cc1Swenshuai.xi
1649*53ee8cc1Swenshuai.xi *Ppadding_flag = FALSE;
1650*53ee8cc1Swenshuai.xi
1651*53ee8cc1Swenshuai.xi c = *_pu8In_buf_ofs++;
1652*53ee8cc1Swenshuai.xi _u32In_buf_left--;
1653*53ee8cc1Swenshuai.xi
1654*53ee8cc1Swenshuai.xi return ( c );
1655*53ee8cc1Swenshuai.xi }
1656*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1657*53ee8cc1Swenshuai.xi // Inserts a previously retrieved character back into the input buffer.
JPEG_stuff_char(MS_U8 q)1658*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_stuff_char(MS_U8 q)
1659*53ee8cc1Swenshuai.xi {
1660*53ee8cc1Swenshuai.xi *( --_pu8In_buf_ofs ) = q;
1661*53ee8cc1Swenshuai.xi _u32In_buf_left++;
1662*53ee8cc1Swenshuai.xi }
1663*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1664*53ee8cc1Swenshuai.xi // Retrieves one character from the input stream, but does
1665*53ee8cc1Swenshuai.xi // not read past markers. Will continue to return 0xFF when a
1666*53ee8cc1Swenshuai.xi // marker is encountered.
1667*53ee8cc1Swenshuai.xi // FIXME: Bad name?
JPEG_get_octet(void)1668*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 JPEG_get_octet(void)
1669*53ee8cc1Swenshuai.xi {
1670*53ee8cc1Swenshuai.xi MS_BOOL padding_flag;
1671*53ee8cc1Swenshuai.xi MS_U8 c = JPEG_get_charP( &padding_flag );
1672*53ee8cc1Swenshuai.xi
1673*53ee8cc1Swenshuai.xi if ( c == 0xFF )
1674*53ee8cc1Swenshuai.xi {
1675*53ee8cc1Swenshuai.xi if ( padding_flag )
1676*53ee8cc1Swenshuai.xi {
1677*53ee8cc1Swenshuai.xi return ( 0xFF );
1678*53ee8cc1Swenshuai.xi }
1679*53ee8cc1Swenshuai.xi
1680*53ee8cc1Swenshuai.xi c = JPEG_get_charP( &padding_flag );
1681*53ee8cc1Swenshuai.xi if ( padding_flag )
1682*53ee8cc1Swenshuai.xi {
1683*53ee8cc1Swenshuai.xi JPEG_stuff_char( 0xFF );
1684*53ee8cc1Swenshuai.xi return ( 0xFF );
1685*53ee8cc1Swenshuai.xi }
1686*53ee8cc1Swenshuai.xi
1687*53ee8cc1Swenshuai.xi if ( c == 0x00 )
1688*53ee8cc1Swenshuai.xi {
1689*53ee8cc1Swenshuai.xi return ( 0xFF );
1690*53ee8cc1Swenshuai.xi }
1691*53ee8cc1Swenshuai.xi else
1692*53ee8cc1Swenshuai.xi {
1693*53ee8cc1Swenshuai.xi JPEG_stuff_char( c );
1694*53ee8cc1Swenshuai.xi JPEG_stuff_char( 0xFF );
1695*53ee8cc1Swenshuai.xi return ( 0xFF );
1696*53ee8cc1Swenshuai.xi }
1697*53ee8cc1Swenshuai.xi }
1698*53ee8cc1Swenshuai.xi
1699*53ee8cc1Swenshuai.xi return ( c );
1700*53ee8cc1Swenshuai.xi }
1701*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1702*53ee8cc1Swenshuai.xi // Retrieves a variable number of bits from the input stream.
1703*53ee8cc1Swenshuai.xi // Markers will not be read into the input bit buffer. Instead,
1704*53ee8cc1Swenshuai.xi // an infinite number of all 1's will be returned when a marker
1705*53ee8cc1Swenshuai.xi // is encountered.
1706*53ee8cc1Swenshuai.xi // FIXME: Is it better to return all 0's instead, like the older implementation?
JPEG_get_bits_2(MS_U8 numbits)1707*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_get_bits_2(MS_U8 numbits)
1708*53ee8cc1Swenshuai.xi {
1709*53ee8cc1Swenshuai.xi MS_U32 i, c1, c2;
1710*53ee8cc1Swenshuai.xi
1711*53ee8cc1Swenshuai.xi i = ( _u32Bit_buf >> ( 16 - numbits ) ) & ( ( 1 << numbits ) - 1 );
1712*53ee8cc1Swenshuai.xi
1713*53ee8cc1Swenshuai.xi _s16Bits_left -= numbits;
1714*53ee8cc1Swenshuai.xi if ( _s16Bits_left <= 0 )
1715*53ee8cc1Swenshuai.xi {
1716*53ee8cc1Swenshuai.xi _u32Bit_buf = JPEG_rol( _u32Bit_buf, numbits += _s16Bits_left );
1717*53ee8cc1Swenshuai.xi
1718*53ee8cc1Swenshuai.xi c1 = JPEG_get_octet();
1719*53ee8cc1Swenshuai.xi c2 = JPEG_get_octet();
1720*53ee8cc1Swenshuai.xi
1721*53ee8cc1Swenshuai.xi _u32Bit_buf = ( _u32Bit_buf & 0xFFFF ) | ( ( ( MS_U32 )c1 ) << 24 ) | ( ( ( MS_U32 )c2 ) << 16 );
1722*53ee8cc1Swenshuai.xi
1723*53ee8cc1Swenshuai.xi _u32Bit_buf = JPEG_rol( _u32Bit_buf, -_s16Bits_left );
1724*53ee8cc1Swenshuai.xi
1725*53ee8cc1Swenshuai.xi _s16Bits_left += 16;
1726*53ee8cc1Swenshuai.xi }
1727*53ee8cc1Swenshuai.xi else
1728*53ee8cc1Swenshuai.xi {
1729*53ee8cc1Swenshuai.xi _u32Bit_buf = JPEG_rol( _u32Bit_buf, numbits );
1730*53ee8cc1Swenshuai.xi }
1731*53ee8cc1Swenshuai.xi
1732*53ee8cc1Swenshuai.xi return i;
1733*53ee8cc1Swenshuai.xi }
1734*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1735*53ee8cc1Swenshuai.xi // Decodes a Huffman encoded symbol.
JPEG_huff_decode(JPEG_HuffTbl * Ph)1736*53ee8cc1Swenshuai.xi JPEG_STATIC MS_S32 JPEG_huff_decode(JPEG_HuffTbl *Ph)
1737*53ee8cc1Swenshuai.xi {
1738*53ee8cc1Swenshuai.xi MS_S32 symbol;
1739*53ee8cc1Swenshuai.xi
1740*53ee8cc1Swenshuai.xi // Check first 8-bits: do we have a complete symbol?
1741*53ee8cc1Swenshuai.xi symbol = Ph->s16Look_up[( _u32Bit_buf >> 8 ) & 0xFF];
1742*53ee8cc1Swenshuai.xi if ( symbol < 0 )
1743*53ee8cc1Swenshuai.xi {
1744*53ee8cc1Swenshuai.xi // Decode more bits, use a tree traversal to find symbol.
1745*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 8 );
1746*53ee8cc1Swenshuai.xi
1747*53ee8cc1Swenshuai.xi do
1748*53ee8cc1Swenshuai.xi {
1749*53ee8cc1Swenshuai.xi symbol = Ph->s16Tree[~symbol + ( 1 - JPEG_get_bits_2( 1 ) )];
1750*53ee8cc1Swenshuai.xi }
1751*53ee8cc1Swenshuai.xi while ( symbol < 0 );
1752*53ee8cc1Swenshuai.xi }
1753*53ee8cc1Swenshuai.xi else
1754*53ee8cc1Swenshuai.xi {
1755*53ee8cc1Swenshuai.xi JPEG_get_bits_2( Ph->u8Code_size[symbol] );
1756*53ee8cc1Swenshuai.xi }
1757*53ee8cc1Swenshuai.xi
1758*53ee8cc1Swenshuai.xi return symbol;
1759*53ee8cc1Swenshuai.xi }
1760*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1761*53ee8cc1Swenshuai.xi // Unconditionally frees all allocated blocks.
JPEG_free_all_blocks(void)1762*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_free_all_blocks(void)
1763*53ee8cc1Swenshuai.xi {
1764*53ee8cc1Swenshuai.xi MS_U8 i;
1765*53ee8cc1Swenshuai.xi #if 0
1766*53ee8cc1Swenshuai.xi if ( _pStream )
1767*53ee8cc1Swenshuai.xi {
1768*53ee8cc1Swenshuai.xi _pStream = NULL;
1769*53ee8cc1Swenshuai.xi }
1770*53ee8cc1Swenshuai.xi #endif
1771*53ee8cc1Swenshuai.xi for ( i = 0; i < JPEG_MAXBLOCKS; i++ )
1772*53ee8cc1Swenshuai.xi {
1773*53ee8cc1Swenshuai.xi if(_pBlocks[i]!=NULL)
1774*53ee8cc1Swenshuai.xi JPEG_MEMORY_free( _pBlocks[i] );
1775*53ee8cc1Swenshuai.xi
1776*53ee8cc1Swenshuai.xi _pBlocks[i] = NULL;
1777*53ee8cc1Swenshuai.xi }
1778*53ee8cc1Swenshuai.xi }
1779*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1780*53ee8cc1Swenshuai.xi // This method handles all errors.
1781*53ee8cc1Swenshuai.xi // It could easily be changed to use C++ exceptions.
JPEG_terminate(JPEG_ErrCode status)1782*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_terminate(JPEG_ErrCode status)
1783*53ee8cc1Swenshuai.xi {
1784*53ee8cc1Swenshuai.xi _Error_code = status;
1785*53ee8cc1Swenshuai.xi
1786*53ee8cc1Swenshuai.xi JPEG_free_all_blocks();
1787*53ee8cc1Swenshuai.xi
1788*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s:ERROR= %d\n", __FUNCTION__, _Error_code);
1789*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
1790*53ee8cc1Swenshuai.xi longjmp( _jmp_state, status );
1791*53ee8cc1Swenshuai.xi #endif
1792*53ee8cc1Swenshuai.xi }
1793*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1794*53ee8cc1Swenshuai.xi // Allocate a block of memory-- store block's address in list for
1795*53ee8cc1Swenshuai.xi // later deallocation by JPEG_free_all_blocks().
JPEG_alloc(MS_U32 n)1796*53ee8cc1Swenshuai.xi JPEG_STATIC void * JPEG_alloc(MS_U32 n)
1797*53ee8cc1Swenshuai.xi {
1798*53ee8cc1Swenshuai.xi MS_U8 i;
1799*53ee8cc1Swenshuai.xi void *q;
1800*53ee8cc1Swenshuai.xi
1801*53ee8cc1Swenshuai.xi // Find a free slot. The number of allocated slots will
1802*53ee8cc1Swenshuai.xi // always be very low, so a linear search is good enough.
1803*53ee8cc1Swenshuai.xi for ( i = 0; i < JPEG_MAXBLOCKS; i++ )
1804*53ee8cc1Swenshuai.xi {
1805*53ee8cc1Swenshuai.xi if ( _pBlocks[i] == NULL )
1806*53ee8cc1Swenshuai.xi {
1807*53ee8cc1Swenshuai.xi break;
1808*53ee8cc1Swenshuai.xi }
1809*53ee8cc1Swenshuai.xi }
1810*53ee8cc1Swenshuai.xi
1811*53ee8cc1Swenshuai.xi if ( i >= JPEG_MAXBLOCKS )
1812*53ee8cc1Swenshuai.xi {
1813*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_TOO_MANY_BLOCKS );
1814*53ee8cc1Swenshuai.xi return NULL;
1815*53ee8cc1Swenshuai.xi }
1816*53ee8cc1Swenshuai.xi
1817*53ee8cc1Swenshuai.xi //FixMe: eCos does not support aligned allocate ???
1818*53ee8cc1Swenshuai.xi q = JPEG_MEMORY_malloc( n + 8 );
1819*53ee8cc1Swenshuai.xi //q = MsOS_AllocateAlignedMemory(n+8, 8, gs32CachedPoolID);
1820*53ee8cc1Swenshuai.xi //q = MsOS_AllocateMemory(n+8, gs32CachedPoolID);
1821*53ee8cc1Swenshuai.xi
1822*53ee8cc1Swenshuai.xi if ( q == NULL )
1823*53ee8cc1Swenshuai.xi {
1824*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOTENOUGHMEM );
1825*53ee8cc1Swenshuai.xi return NULL;
1826*53ee8cc1Swenshuai.xi }
1827*53ee8cc1Swenshuai.xi
1828*53ee8cc1Swenshuai.xi JPEG_memset((void *)q, 0, n + 8 );
1829*53ee8cc1Swenshuai.xi
1830*53ee8cc1Swenshuai.xi _pBlocks[i] = q;
1831*53ee8cc1Swenshuai.xi
1832*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG %ld bytes allocated\n", n);
1833*53ee8cc1Swenshuai.xi
1834*53ee8cc1Swenshuai.xi return ( ( void* )q );
1835*53ee8cc1Swenshuai.xi }
1836*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_Tiff_EndianChangeL(MS_U32 u32Val)1837*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_Tiff_EndianChangeL(MS_U32 u32Val)
1838*53ee8cc1Swenshuai.xi {
1839*53ee8cc1Swenshuai.xi if (_bTiffBigEndian)
1840*53ee8cc1Swenshuai.xi return EndianChangeL(u32Val);
1841*53ee8cc1Swenshuai.xi else
1842*53ee8cc1Swenshuai.xi return u32Val;
1843*53ee8cc1Swenshuai.xi }
1844*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_Tiff_EndianChangeS(MS_U16 u16Val)1845*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_Tiff_EndianChangeS(MS_U16 u16Val)
1846*53ee8cc1Swenshuai.xi {
1847*53ee8cc1Swenshuai.xi if (_bTiffBigEndian)
1848*53ee8cc1Swenshuai.xi return EndianChangeS(u16Val);
1849*53ee8cc1Swenshuai.xi else
1850*53ee8cc1Swenshuai.xi return u16Val;
1851*53ee8cc1Swenshuai.xi }
1852*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_GetU16(MS_U8 * data)1853*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_GetU16(MS_U8 *data)
1854*53ee8cc1Swenshuai.xi {
1855*53ee8cc1Swenshuai.xi MS_S8 i;
1856*53ee8cc1Swenshuai.xi MS_U16 val = 0;
1857*53ee8cc1Swenshuai.xi
1858*53ee8cc1Swenshuai.xi for(i = 1; i>=0; i--)
1859*53ee8cc1Swenshuai.xi val = (val << 8) + (MS_U8) *(data + i);
1860*53ee8cc1Swenshuai.xi
1861*53ee8cc1Swenshuai.xi
1862*53ee8cc1Swenshuai.xi return val;
1863*53ee8cc1Swenshuai.xi }
1864*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_GetU32(MS_U8 * data)1865*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_GetU32(MS_U8 *data)
1866*53ee8cc1Swenshuai.xi {
1867*53ee8cc1Swenshuai.xi MS_S8 i;
1868*53ee8cc1Swenshuai.xi MS_U32 val = 0;
1869*53ee8cc1Swenshuai.xi
1870*53ee8cc1Swenshuai.xi for(i = 3; i>=0; i--)
1871*53ee8cc1Swenshuai.xi val = (val << 8) + (MS_U8) *(data + i);
1872*53ee8cc1Swenshuai.xi
1873*53ee8cc1Swenshuai.xi return val;
1874*53ee8cc1Swenshuai.xi }
1875*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1876*53ee8cc1Swenshuai.xi //***************************************************
1877*53ee8cc1Swenshuai.xi //Parse EXIF header
1878*53ee8cc1Swenshuai.xi //***************************************************
JPEG_DecodeExifInfo(MS_U8 * data,MS_U32 data_length)1879*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_DecodeExifInfo(MS_U8 *data, MS_U32 data_length)
1880*53ee8cc1Swenshuai.xi {
1881*53ee8cc1Swenshuai.xi MS_U8 *pJpegBuff = data;
1882*53ee8cc1Swenshuai.xi // MS_U32 u32tmp, u32Len;
1883*53ee8cc1Swenshuai.xi MS_U32 u32tmp;
1884*53ee8cc1Swenshuai.xi MS_U16 u16Marker, u16Len, u16NumOfEntry, i;
1885*53ee8cc1Swenshuai.xi MS_U8 *pTiffHdrPtr, *pNextIfd;
1886*53ee8cc1Swenshuai.xi MS_U32 u32DataValue;
1887*53ee8cc1Swenshuai.xi MS_U8 *pExifHdr = NULL, *pExifHdrOffet = NULL;
1888*53ee8cc1Swenshuai.xi MS_BOOL bIFD_pt_found = FALSE;
1889*53ee8cc1Swenshuai.xi
1890*53ee8cc1Swenshuai.xi u32tmp = JPEG_GetU32(pJpegBuff);
1891*53ee8cc1Swenshuai.xi if (JPEG_TAG_EXIF != u32tmp)
1892*53ee8cc1Swenshuai.xi {
1893*53ee8cc1Swenshuai.xi return FALSE;
1894*53ee8cc1Swenshuai.xi }
1895*53ee8cc1Swenshuai.xi
1896*53ee8cc1Swenshuai.xi // Exif starts here
1897*53ee8cc1Swenshuai.xi pJpegBuff += 6;
1898*53ee8cc1Swenshuai.xi pExifHdr = pJpegBuff;
1899*53ee8cc1Swenshuai.xi u16Marker = JPEG_GetU16(pJpegBuff);
1900*53ee8cc1Swenshuai.xi if (JPEG_TIFF_BIG_ENDIAN == u16Marker)
1901*53ee8cc1Swenshuai.xi _bTiffBigEndian = TRUE;
1902*53ee8cc1Swenshuai.xi else if (JPEG_TIFF_LITTLE_ENDIAN == u16Marker)
1903*53ee8cc1Swenshuai.xi _bTiffBigEndian = FALSE;
1904*53ee8cc1Swenshuai.xi else
1905*53ee8cc1Swenshuai.xi return FALSE;
1906*53ee8cc1Swenshuai.xi
1907*53ee8cc1Swenshuai.xi _u32ThumbnailOffset += 6;
1908*53ee8cc1Swenshuai.xi pTiffHdrPtr = pJpegBuff;
1909*53ee8cc1Swenshuai.xi
1910*53ee8cc1Swenshuai.xi pJpegBuff += 2;
1911*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1912*53ee8cc1Swenshuai.xi if (u16Marker != 0x002A)
1913*53ee8cc1Swenshuai.xi return FALSE;
1914*53ee8cc1Swenshuai.xi
1915*53ee8cc1Swenshuai.xi pJpegBuff += 2;
1916*53ee8cc1Swenshuai.xi u16Len = (MS_U16)JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
1917*53ee8cc1Swenshuai.xi pJpegBuff += (u16Len - 4); //ENDIAN(2byte) + 0x002A(2byte)
1918*53ee8cc1Swenshuai.xi
1919*53ee8cc1Swenshuai.xi // 0th IFD start here
1920*53ee8cc1Swenshuai.xi u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1921*53ee8cc1Swenshuai.xi pJpegBuff += 2;
1922*53ee8cc1Swenshuai.xi
1923*53ee8cc1Swenshuai.xi // Boundary check, prevent from buffer over-run
1924*53ee8cc1Swenshuai.xi if((((MS_U32) pJpegBuff) - INTERNAL_BUFFER_ADDR + u16NumOfEntry*12)>=data_length)
1925*53ee8cc1Swenshuai.xi {
1926*53ee8cc1Swenshuai.xi return FALSE;
1927*53ee8cc1Swenshuai.xi }
1928*53ee8cc1Swenshuai.xi
1929*53ee8cc1Swenshuai.xi // pJpegBuff += 12*u16NumOfEntry;
1930*53ee8cc1Swenshuai.xi
1931*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("IFD0 : u16NumOfEntry = %d\n", u16NumOfEntry);
1932*53ee8cc1Swenshuai.xi
1933*53ee8cc1Swenshuai.xi //Retrieve orientation
1934*53ee8cc1Swenshuai.xi for(i = 0; i < u16NumOfEntry; i++)
1935*53ee8cc1Swenshuai.xi {
1936*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1937*53ee8cc1Swenshuai.xi pJpegBuff += 8;
1938*53ee8cc1Swenshuai.xi
1939*53ee8cc1Swenshuai.xi if((JPEG_EXIF_TAG_ORIENTATION == u16Marker)
1940*53ee8cc1Swenshuai.xi && (E_JPEG_EXIF_ORIENT_NOT_FOUND == _eEXIF_Orientation))
1941*53ee8cc1Swenshuai.xi {
1942*53ee8cc1Swenshuai.xi //The datatype of orientation is short
1943*53ee8cc1Swenshuai.xi u32DataValue = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1944*53ee8cc1Swenshuai.xi if((E_JPEG_EXIF_ORIENT_ROTATE_0 > u32DataValue)
1945*53ee8cc1Swenshuai.xi || (E_JPEG_EXIF_ORIENT_ROTATE_270 < u32DataValue))
1946*53ee8cc1Swenshuai.xi {
1947*53ee8cc1Swenshuai.xi _eEXIF_Orientation = E_JPEG_EXIF_ORIENT_RESERVED;
1948*53ee8cc1Swenshuai.xi }
1949*53ee8cc1Swenshuai.xi else
1950*53ee8cc1Swenshuai.xi {
1951*53ee8cc1Swenshuai.xi _eEXIF_Orientation = (JPEG_EXIF_Orientation)u32DataValue;
1952*53ee8cc1Swenshuai.xi }
1953*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", _eEXIF_Orientation);
1954*53ee8cc1Swenshuai.xi }
1955*53ee8cc1Swenshuai.xi else if(JPEG_EXIF_TAG_IFD_POINTER == u16Marker)
1956*53ee8cc1Swenshuai.xi {
1957*53ee8cc1Swenshuai.xi bIFD_pt_found = TRUE;
1958*53ee8cc1Swenshuai.xi //datavalue is an offset from exif marker for datetime
1959*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
1960*53ee8cc1Swenshuai.xi pExifHdrOffet = pExifHdr + u32DataValue;
1961*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifHdrOffet, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
1962*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Exif IFD pointer = 0x%lx\n", (MS_U32)pExifHdrOffet);
1963*53ee8cc1Swenshuai.xi }
1964*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
1965*53ee8cc1Swenshuai.xi else if(JPEG_EXIF_TAG_MANUFACTURER == u16Marker)
1966*53ee8cc1Swenshuai.xi {
1967*53ee8cc1Swenshuai.xi MS_U8 *pIFDPtrOffset;
1968*53ee8cc1Swenshuai.xi pIFDPtrOffset = pJpegBuff;
1969*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pIFDPtrOffset));
1970*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MANUFACTURER Offset = 0x%lx\n", u32DataValue);
1971*53ee8cc1Swenshuai.xi pIFDPtrOffset = pExifHdr + u32DataValue;
1972*53ee8cc1Swenshuai.xi if(JPEG_OVER_BUFFER((MS_U32)pIFDPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE))
1973*53ee8cc1Swenshuai.xi {
1974*53ee8cc1Swenshuai.xi pJpegBuff += 4;
1975*53ee8cc1Swenshuai.xi continue;
1976*53ee8cc1Swenshuai.xi }
1977*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("MANUFACTURER addr = 0x%lx\n", (MS_U32)pIFDPtrOffset);
1978*53ee8cc1Swenshuai.xi MS_U8 u8i=0;
1979*53ee8cc1Swenshuai.xi while(*(pIFDPtrOffset+u8i) && u8i<JPEG_MANUFACTURER_SIZE)
1980*53ee8cc1Swenshuai.xi {
1981*53ee8cc1Swenshuai.xi _u8EXIF_Manufacturer[u8i] = *(pIFDPtrOffset+u8i);
1982*53ee8cc1Swenshuai.xi u8i++;
1983*53ee8cc1Swenshuai.xi }
1984*53ee8cc1Swenshuai.xi }
1985*53ee8cc1Swenshuai.xi else if(JPEG_EXIF_TAG_MODEL== u16Marker)
1986*53ee8cc1Swenshuai.xi {
1987*53ee8cc1Swenshuai.xi MS_U8 *pIFDPtrOffset;
1988*53ee8cc1Swenshuai.xi pIFDPtrOffset = pJpegBuff;
1989*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pIFDPtrOffset));
1990*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MODEL Offset = 0x%lx\n", u32DataValue);
1991*53ee8cc1Swenshuai.xi pIFDPtrOffset = pExifHdr + u32DataValue;
1992*53ee8cc1Swenshuai.xi if(JPEG_OVER_BUFFER((MS_U32)pIFDPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE))
1993*53ee8cc1Swenshuai.xi {
1994*53ee8cc1Swenshuai.xi pJpegBuff += 4;
1995*53ee8cc1Swenshuai.xi continue;
1996*53ee8cc1Swenshuai.xi }
1997*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("MODEL addr = 0x%lx\n", (MS_U32)pIFDPtrOffset);
1998*53ee8cc1Swenshuai.xi MS_U8 u8i=0;
1999*53ee8cc1Swenshuai.xi while(*(pIFDPtrOffset+u8i) && u8i<JPEG_MODEL_SIZE)
2000*53ee8cc1Swenshuai.xi {
2001*53ee8cc1Swenshuai.xi _u8EXIF_Model[u8i] = *(pIFDPtrOffset+u8i);
2002*53ee8cc1Swenshuai.xi u8i++;
2003*53ee8cc1Swenshuai.xi }
2004*53ee8cc1Swenshuai.xi }
2005*53ee8cc1Swenshuai.xi #endif
2006*53ee8cc1Swenshuai.xi #if 0
2007*53ee8cc1Swenshuai.xi else if((JPEG_EXIF_TAG_DATETIME_MOD == u16Marker)
2008*53ee8cc1Swenshuai.xi && (FALSE == _stEXIF_DateTime.bHasDataTime))
2009*53ee8cc1Swenshuai.xi {
2010*53ee8cc1Swenshuai.xi _stEXIF_DateTime.bHasDataTime = TRUE;
2011*53ee8cc1Swenshuai.xi //datavalue is an offset from exif marker for datetime
2012*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2013*53ee8cc1Swenshuai.xi pExifOffset = pExifHdr + u32DataValue;
2014*53ee8cc1Swenshuai.xi printf("pExifOffset1 = 0x%lx\n", (MS_U32)pExifOffset);
2015*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Year);
2016*53ee8cc1Swenshuai.xi pExifOffset++;
2017*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Month);
2018*53ee8cc1Swenshuai.xi pExifOffset++;
2019*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Day);
2020*53ee8cc1Swenshuai.xi pExifOffset++;
2021*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Hour);
2022*53ee8cc1Swenshuai.xi pExifOffset++;
2023*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Minute);
2024*53ee8cc1Swenshuai.xi pExifOffset++;
2025*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Second);
2026*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", _eEXIF_Orientation);
2027*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime======= Exist = %d, Original = %d \n", _stEXIF_DateTime.bHasDataTime, bOriDateTimeFound);
2028*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
2029*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
2030*53ee8cc1Swenshuai.xi }
2031*53ee8cc1Swenshuai.xi #endif
2032*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2033*53ee8cc1Swenshuai.xi }
2034*53ee8cc1Swenshuai.xi
2035*53ee8cc1Swenshuai.xi if(TRUE == bIFD_pt_found)
2036*53ee8cc1Swenshuai.xi {
2037*53ee8cc1Swenshuai.xi u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifHdrOffet));
2038*53ee8cc1Swenshuai.xi pExifHdrOffet += 2;
2039*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EXIF IFD : u16NumOfEntry = %d\n", u16NumOfEntry);
2040*53ee8cc1Swenshuai.xi
2041*53ee8cc1Swenshuai.xi for(i = 0; i < u16NumOfEntry; i++)
2042*53ee8cc1Swenshuai.xi {
2043*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifHdrOffet));
2044*53ee8cc1Swenshuai.xi #if (SUPPORT_EXIF_EXTRA_INFO==FALSE)
2045*53ee8cc1Swenshuai.xi if(JPEG_EXIF_TAG_DATETIME_ORI == u16Marker)
2046*53ee8cc1Swenshuai.xi {
2047*53ee8cc1Swenshuai.xi pExifHdrOffet += 8;
2048*53ee8cc1Swenshuai.xi _stEXIF_DateTime.bHasDataTime = TRUE;
2049*53ee8cc1Swenshuai.xi //datavalue is an offset from exif marker for datetime
2050*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifHdrOffet));;
2051*53ee8cc1Swenshuai.xi pExifHdrOffet = pExifHdr + u32DataValue;
2052*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifHdrOffet, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2053*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("pExifOriDateTime Offset = 0x%lx\n", (MS_U32)pExifHdrOffet);
2054*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Year);
2055*53ee8cc1Swenshuai.xi pExifHdrOffet++;
2056*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Month);
2057*53ee8cc1Swenshuai.xi pExifHdrOffet++;
2058*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Day);
2059*53ee8cc1Swenshuai.xi pExifHdrOffet++;
2060*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Hour);
2061*53ee8cc1Swenshuai.xi pExifHdrOffet++;
2062*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Minute);
2063*53ee8cc1Swenshuai.xi pExifHdrOffet++;
2064*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Second);
2065*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime=======\n");
2066*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
2067*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
2068*53ee8cc1Swenshuai.xi break;
2069*53ee8cc1Swenshuai.xi }
2070*53ee8cc1Swenshuai.xi #else
2071*53ee8cc1Swenshuai.xi MS_U8 *pExifPtrOffset;
2072*53ee8cc1Swenshuai.xi MS_U16 u16Type;
2073*53ee8cc1Swenshuai.xi MS_U32 u32Count;
2074*53ee8cc1Swenshuai.xi switch(u16Marker)
2075*53ee8cc1Swenshuai.xi {
2076*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_DATETIME_ORI:
2077*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2078*53ee8cc1Swenshuai.xi _stEXIF_DateTime.bHasDataTime = TRUE;
2079*53ee8cc1Swenshuai.xi //datavalue is an offset from exif marker for datetime
2080*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2081*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2082*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2083*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("pExifOriDateTime Offset = 0x%lx\n", (MS_U32)pExifPtrOffset);
2084*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Year);
2085*53ee8cc1Swenshuai.xi pExifPtrOffset++;
2086*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Month);
2087*53ee8cc1Swenshuai.xi pExifPtrOffset++;
2088*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Day);
2089*53ee8cc1Swenshuai.xi pExifPtrOffset++;
2090*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Hour);
2091*53ee8cc1Swenshuai.xi pExifPtrOffset++;
2092*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Minute);
2093*53ee8cc1Swenshuai.xi pExifPtrOffset++;
2094*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Second);
2095*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime=======\n");
2096*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
2097*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
2098*53ee8cc1Swenshuai.xi break;
2099*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_ISO_SPEED_RATING:
2100*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 2;
2101*53ee8cc1Swenshuai.xi u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2102*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 4;
2103*53ee8cc1Swenshuai.xi u32Count = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2104*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2105*53ee8cc1Swenshuai.xi if(u16Type==3)
2106*53ee8cc1Swenshuai.xi {
2107*53ee8cc1Swenshuai.xi if(u32Count==2)
2108*53ee8cc1Swenshuai.xi {
2109*53ee8cc1Swenshuai.xi _u32EXIF_ISOSpeedRatings=JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2110*53ee8cc1Swenshuai.xi }
2111*53ee8cc1Swenshuai.xi else if(u32Count==1)
2112*53ee8cc1Swenshuai.xi {
2113*53ee8cc1Swenshuai.xi _u32EXIF_ISOSpeedRatings=JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2114*53ee8cc1Swenshuai.xi }
2115*53ee8cc1Swenshuai.xi }
2116*53ee8cc1Swenshuai.xi else if(u16Type==4)
2117*53ee8cc1Swenshuai.xi {
2118*53ee8cc1Swenshuai.xi if(u32Count==1)
2119*53ee8cc1Swenshuai.xi {
2120*53ee8cc1Swenshuai.xi _u32EXIF_ISOSpeedRatings=JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2121*53ee8cc1Swenshuai.xi }
2122*53ee8cc1Swenshuai.xi }
2123*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ISO Speed Rating=%ld\n", _u32EXIF_ISOSpeedRatings);
2124*53ee8cc1Swenshuai.xi break;
2125*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_EXPOSURE_TIME:
2126*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2127*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2128*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureTime Offset = 0x%lx\n", u32DataValue);
2129*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2130*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("ExposureTime addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2131*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2132*53ee8cc1Swenshuai.xi _stEXIF_ExposureTime.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2133*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2134*53ee8cc1Swenshuai.xi _stEXIF_ExposureTime.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2135*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureTime numerator=%ld, denominator=%ld\n", _stEXIF_ExposureTime.numerator, _stEXIF_ExposureTime.denominator);
2136*53ee8cc1Swenshuai.xi break;
2137*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_F_NUMBER:
2138*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2139*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2140*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FNumber Offset = 0x%lx\n", u32DataValue);
2141*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2142*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("FNumber addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2143*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2144*53ee8cc1Swenshuai.xi _stEXIF_FNumber.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2145*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2146*53ee8cc1Swenshuai.xi _stEXIF_FNumber.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2147*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FNumber numerator=%ld, denominator=%ld\n", _stEXIF_FNumber.numerator, _stEXIF_FNumber.denominator);
2148*53ee8cc1Swenshuai.xi break;
2149*53ee8cc1Swenshuai.xi
2150*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_SHUTTER_SPEED:
2151*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2152*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2153*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ShutterSpeedValue Offset = 0x%lx\n", u32DataValue);
2154*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2155*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2156*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("ShutterSpeedValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2157*53ee8cc1Swenshuai.xi _stEXIF_ShutterSpeedValue.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2158*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2159*53ee8cc1Swenshuai.xi _stEXIF_ShutterSpeedValue.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2160*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ShutterSpeedValue numerator=%ld, denominator=%ld\n", _stEXIF_ShutterSpeedValue.numerator, _stEXIF_ShutterSpeedValue.denominator);
2161*53ee8cc1Swenshuai.xi break;
2162*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_APERTURE:
2163*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2164*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2165*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ApertureValue Offset = 0x%lx\n", u32DataValue);
2166*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2167*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("ApertureValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2168*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2169*53ee8cc1Swenshuai.xi _stEXIF_ApertureValue.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2170*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2171*53ee8cc1Swenshuai.xi _stEXIF_ApertureValue.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2172*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ApertureValue numerator=%ld, denominator=%ld\n", _stEXIF_ApertureValue.s_numerator, _stEXIF_ApertureValue.s_denominator);
2173*53ee8cc1Swenshuai.xi break;
2174*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_EXPOSURE_BIAS:
2175*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2176*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2177*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureBiasValue Offset = 0x%lx\n", u32DataValue);
2178*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2179*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2180*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("ExposureBiasValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2181*53ee8cc1Swenshuai.xi _stEXIF_ExposureBiasValue.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2182*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2183*53ee8cc1Swenshuai.xi _stEXIF_ExposureBiasValue.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2184*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureBiasValue numerator=%ld, denominator=%ld\n", _stEXIF_ExposureBiasValue.numerator, _stEXIF_ExposureBiasValue.denominator);
2185*53ee8cc1Swenshuai.xi break;
2186*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_FLASH:
2187*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2188*53ee8cc1Swenshuai.xi _u16EXIF_Flash = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2189*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EXIF_Flash=0x%x\n", _u16EXIF_Flash);
2190*53ee8cc1Swenshuai.xi break;
2191*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_FOCAL_LENGTH:
2192*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2193*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2194*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FocalLength Offset = 0x%lx\n", u32DataValue);
2195*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2196*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2197*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("FocalLength addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2198*53ee8cc1Swenshuai.xi _stEXIF_FocalLength.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2199*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2200*53ee8cc1Swenshuai.xi _stEXIF_FocalLength.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2201*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FocalLength numerator=%ld, denominator=%ld\n", _stEXIF_FocalLength.s_numerator, _stEXIF_FocalLength.s_denominator);
2202*53ee8cc1Swenshuai.xi break;
2203*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_IMAGE_WIDTH:
2204*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 2;
2205*53ee8cc1Swenshuai.xi u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2206*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2207*53ee8cc1Swenshuai.xi if(u16Type==3)
2208*53ee8cc1Swenshuai.xi {
2209*53ee8cc1Swenshuai.xi _u32EXIF_ImageWidth = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2210*53ee8cc1Swenshuai.xi }
2211*53ee8cc1Swenshuai.xi else
2212*53ee8cc1Swenshuai.xi {
2213*53ee8cc1Swenshuai.xi _u32EXIF_ImageWidth = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2214*53ee8cc1Swenshuai.xi }
2215*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EXIF_ImageWidth=%ld\n", _u32EXIF_ImageWidth);
2216*53ee8cc1Swenshuai.xi break;
2217*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_IMAGE_HEIGHT:
2218*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 2;
2219*53ee8cc1Swenshuai.xi u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2220*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2221*53ee8cc1Swenshuai.xi if(u16Type==3)
2222*53ee8cc1Swenshuai.xi {
2223*53ee8cc1Swenshuai.xi _u32EXIF_ImageHeight = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2224*53ee8cc1Swenshuai.xi }
2225*53ee8cc1Swenshuai.xi else
2226*53ee8cc1Swenshuai.xi {
2227*53ee8cc1Swenshuai.xi _u32EXIF_ImageHeight = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2228*53ee8cc1Swenshuai.xi }
2229*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EXIF_ImageHeight=%ld\n", _u32EXIF_ImageHeight);
2230*53ee8cc1Swenshuai.xi break;
2231*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_EXPOSURE_PROGRAM:
2232*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2233*53ee8cc1Swenshuai.xi _u16EXIF_Exposureprogram = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2234*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EXIF_Exposureprogram=0x%x\n", _u16EXIF_Exposureprogram);
2235*53ee8cc1Swenshuai.xi break;
2236*53ee8cc1Swenshuai.xi default:
2237*53ee8cc1Swenshuai.xi break;
2238*53ee8cc1Swenshuai.xi }
2239*53ee8cc1Swenshuai.xi #endif
2240*53ee8cc1Swenshuai.xi pExifHdrOffet += 12;
2241*53ee8cc1Swenshuai.xi }
2242*53ee8cc1Swenshuai.xi }
2243*53ee8cc1Swenshuai.xi
2244*53ee8cc1Swenshuai.xi if(E_JPEG_TYPE_THUMBNAIL != _u8DecodeType)
2245*53ee8cc1Swenshuai.xi {
2246*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("decode type is not thumbnail...\n");
2247*53ee8cc1Swenshuai.xi return FALSE;
2248*53ee8cc1Swenshuai.xi }
2249*53ee8cc1Swenshuai.xi
2250*53ee8cc1Swenshuai.xi // 1th IFD
2251*53ee8cc1Swenshuai.xi u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2252*53ee8cc1Swenshuai.xi if (u32tmp == 0)
2253*53ee8cc1Swenshuai.xi return FALSE;
2254*53ee8cc1Swenshuai.xi else
2255*53ee8cc1Swenshuai.xi {
2256*53ee8cc1Swenshuai.xi if(u32tmp >= data_length)
2257*53ee8cc1Swenshuai.xi {
2258*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("u32tmp = %ld is invalid > %ld\n", u32tmp,data_length);
2259*53ee8cc1Swenshuai.xi return FALSE;
2260*53ee8cc1Swenshuai.xi }
2261*53ee8cc1Swenshuai.xi pNextIfd = &pTiffHdrPtr[u32tmp];
2262*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("1st IFD pNextIfd = 0x%lx, u32tmp = %ld\n", (MS_U32)pNextIfd, u32tmp);
2263*53ee8cc1Swenshuai.xi }
2264*53ee8cc1Swenshuai.xi
2265*53ee8cc1Swenshuai.xi u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pNextIfd));
2266*53ee8cc1Swenshuai.xi pNextIfd += 2;
2267*53ee8cc1Swenshuai.xi
2268*53ee8cc1Swenshuai.xi // Boundary check, prevent from buffer over-run
2269*53ee8cc1Swenshuai.xi if((((MS_U32) pNextIfd) - INTERNAL_BUFFER_ADDR + u16NumOfEntry*12)>=data_length)
2270*53ee8cc1Swenshuai.xi {
2271*53ee8cc1Swenshuai.xi return FALSE;
2272*53ee8cc1Swenshuai.xi }
2273*53ee8cc1Swenshuai.xi
2274*53ee8cc1Swenshuai.xi for (i = 0; i < u16NumOfEntry; i++)
2275*53ee8cc1Swenshuai.xi {
2276*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pNextIfd));
2277*53ee8cc1Swenshuai.xi // u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pNextIfd + 4));
2278*53ee8cc1Swenshuai.xi u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pNextIfd + 8));
2279*53ee8cc1Swenshuai.xi
2280*53ee8cc1Swenshuai.xi switch (u16Marker)
2281*53ee8cc1Swenshuai.xi {
2282*53ee8cc1Swenshuai.xi case JPEG_TIFF_JPEG_IMG_BYTES:
2283*53ee8cc1Swenshuai.xi _u16ThumbnailSize = u32tmp;
2284*53ee8cc1Swenshuai.xi break;
2285*53ee8cc1Swenshuai.xi case JPEG_TIFF_SOI_OFFSET:
2286*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Thumbnail marker found in 0x%lx!!\n", (MS_U32)pNextIfd);
2287*53ee8cc1Swenshuai.xi _bThumbnailFound = TRUE;
2288*53ee8cc1Swenshuai.xi _u32ThumbnailOffset += u32tmp;
2289*53ee8cc1Swenshuai.xi break;
2290*53ee8cc1Swenshuai.xi default:
2291*53ee8cc1Swenshuai.xi break;
2292*53ee8cc1Swenshuai.xi }
2293*53ee8cc1Swenshuai.xi
2294*53ee8cc1Swenshuai.xi pNextIfd += 12;
2295*53ee8cc1Swenshuai.xi }
2296*53ee8cc1Swenshuai.xi
2297*53ee8cc1Swenshuai.xi // Boundary check, prevent from buffer over-run
2298*53ee8cc1Swenshuai.xi if(_bThumbnailFound)
2299*53ee8cc1Swenshuai.xi {
2300*53ee8cc1Swenshuai.xi if((_u32ThumbnailOffset + _u16ThumbnailSize) > data_length)
2301*53ee8cc1Swenshuai.xi _bThumbnailFound = FALSE;
2302*53ee8cc1Swenshuai.xi
2303*53ee8cc1Swenshuai.xi // means it only contains SOI header..
2304*53ee8cc1Swenshuai.xi if(_u16ThumbnailSize<=2)
2305*53ee8cc1Swenshuai.xi _bThumbnailFound = FALSE;
2306*53ee8cc1Swenshuai.xi }
2307*53ee8cc1Swenshuai.xi
2308*53ee8cc1Swenshuai.xi return _bThumbnailFound;
2309*53ee8cc1Swenshuai.xi }
2310*53ee8cc1Swenshuai.xi
2311*53ee8cc1Swenshuai.xi // Used to skip unrecognized markers.
JPEG_skip_bytes(MS_U32 count)2312*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_skip_bytes(MS_U32 count)
2313*53ee8cc1Swenshuai.xi {
2314*53ee8cc1Swenshuai.xi while(count!=0)
2315*53ee8cc1Swenshuai.xi {
2316*53ee8cc1Swenshuai.xi // Any bytes remaining in buffer?
2317*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
2318*53ee8cc1Swenshuai.xi {
2319*53ee8cc1Swenshuai.xi // Try to get more bytes.
2320*53ee8cc1Swenshuai.xi if(!JPEG_fill_read_buffer())
2321*53ee8cc1Swenshuai.xi {
2322*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer failed!!!\n");
2323*53ee8cc1Swenshuai.xi _u32In_buf_left = 0;
2324*53ee8cc1Swenshuai.xi }
2325*53ee8cc1Swenshuai.xi // Still nothing to get?
2326*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
2327*53ee8cc1Swenshuai.xi {
2328*53ee8cc1Swenshuai.xi // should not happen
2329*53ee8cc1Swenshuai.xi break;
2330*53ee8cc1Swenshuai.xi }
2331*53ee8cc1Swenshuai.xi }
2332*53ee8cc1Swenshuai.xi
2333*53ee8cc1Swenshuai.xi if(count<_u32In_buf_left)
2334*53ee8cc1Swenshuai.xi {
2335*53ee8cc1Swenshuai.xi _u32In_buf_left -= count;
2336*53ee8cc1Swenshuai.xi _pu8In_buf_ofs += count;
2337*53ee8cc1Swenshuai.xi count = 0;
2338*53ee8cc1Swenshuai.xi }
2339*53ee8cc1Swenshuai.xi else
2340*53ee8cc1Swenshuai.xi {
2341*53ee8cc1Swenshuai.xi count -= _u32In_buf_left;
2342*53ee8cc1Swenshuai.xi _u32In_buf_left = 0;
2343*53ee8cc1Swenshuai.xi }
2344*53ee8cc1Swenshuai.xi }
2345*53ee8cc1Swenshuai.xi }
2346*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2347*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
2348*53ee8cc1Swenshuai.xi #define JPEG_TAG_MPO EndianChangeL(0x4D504600)
2349*53ee8cc1Swenshuai.xi #define JPEG_MPO_TAG_MPF_VERSION 0xB000
2350*53ee8cc1Swenshuai.xi #define JPEG_MPO_TAG_NUM_OF_IMAGES 0xB001
2351*53ee8cc1Swenshuai.xi #define JPEG_MPO_TAG_MP_ENTRY 0xB002
2352*53ee8cc1Swenshuai.xi
2353*53ee8cc1Swenshuai.xi static JPEG_MPO_INDEX_INFO _stMPOIndex;
2354*53ee8cc1Swenshuai.xi static JPEG_MPO_ATTRIBUTE_INFO _stMPOAttri[JPEG_MPO_MAX_SUPPORT_IMAGE];
2355*53ee8cc1Swenshuai.xi //For start of offset of MPO(only for first MPO picture)
2356*53ee8cc1Swenshuai.xi static MS_U32 _u32App2MarkerOffset = 0;
2357*53ee8cc1Swenshuai.xi
2358*53ee8cc1Swenshuai.xi typedef enum
2359*53ee8cc1Swenshuai.xi {
2360*53ee8cc1Swenshuai.xi E_JPEG_MPO_ATTR_IMAGE_NO = 0xB101
2361*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_PAN_ORIENTATION = 0xB201
2362*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_PAN_OVERLAP_H = 0xB202
2363*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_PAN_OVERLAP_V = 0xB203
2364*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_BASE_VIEWPOINT_NO = 0xB204
2365*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_CONVERGENCE_ANGLE = 0xB205
2366*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_BASELINE_LENGTH = 0xB206
2367*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_DIVERGENCE_ANGLE = 0xB207
2368*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_AXIS_DISTANCE_X = 0xB208
2369*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_AXIS_DISTANCE_Y = 0xB209
2370*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_AXIS_DISTANCE_Z = 0xB20A
2371*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_YAW_ANGLE = 0xB20B
2372*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_PITCH_ANGLE = 0xB20C
2373*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_ROLL_ANGLE = 0xB20D
2374*53ee8cc1Swenshuai.xi } JPEG_MPO_ATTR_TAG;
2375*53ee8cc1Swenshuai.xi
2376*53ee8cc1Swenshuai.xi #define MAX_MPO_ATTR_TAG_NUM 14 // from E_JPEG_MPO_ATTR_IMAGE_NO to E_JPEG_MPO_ATTR_ROLL_ANGLE
2377*53ee8cc1Swenshuai.xi
2378*53ee8cc1Swenshuai.xi //***************************************************
2379*53ee8cc1Swenshuai.xi //Initialize EXIF MPO database
2380*53ee8cc1Swenshuai.xi //***************************************************
JPEG_InitMPO(void)2381*53ee8cc1Swenshuai.xi static void JPEG_InitMPO(void)
2382*53ee8cc1Swenshuai.xi {
2383*53ee8cc1Swenshuai.xi MS_U32 i = 0;
2384*53ee8cc1Swenshuai.xi
2385*53ee8cc1Swenshuai.xi //init MPO Index structure
2386*53ee8cc1Swenshuai.xi _stMPOIndex.num_of_image = 1;
2387*53ee8cc1Swenshuai.xi for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2388*53ee8cc1Swenshuai.xi {
2389*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].attribute = 0;
2390*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].size = 0;
2391*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].offset = 0;
2392*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].image1_no = 0;
2393*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].image2_no = 0;
2394*53ee8cc1Swenshuai.xi }
2395*53ee8cc1Swenshuai.xi
2396*53ee8cc1Swenshuai.xi // init MPO Attribute structure
2397*53ee8cc1Swenshuai.xi for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2398*53ee8cc1Swenshuai.xi {
2399*53ee8cc1Swenshuai.xi _stMPOAttri[i].MPIndividualNum = 0;
2400*53ee8cc1Swenshuai.xi _stMPOAttri[i].PanOrientation= 0;
2401*53ee8cc1Swenshuai.xi _stMPOAttri[i].PanOverlap_H.numerator = 0;
2402*53ee8cc1Swenshuai.xi _stMPOAttri[i].PanOverlap_H.denominator = 0;
2403*53ee8cc1Swenshuai.xi _stMPOAttri[i].PanOverlap_V.numerator = 0;
2404*53ee8cc1Swenshuai.xi _stMPOAttri[i].PanOverlap_V.denominator = 0;
2405*53ee8cc1Swenshuai.xi _stMPOAttri[i].BaseViewpointNum = 0;
2406*53ee8cc1Swenshuai.xi _stMPOAttri[i].ConvergenceAngle.s_numerator = 0;
2407*53ee8cc1Swenshuai.xi _stMPOAttri[i].ConvergenceAngle.s_denominator = 0;
2408*53ee8cc1Swenshuai.xi _stMPOAttri[i].BaselineLength.numerator = 0;
2409*53ee8cc1Swenshuai.xi _stMPOAttri[i].BaselineLength.denominator = 0;
2410*53ee8cc1Swenshuai.xi _stMPOAttri[i].VerticalDivergence.s_numerator = 0;
2411*53ee8cc1Swenshuai.xi _stMPOAttri[i].VerticalDivergence.s_denominator = 0;
2412*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_X.s_numerator = 0;
2413*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_X.s_denominator = 0;
2414*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_Y.s_numerator = 0;
2415*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_Y.s_denominator = 0;
2416*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_Z.s_numerator = 0;
2417*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_Z.s_denominator = 0;
2418*53ee8cc1Swenshuai.xi _stMPOAttri[i].YawAngle.s_numerator = 0;
2419*53ee8cc1Swenshuai.xi _stMPOAttri[i].YawAngle.s_denominator = 0;
2420*53ee8cc1Swenshuai.xi _stMPOAttri[i].PitchAngle.s_numerator = 0;
2421*53ee8cc1Swenshuai.xi _stMPOAttri[i].PitchAngle.s_denominator = 0;
2422*53ee8cc1Swenshuai.xi _stMPOAttri[i].RollAngle.s_numerator = 0;
2423*53ee8cc1Swenshuai.xi _stMPOAttri[i].RollAngle.s_denominator = 0;
2424*53ee8cc1Swenshuai.xi _stMPOAttri[i].used = FALSE;
2425*53ee8cc1Swenshuai.xi }
2426*53ee8cc1Swenshuai.xi }
2427*53ee8cc1Swenshuai.xi //***************************************************
2428*53ee8cc1Swenshuai.xi //Parse EXIF MPO Attribute header
2429*53ee8cc1Swenshuai.xi //***************************************************
JPEG_DecodeMPAttrIFD(MS_U8 * data,MS_U8 * start_of_offset,MS_U32 count)2430*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_DecodeMPAttrIFD(MS_U8 *data, MS_U8 *start_of_offset, MS_U32 count)
2431*53ee8cc1Swenshuai.xi {
2432*53ee8cc1Swenshuai.xi MS_U8 *pMPOAttrPtr = data;
2433*53ee8cc1Swenshuai.xi MS_U8 *pMPO_offset;
2434*53ee8cc1Swenshuai.xi MS_U16 u16Marker, i = 0, image_idx = 0;
2435*53ee8cc1Swenshuai.xi
2436*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_DecodeMPAttrIFD, count = %ld\n", count);
2437*53ee8cc1Swenshuai.xi
2438*53ee8cc1Swenshuai.xi if(count >MAX_MPO_ATTR_TAG_NUM)
2439*53ee8cc1Swenshuai.xi {
2440*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Warning!!!unreasonable attribute IFD number !!!\n");
2441*53ee8cc1Swenshuai.xi return TRUE;
2442*53ee8cc1Swenshuai.xi }
2443*53ee8cc1Swenshuai.xi
2444*53ee8cc1Swenshuai.xi for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2445*53ee8cc1Swenshuai.xi {
2446*53ee8cc1Swenshuai.xi if(FALSE == _stMPOAttri[i].used)
2447*53ee8cc1Swenshuai.xi {
2448*53ee8cc1Swenshuai.xi image_idx = i;
2449*53ee8cc1Swenshuai.xi break;
2450*53ee8cc1Swenshuai.xi }
2451*53ee8cc1Swenshuai.xi }
2452*53ee8cc1Swenshuai.xi
2453*53ee8cc1Swenshuai.xi if(JPEG_MPO_MAX_SUPPORT_IMAGE <= i)
2454*53ee8cc1Swenshuai.xi {
2455*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Not support too much images in MPO!!\n");
2456*53ee8cc1Swenshuai.xi return FALSE;
2457*53ee8cc1Swenshuai.xi }
2458*53ee8cc1Swenshuai.xi
2459*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].used = TRUE;
2460*53ee8cc1Swenshuai.xi
2461*53ee8cc1Swenshuai.xi for(i = 0; i < count; i++)
2462*53ee8cc1Swenshuai.xi {
2463*53ee8cc1Swenshuai.xi u16Marker = (JPEG_MPO_ATTR_TAG)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pMPOAttrPtr));
2464*53ee8cc1Swenshuai.xi pMPOAttrPtr += 8;
2465*53ee8cc1Swenshuai.xi switch(u16Marker)
2466*53ee8cc1Swenshuai.xi {
2467*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_IMAGE_NO:
2468*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].MPIndividualNum = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2469*53ee8cc1Swenshuai.xi break;
2470*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_PAN_ORIENTATION:
2471*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PanOrientation = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2472*53ee8cc1Swenshuai.xi break;
2473*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_PAN_OVERLAP_H:
2474*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2475*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2476*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PanOverlap_H.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2477*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2478*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PanOverlap_H.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2479*53ee8cc1Swenshuai.xi break;
2480*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_PAN_OVERLAP_V:
2481*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2482*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2483*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PanOverlap_V.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2484*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2485*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PanOverlap_V.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2486*53ee8cc1Swenshuai.xi break;
2487*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_BASE_VIEWPOINT_NO:
2488*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].BaseViewpointNum = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2489*53ee8cc1Swenshuai.xi break;
2490*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_CONVERGENCE_ANGLE:
2491*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2492*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2493*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].ConvergenceAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2494*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2495*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].ConvergenceAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2496*53ee8cc1Swenshuai.xi break;
2497*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_BASELINE_LENGTH:
2498*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2499*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2500*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].BaselineLength.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2501*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2502*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].BaselineLength.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2503*53ee8cc1Swenshuai.xi break;
2504*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_DIVERGENCE_ANGLE:
2505*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2506*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2507*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].VerticalDivergence.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2508*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2509*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].VerticalDivergence.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2510*53ee8cc1Swenshuai.xi break;
2511*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_AXIS_DISTANCE_X:
2512*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2513*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2514*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_X.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2515*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2516*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_X.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2517*53ee8cc1Swenshuai.xi break;
2518*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_AXIS_DISTANCE_Y:
2519*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2520*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2521*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_Y.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2522*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2523*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_Y.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2524*53ee8cc1Swenshuai.xi break;
2525*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_AXIS_DISTANCE_Z:
2526*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2527*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2528*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_Z.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2529*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2530*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_Z.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2531*53ee8cc1Swenshuai.xi break;
2532*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_YAW_ANGLE:
2533*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2534*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2535*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].YawAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2536*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2537*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].YawAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2538*53ee8cc1Swenshuai.xi break;
2539*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_PITCH_ANGLE:
2540*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2541*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2542*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PitchAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2543*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2544*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PitchAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2545*53ee8cc1Swenshuai.xi break;
2546*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_ROLL_ANGLE:
2547*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2548*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2549*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].RollAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2550*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2551*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].RollAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2552*53ee8cc1Swenshuai.xi break;
2553*53ee8cc1Swenshuai.xi default:
2554*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Unknown MPO attribute marker =0x%x!!!!!!\n", u16Marker);
2555*53ee8cc1Swenshuai.xi break;
2556*53ee8cc1Swenshuai.xi }
2557*53ee8cc1Swenshuai.xi pMPOAttrPtr += 4;
2558*53ee8cc1Swenshuai.xi }
2559*53ee8cc1Swenshuai.xi return TRUE;
2560*53ee8cc1Swenshuai.xi }
2561*53ee8cc1Swenshuai.xi //***************************************************
2562*53ee8cc1Swenshuai.xi //Parse EXIF MPO header
2563*53ee8cc1Swenshuai.xi //***************************************************
JPEG_DecodeMPOInfo(MS_U8 * data)2564*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_DecodeMPOInfo(MS_U8 *data)
2565*53ee8cc1Swenshuai.xi {
2566*53ee8cc1Swenshuai.xi MS_U8 *pJpegBuff = data;
2567*53ee8cc1Swenshuai.xi MS_U8 *pMPOHdrPtr;
2568*53ee8cc1Swenshuai.xi MS_U32 u32tmp, u32Len;
2569*53ee8cc1Swenshuai.xi MS_U16 u16Marker, u16NumOfEntry, i;
2570*53ee8cc1Swenshuai.xi
2571*53ee8cc1Swenshuai.xi u32tmp = JPEG_GetU32(pJpegBuff);
2572*53ee8cc1Swenshuai.xi if (u32tmp != JPEG_TAG_MPO)
2573*53ee8cc1Swenshuai.xi {
2574*53ee8cc1Swenshuai.xi return FALSE;
2575*53ee8cc1Swenshuai.xi }
2576*53ee8cc1Swenshuai.xi
2577*53ee8cc1Swenshuai.xi // mpo header start from here
2578*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2579*53ee8cc1Swenshuai.xi u16Marker = JPEG_GetU16(pJpegBuff);
2580*53ee8cc1Swenshuai.xi if (u16Marker == JPEG_TIFF_BIG_ENDIAN)
2581*53ee8cc1Swenshuai.xi _bTiffBigEndian = TRUE;
2582*53ee8cc1Swenshuai.xi else if (u16Marker == JPEG_TIFF_LITTLE_ENDIAN)
2583*53ee8cc1Swenshuai.xi _bTiffBigEndian = FALSE;
2584*53ee8cc1Swenshuai.xi else
2585*53ee8cc1Swenshuai.xi return FALSE;
2586*53ee8cc1Swenshuai.xi
2587*53ee8cc1Swenshuai.xi // _u32ThumbnailOffset += 4;
2588*53ee8cc1Swenshuai.xi pMPOHdrPtr = pJpegBuff;
2589*53ee8cc1Swenshuai.xi
2590*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2591*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2592*53ee8cc1Swenshuai.xi if (u16Marker != 0x002A)
2593*53ee8cc1Swenshuai.xi return FALSE;
2594*53ee8cc1Swenshuai.xi
2595*53ee8cc1Swenshuai.xi //offset to 1st MPO IFD
2596*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2597*53ee8cc1Swenshuai.xi u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2598*53ee8cc1Swenshuai.xi
2599*53ee8cc1Swenshuai.xi //1st MPO IFD start from here(either MP Index IFD or MP Attribute IFD)
2600*53ee8cc1Swenshuai.xi //Count Info
2601*53ee8cc1Swenshuai.xi pJpegBuff = pMPOHdrPtr + u32Len;
2602*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pJpegBuff, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2603*53ee8cc1Swenshuai.xi
2604*53ee8cc1Swenshuai.xi u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2605*53ee8cc1Swenshuai.xi
2606*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("num of entry = %d\n", u16NumOfEntry);
2607*53ee8cc1Swenshuai.xi
2608*53ee8cc1Swenshuai.xi //MPFVersion
2609*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2610*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2611*53ee8cc1Swenshuai.xi if(u16Marker == JPEG_MPO_TAG_MPF_VERSION)
2612*53ee8cc1Swenshuai.xi {
2613*53ee8cc1Swenshuai.xi pJpegBuff += 12;
2614*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2615*53ee8cc1Swenshuai.xi if(u16Marker == JPEG_MPO_TAG_NUM_OF_IMAGES)
2616*53ee8cc1Swenshuai.xi {
2617*53ee8cc1Swenshuai.xi //It is a MP Index IFD
2618*53ee8cc1Swenshuai.xi //Check number of images
2619*53ee8cc1Swenshuai.xi pJpegBuff += 8;
2620*53ee8cc1Swenshuai.xi u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2621*53ee8cc1Swenshuai.xi
2622*53ee8cc1Swenshuai.xi if(JPEG_MPO_MAX_SUPPORT_IMAGE < u32tmp)
2623*53ee8cc1Swenshuai.xi {
2624*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Not support %ld images in MPO!!\n", u32tmp);
2625*53ee8cc1Swenshuai.xi _stMPOIndex.num_of_image = 0xFFFFFFFF;
2626*53ee8cc1Swenshuai.xi return FALSE;
2627*53ee8cc1Swenshuai.xi }
2628*53ee8cc1Swenshuai.xi
2629*53ee8cc1Swenshuai.xi //Init MPO database
2630*53ee8cc1Swenshuai.xi JPEG_InitMPO();
2631*53ee8cc1Swenshuai.xi
2632*53ee8cc1Swenshuai.xi //start of offset for every individual picture
2633*53ee8cc1Swenshuai.xi _stMPOIndex.start_of_offset = _u32App2MarkerOffset + 8 - MRC_BUFFER_ADDR;
2634*53ee8cc1Swenshuai.xi
2635*53ee8cc1Swenshuai.xi //the numbers of image
2636*53ee8cc1Swenshuai.xi _stMPOIndex.num_of_image = u32tmp;
2637*53ee8cc1Swenshuai.xi
2638*53ee8cc1Swenshuai.xi printf_red("detected _stMPOIndex.num_of_image=0x%lx\n", _stMPOIndex.num_of_image);
2639*53ee8cc1Swenshuai.xi //MP Entry
2640*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2641*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2642*53ee8cc1Swenshuai.xi if(u16Marker != JPEG_MPO_TAG_MP_ENTRY)
2643*53ee8cc1Swenshuai.xi {
2644*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("No MP Entry in MP index IFD!!\n");
2645*53ee8cc1Swenshuai.xi return FALSE;
2646*53ee8cc1Swenshuai.xi }
2647*53ee8cc1Swenshuai.xi
2648*53ee8cc1Swenshuai.xi //offset to next IFD(MP Attribute IFD)
2649*53ee8cc1Swenshuai.xi pJpegBuff = pMPOHdrPtr + 10 + u16NumOfEntry*12;
2650*53ee8cc1Swenshuai.xi u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2651*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("pJpegBuff = %lx, u32Len = %ld\n", (MS_U32)pJpegBuff, u32Len);
2652*53ee8cc1Swenshuai.xi
2653*53ee8cc1Swenshuai.xi //MP Entry Internal Fields
2654*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2655*53ee8cc1Swenshuai.xi for(i = 0; i < _stMPOIndex.num_of_image; i++)
2656*53ee8cc1Swenshuai.xi {
2657*53ee8cc1Swenshuai.xi //Image Attribute
2658*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].attribute = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2659*53ee8cc1Swenshuai.xi //Image size
2660*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2661*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].size = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2662*53ee8cc1Swenshuai.xi //Image size
2663*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2664*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].offset = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2665*53ee8cc1Swenshuai.xi //Image size
2666*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2667*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].image1_no = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2668*53ee8cc1Swenshuai.xi //Image size
2669*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2670*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].image2_no = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2671*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2672*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%d th : attribute = %lx\n", i, _stMPOIndex.mp_entry[i].attribute);
2673*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%d th : size = %lx\n", i, _stMPOIndex.mp_entry[i].size);
2674*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%d th : offset = %lx\n", i, _stMPOIndex.mp_entry[i].offset);
2675*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%d th : image1_no = %x\n", i, _stMPOIndex.mp_entry[i].image1_no);
2676*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%d th : image2_no = %x\n", i, _stMPOIndex.mp_entry[i].image2_no);
2677*53ee8cc1Swenshuai.xi }
2678*53ee8cc1Swenshuai.xi
2679*53ee8cc1Swenshuai.xi //get MPO Attribute count
2680*53ee8cc1Swenshuai.xi pJpegBuff = pMPOHdrPtr + u32Len;
2681*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pJpegBuff, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2682*53ee8cc1Swenshuai.xi
2683*53ee8cc1Swenshuai.xi u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2684*53ee8cc1Swenshuai.xi
2685*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2686*53ee8cc1Swenshuai.xi }
2687*53ee8cc1Swenshuai.xi }
2688*53ee8cc1Swenshuai.xi
2689*53ee8cc1Swenshuai.xi //Decode MP Attr header
2690*53ee8cc1Swenshuai.xi return JPEG_DecodeMPAttrIFD(pJpegBuff, pMPOHdrPtr, u16NumOfEntry);
2691*53ee8cc1Swenshuai.xi }
2692*53ee8cc1Swenshuai.xi
2693*53ee8cc1Swenshuai.xi
2694*53ee8cc1Swenshuai.xi #endif
2695*53ee8cc1Swenshuai.xi
2696*53ee8cc1Swenshuai.xi // Parse APP0 to get X&Y density.
JPEG_read_app0_marker(void)2697*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_read_app0_marker( void )
2698*53ee8cc1Swenshuai.xi {
2699*53ee8cc1Swenshuai.xi
2700*53ee8cc1Swenshuai.xi MS_U32 left;
2701*53ee8cc1Swenshuai.xi MS_U8 u8Xthumbnail, u8Ythumbnail;
2702*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP0\n");
2703*53ee8cc1Swenshuai.xi
2704*53ee8cc1Swenshuai.xi //Get APP0 length
2705*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2706*53ee8cc1Swenshuai.xi
2707*53ee8cc1Swenshuai.xi left-= 2;
2708*53ee8cc1Swenshuai.xi
2709*53ee8cc1Swenshuai.xi if(left < 8)
2710*53ee8cc1Swenshuai.xi {
2711*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP0_MARKER );
2712*53ee8cc1Swenshuai.xi return FALSE;
2713*53ee8cc1Swenshuai.xi }
2714*53ee8cc1Swenshuai.xi
2715*53ee8cc1Swenshuai.xi //Skip Block ID "JFIF"
2716*53ee8cc1Swenshuai.xi JPEG_skip_bytes(5);
2717*53ee8cc1Swenshuai.xi
2718*53ee8cc1Swenshuai.xi left-= 5;
2719*53ee8cc1Swenshuai.xi
2720*53ee8cc1Swenshuai.xi //Skip Version Number
2721*53ee8cc1Swenshuai.xi JPEG_skip_bytes(2);
2722*53ee8cc1Swenshuai.xi
2723*53ee8cc1Swenshuai.xi left-= 2;
2724*53ee8cc1Swenshuai.xi
2725*53ee8cc1Swenshuai.xi //Get units
2726*53ee8cc1Swenshuai.xi App0_Unit_Data.u8Unit = JPEG_get_char();
2727*53ee8cc1Swenshuai.xi App0_Unit_Data.u16Xdensity= (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2728*53ee8cc1Swenshuai.xi App0_Unit_Data.u16Ydensity= (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2729*53ee8cc1Swenshuai.xi
2730*53ee8cc1Swenshuai.xi left-= 5;
2731*53ee8cc1Swenshuai.xi
2732*53ee8cc1Swenshuai.xi //Get thumbnail x,y
2733*53ee8cc1Swenshuai.xi u8Xthumbnail = JPEG_get_char();
2734*53ee8cc1Swenshuai.xi u8Ythumbnail = JPEG_get_char();
2735*53ee8cc1Swenshuai.xi
2736*53ee8cc1Swenshuai.xi left-= 2;
2737*53ee8cc1Swenshuai.xi
2738*53ee8cc1Swenshuai.xi //Skip Version Number
2739*53ee8cc1Swenshuai.xi JPEG_skip_bytes(3*u8Xthumbnail*u8Ythumbnail);
2740*53ee8cc1Swenshuai.xi
2741*53ee8cc1Swenshuai.xi left-= 3*u8Xthumbnail*u8Ythumbnail;
2742*53ee8cc1Swenshuai.xi
2743*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP0 : unit : %d\n",(MS_U16)App0_Unit_Data.u8Unit);
2744*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP0 : Xdensity : %d\n",App0_Unit_Data.u16Xdensity);
2745*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP0 : Ydensity : %d\n",App0_Unit_Data.u16Ydensity);
2746*53ee8cc1Swenshuai.xi
2747*53ee8cc1Swenshuai.xi if(left > 0)
2748*53ee8cc1Swenshuai.xi JPEG_skip_bytes(left);
2749*53ee8cc1Swenshuai.xi
2750*53ee8cc1Swenshuai.xi return TRUE;
2751*53ee8cc1Swenshuai.xi }
2752*53ee8cc1Swenshuai.xi
msAPI_JPEG_get_APP0_info_OJPD(MS_U8 * unit,MS_U16 * x,MS_U16 * y)2753*53ee8cc1Swenshuai.xi void msAPI_JPEG_get_APP0_info_OJPD( MS_U8 *unit, MS_U16 *x, MS_U16 *y )
2754*53ee8cc1Swenshuai.xi {
2755*53ee8cc1Swenshuai.xi *unit = App0_Unit_Data.u8Unit;
2756*53ee8cc1Swenshuai.xi *x = App0_Unit_Data.u16Xdensity;
2757*53ee8cc1Swenshuai.xi *y = App0_Unit_Data.u16Ydensity;
2758*53ee8cc1Swenshuai.xi }
2759*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2760*53ee8cc1Swenshuai.xi // Read exif info
JPEG_read_app1_marker(void)2761*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_app1_marker(void)
2762*53ee8cc1Swenshuai.xi {
2763*53ee8cc1Swenshuai.xi MS_U16 length;
2764*53ee8cc1Swenshuai.xi MS_U8 *exif_buffer = (MS_U8 *) INTERNAL_BUFFER_ADDR;
2765*53ee8cc1Swenshuai.xi MS_U16 i = 0;
2766*53ee8cc1Swenshuai.xi
2767*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP1\n");
2768*53ee8cc1Swenshuai.xi
2769*53ee8cc1Swenshuai.xi length = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2770*53ee8cc1Swenshuai.xi
2771*53ee8cc1Swenshuai.xi if ( length < 2 )
2772*53ee8cc1Swenshuai.xi {
2773*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
2774*53ee8cc1Swenshuai.xi return FALSE;
2775*53ee8cc1Swenshuai.xi }
2776*53ee8cc1Swenshuai.xi
2777*53ee8cc1Swenshuai.xi length -= 2;
2778*53ee8cc1Swenshuai.xi
2779*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
2780*53ee8cc1Swenshuai.xi u32MPFOffset = length;
2781*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("u32MPFOffset=0x%lx\n", u32MPFOffset);
2782*53ee8cc1Swenshuai.xi #endif
2783*53ee8cc1Swenshuai.xi while((length - i)!=0)
2784*53ee8cc1Swenshuai.xi {
2785*53ee8cc1Swenshuai.xi exif_buffer[i] = (MS_U8) JPEG_get_char();
2786*53ee8cc1Swenshuai.xi i++;
2787*53ee8cc1Swenshuai.xi }
2788*53ee8cc1Swenshuai.xi
2789*53ee8cc1Swenshuai.xi if(JPEG_DecodeExifInfo(exif_buffer, length) == TRUE)
2790*53ee8cc1Swenshuai.xi {
2791*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FOUND THUMBNAIL!\n");
2792*53ee8cc1Swenshuai.xi _u32ThumbnailBufferOffset = _u32ThumbnailOffset;
2793*53ee8cc1Swenshuai.xi _u16ThumbnailBufferSize = _u16ThumbnailSize;
2794*53ee8cc1Swenshuai.xi }
2795*53ee8cc1Swenshuai.xi else
2796*53ee8cc1Swenshuai.xi {
2797*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("NO THUMBNAIL!\n");
2798*53ee8cc1Swenshuai.xi }
2799*53ee8cc1Swenshuai.xi return TRUE;
2800*53ee8cc1Swenshuai.xi }
2801*53ee8cc1Swenshuai.xi
2802*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
2803*53ee8cc1Swenshuai.xi
2804*53ee8cc1Swenshuai.xi // Read exif app2 info
JPEG_read_app2_marker(void)2805*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_read_app2_marker( void )
2806*53ee8cc1Swenshuai.xi {
2807*53ee8cc1Swenshuai.xi MS_U16 length;
2808*53ee8cc1Swenshuai.xi MS_U8 *exif_buffer = (MS_U8 *) (INTERNAL_BUFFER_ADDR + u32MPFOffset);
2809*53ee8cc1Swenshuai.xi MS_U16 i = 0;
2810*53ee8cc1Swenshuai.xi
2811*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP2\n");
2812*53ee8cc1Swenshuai.xi
2813*53ee8cc1Swenshuai.xi //For start of offset of MPO(only for first MPO picture)
2814*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_pu8In_buf_ofs = %lx\n", (MS_U32)_pu8In_buf_ofs);
2815*53ee8cc1Swenshuai.xi _u32App2MarkerOffset = (MS_U32)_pu8In_buf_ofs - 2;
2816*53ee8cc1Swenshuai.xi
2817*53ee8cc1Swenshuai.xi length = (MS_U16)((JPEG_get_char()<<8)+JPEG_get_char());
2818*53ee8cc1Swenshuai.xi
2819*53ee8cc1Swenshuai.xi if ( length < 2 )
2820*53ee8cc1Swenshuai.xi {
2821*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP2_MARKER );
2822*53ee8cc1Swenshuai.xi return FALSE;
2823*53ee8cc1Swenshuai.xi }
2824*53ee8cc1Swenshuai.xi
2825*53ee8cc1Swenshuai.xi length -= 2;
2826*53ee8cc1Swenshuai.xi
2827*53ee8cc1Swenshuai.xi if(length > INTERNAL_BUFFER_SIZE - u32MPFOffset)
2828*53ee8cc1Swenshuai.xi {
2829*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOTENOUGHMEM );
2830*53ee8cc1Swenshuai.xi return FALSE;
2831*53ee8cc1Swenshuai.xi }
2832*53ee8cc1Swenshuai.xi
2833*53ee8cc1Swenshuai.xi while((length - i)!=0)
2834*53ee8cc1Swenshuai.xi {
2835*53ee8cc1Swenshuai.xi exif_buffer[i] = (MS_U8) JPEG_get_char();
2836*53ee8cc1Swenshuai.xi i++;
2837*53ee8cc1Swenshuai.xi }
2838*53ee8cc1Swenshuai.xi
2839*53ee8cc1Swenshuai.xi if(JPEG_DecodeMPOInfo(exif_buffer)==TRUE)
2840*53ee8cc1Swenshuai.xi {
2841*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FOUND MPO!\n");
2842*53ee8cc1Swenshuai.xi bIsMPOFormat = TRUE;
2843*53ee8cc1Swenshuai.xi u32MPFOffset = 0; // Reset to zero after FOUND MPO
2844*53ee8cc1Swenshuai.xi
2845*53ee8cc1Swenshuai.xi //// TODO: MPO format not support thumbnail now....
2846*53ee8cc1Swenshuai.xi //_u8DecodeType = E_JPEG_TYPE_MAIN;
2847*53ee8cc1Swenshuai.xi //printf_red("NOTE: MPO not support thumbnail now!!!\n");
2848*53ee8cc1Swenshuai.xi }
2849*53ee8cc1Swenshuai.xi else
2850*53ee8cc1Swenshuai.xi {
2851*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("NO MPO!\n");
2852*53ee8cc1Swenshuai.xi // Not clear num_of_image for the image with 2 app2 marker
2853*53ee8cc1Swenshuai.xi //_stMPOIndex.num_of_image = 0;
2854*53ee8cc1Swenshuai.xi }
2855*53ee8cc1Swenshuai.xi return TRUE;
2856*53ee8cc1Swenshuai.xi }
2857*53ee8cc1Swenshuai.xi
2858*53ee8cc1Swenshuai.xi
2859*53ee8cc1Swenshuai.xi #endif
2860*53ee8cc1Swenshuai.xi
2861*53ee8cc1Swenshuai.xi // Read app14 info
JPEG_read_app14_marker(void)2862*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_read_app14_marker( void )
2863*53ee8cc1Swenshuai.xi {
2864*53ee8cc1Swenshuai.xi
2865*53ee8cc1Swenshuai.xi MS_U32 left;
2866*53ee8cc1Swenshuai.xi MS_U8 u8Transform;
2867*53ee8cc1Swenshuai.xi
2868*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP14\n");
2869*53ee8cc1Swenshuai.xi
2870*53ee8cc1Swenshuai.xi //Get APP14 length
2871*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2872*53ee8cc1Swenshuai.xi
2873*53ee8cc1Swenshuai.xi left-= 2;
2874*53ee8cc1Swenshuai.xi
2875*53ee8cc1Swenshuai.xi if(left < 8)
2876*53ee8cc1Swenshuai.xi {
2877*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP0_MARKER );
2878*53ee8cc1Swenshuai.xi return FALSE;
2879*53ee8cc1Swenshuai.xi }
2880*53ee8cc1Swenshuai.xi
2881*53ee8cc1Swenshuai.xi //Skip Block ID "Adobe"
2882*53ee8cc1Swenshuai.xi JPEG_skip_bytes(5);
2883*53ee8cc1Swenshuai.xi
2884*53ee8cc1Swenshuai.xi left-= 5;
2885*53ee8cc1Swenshuai.xi
2886*53ee8cc1Swenshuai.xi //Skip Version Number
2887*53ee8cc1Swenshuai.xi JPEG_skip_bytes(2);
2888*53ee8cc1Swenshuai.xi
2889*53ee8cc1Swenshuai.xi left-= 2;
2890*53ee8cc1Swenshuai.xi
2891*53ee8cc1Swenshuai.xi //Skip F0 Number
2892*53ee8cc1Swenshuai.xi JPEG_skip_bytes(2);
2893*53ee8cc1Swenshuai.xi
2894*53ee8cc1Swenshuai.xi left-= 2;
2895*53ee8cc1Swenshuai.xi
2896*53ee8cc1Swenshuai.xi //Skip F1 Number
2897*53ee8cc1Swenshuai.xi JPEG_skip_bytes(2);
2898*53ee8cc1Swenshuai.xi
2899*53ee8cc1Swenshuai.xi left-= 2;
2900*53ee8cc1Swenshuai.xi
2901*53ee8cc1Swenshuai.xi u8Transform= JPEG_get_char();
2902*53ee8cc1Swenshuai.xi
2903*53ee8cc1Swenshuai.xi left-= 1;
2904*53ee8cc1Swenshuai.xi
2905*53ee8cc1Swenshuai.xi if(u8Transform!=1)
2906*53ee8cc1Swenshuai.xi {
2907*53ee8cc1Swenshuai.xi // 0: RGB or CMYK, depends on SOF
2908*53ee8cc1Swenshuai.xi // 1: YCbCr
2909*53ee8cc1Swenshuai.xi // 2: YCCK
2910*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Unsupported Adobe Format with Transform=%d\n", u8Transform);
2911*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
2912*53ee8cc1Swenshuai.xi return FALSE;
2913*53ee8cc1Swenshuai.xi }
2914*53ee8cc1Swenshuai.xi
2915*53ee8cc1Swenshuai.xi if(left > 0)
2916*53ee8cc1Swenshuai.xi JPEG_skip_bytes(left);
2917*53ee8cc1Swenshuai.xi
2918*53ee8cc1Swenshuai.xi return TRUE;
2919*53ee8cc1Swenshuai.xi }
2920*53ee8cc1Swenshuai.xi
2921*53ee8cc1Swenshuai.xi /* END OF EXIF PARSING SECTION */
2922*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2923*53ee8cc1Swenshuai.xi // Read a Huffman code table.
JPEG_read_dht_marker(void)2924*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_dht_marker(void)
2925*53ee8cc1Swenshuai.xi {
2926*53ee8cc1Swenshuai.xi MS_U16 i, indextmp, count;
2927*53ee8cc1Swenshuai.xi MS_U32 left;
2928*53ee8cc1Swenshuai.xi MS_U8 u8Huff_num[17];
2929*53ee8cc1Swenshuai.xi MS_U8 u8Huff_val[256];
2930*53ee8cc1Swenshuai.xi
2931*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("DHT\n");
2932*53ee8cc1Swenshuai.xi
2933*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2934*53ee8cc1Swenshuai.xi
2935*53ee8cc1Swenshuai.xi if ( left < 2 )
2936*53ee8cc1Swenshuai.xi {
2937*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DHT_MARKER );
2938*53ee8cc1Swenshuai.xi return FALSE;
2939*53ee8cc1Swenshuai.xi }
2940*53ee8cc1Swenshuai.xi
2941*53ee8cc1Swenshuai.xi left -= 2;
2942*53ee8cc1Swenshuai.xi
2943*53ee8cc1Swenshuai.xi while ( left )
2944*53ee8cc1Swenshuai.xi {
2945*53ee8cc1Swenshuai.xi // set it to zero, initialize
2946*53ee8cc1Swenshuai.xi JPEG_memset((void *)u8Huff_num, 0, 17);
2947*53ee8cc1Swenshuai.xi JPEG_memset((void *)u8Huff_val, 0, 256);
2948*53ee8cc1Swenshuai.xi
2949*53ee8cc1Swenshuai.xi indextmp = JPEG_get_char();
2950*53ee8cc1Swenshuai.xi
2951*53ee8cc1Swenshuai.xi u8Huff_num[0] = 0;
2952*53ee8cc1Swenshuai.xi
2953*53ee8cc1Swenshuai.xi count = 0;
2954*53ee8cc1Swenshuai.xi
2955*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
2956*53ee8cc1Swenshuai.xi {
2957*53ee8cc1Swenshuai.xi u8Huff_num[i] = JPEG_get_char();
2958*53ee8cc1Swenshuai.xi count += u8Huff_num[i];
2959*53ee8cc1Swenshuai.xi }
2960*53ee8cc1Swenshuai.xi
2961*53ee8cc1Swenshuai.xi if ( count > 255 )
2962*53ee8cc1Swenshuai.xi {
2963*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DHT_COUNTS );
2964*53ee8cc1Swenshuai.xi return FALSE;
2965*53ee8cc1Swenshuai.xi }
2966*53ee8cc1Swenshuai.xi
2967*53ee8cc1Swenshuai.xi for ( i = 0; i < count; i++ )
2968*53ee8cc1Swenshuai.xi {
2969*53ee8cc1Swenshuai.xi u8Huff_val[i] = JPEG_get_char();
2970*53ee8cc1Swenshuai.xi }
2971*53ee8cc1Swenshuai.xi
2972*53ee8cc1Swenshuai.xi i = 1 + 16 + count;
2973*53ee8cc1Swenshuai.xi
2974*53ee8cc1Swenshuai.xi if ( left < ( MS_U32 )i )
2975*53ee8cc1Swenshuai.xi {
2976*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DHT_MARKER );
2977*53ee8cc1Swenshuai.xi return FALSE;
2978*53ee8cc1Swenshuai.xi }
2979*53ee8cc1Swenshuai.xi
2980*53ee8cc1Swenshuai.xi left -= i;
2981*53ee8cc1Swenshuai.xi
2982*53ee8cc1Swenshuai.xi indextmp = ( indextmp & 0x0F ) + ( ( indextmp & 0x10 ) >> 4 ) * ( JPEG_MAXHUFFTABLES >> 1 ); //???
2983*53ee8cc1Swenshuai.xi
2984*53ee8cc1Swenshuai.xi if ( indextmp >= JPEG_MAXHUFFTABLES )
2985*53ee8cc1Swenshuai.xi {
2986*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DHT_INDEX );
2987*53ee8cc1Swenshuai.xi return FALSE;
2988*53ee8cc1Swenshuai.xi }
2989*53ee8cc1Swenshuai.xi
2990*53ee8cc1Swenshuai.xi if(_Huff_info[indextmp].bValid==FALSE)
2991*53ee8cc1Swenshuai.xi _Huff_info[indextmp].bValid = TRUE;
2992*53ee8cc1Swenshuai.xi
2993*53ee8cc1Swenshuai.xi JPEG_memcpy( (void *)_Huff_info[indextmp].u8Huff_num, (void *)u8Huff_num, 17 );
2994*53ee8cc1Swenshuai.xi JPEG_memcpy( (void *)_Huff_info[indextmp].u8Huff_val, (void *)u8Huff_val, 256 );
2995*53ee8cc1Swenshuai.xi
2996*53ee8cc1Swenshuai.xi // Compute the inverse order of HuffNum. this step is only needed in JPD mode (baseline)
2997*53ee8cc1Swenshuai.xi for(i = 1; i<=16; i++)
2998*53ee8cc1Swenshuai.xi {
2999*53ee8cc1Swenshuai.xi if(u8Huff_num[17 - i]!=0)
3000*53ee8cc1Swenshuai.xi {
3001*53ee8cc1Swenshuai.xi count = count - u8Huff_num[17 - i];
3002*53ee8cc1Swenshuai.xi u8Huff_num[17 - i] = count;
3003*53ee8cc1Swenshuai.xi }
3004*53ee8cc1Swenshuai.xi else
3005*53ee8cc1Swenshuai.xi u8Huff_num[17 - i] = 0xFF;
3006*53ee8cc1Swenshuai.xi }
3007*53ee8cc1Swenshuai.xi JPEG_memcpy( (void *)_Huff_info[indextmp].u8Symbol, (void *)u8Huff_num, 17 );
3008*53ee8cc1Swenshuai.xi }
3009*53ee8cc1Swenshuai.xi return TRUE;
3010*53ee8cc1Swenshuai.xi }
3011*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3012*53ee8cc1Swenshuai.xi // Read a quantization table.
JPEG_read_dqt_marker(void)3013*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_dqt_marker(void)
3014*53ee8cc1Swenshuai.xi {
3015*53ee8cc1Swenshuai.xi MS_U16 n, i, prec;
3016*53ee8cc1Swenshuai.xi MS_U32 left;
3017*53ee8cc1Swenshuai.xi MS_U32 temp;
3018*53ee8cc1Swenshuai.xi
3019*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("DQT\n");
3020*53ee8cc1Swenshuai.xi
3021*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3022*53ee8cc1Swenshuai.xi
3023*53ee8cc1Swenshuai.xi if ( left < 2 )
3024*53ee8cc1Swenshuai.xi {
3025*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DQT_MARKER );
3026*53ee8cc1Swenshuai.xi return FALSE;
3027*53ee8cc1Swenshuai.xi }
3028*53ee8cc1Swenshuai.xi
3029*53ee8cc1Swenshuai.xi left -= 2;
3030*53ee8cc1Swenshuai.xi
3031*53ee8cc1Swenshuai.xi while ( left )
3032*53ee8cc1Swenshuai.xi {
3033*53ee8cc1Swenshuai.xi n = JPEG_get_char();
3034*53ee8cc1Swenshuai.xi prec = n >> 4;
3035*53ee8cc1Swenshuai.xi n &= 0x0F;
3036*53ee8cc1Swenshuai.xi
3037*53ee8cc1Swenshuai.xi if ( n >= JPEG_MAXQUANTTABLES )
3038*53ee8cc1Swenshuai.xi {
3039*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DQT_TABLE );
3040*53ee8cc1Swenshuai.xi return FALSE;
3041*53ee8cc1Swenshuai.xi }
3042*53ee8cc1Swenshuai.xi
3043*53ee8cc1Swenshuai.xi if(_QuantTables[n].bValid == FALSE)
3044*53ee8cc1Swenshuai.xi _QuantTables[n].bValid = TRUE;
3045*53ee8cc1Swenshuai.xi
3046*53ee8cc1Swenshuai.xi // read quantization entries, in zag order
3047*53ee8cc1Swenshuai.xi for ( i = 0; i < 64; i++ )
3048*53ee8cc1Swenshuai.xi {
3049*53ee8cc1Swenshuai.xi temp = JPEG_get_char();
3050*53ee8cc1Swenshuai.xi
3051*53ee8cc1Swenshuai.xi if ( prec )
3052*53ee8cc1Swenshuai.xi {
3053*53ee8cc1Swenshuai.xi temp = ( temp << 8 ) + JPEG_get_char();
3054*53ee8cc1Swenshuai.xi }
3055*53ee8cc1Swenshuai.xi
3056*53ee8cc1Swenshuai.xi _QuantTables[n].s16Value[i] = temp;
3057*53ee8cc1Swenshuai.xi }
3058*53ee8cc1Swenshuai.xi
3059*53ee8cc1Swenshuai.xi i = 64 + 1;
3060*53ee8cc1Swenshuai.xi
3061*53ee8cc1Swenshuai.xi if ( prec )
3062*53ee8cc1Swenshuai.xi {
3063*53ee8cc1Swenshuai.xi i += 64;
3064*53ee8cc1Swenshuai.xi }
3065*53ee8cc1Swenshuai.xi
3066*53ee8cc1Swenshuai.xi if ( left < ( MS_U32 )i )
3067*53ee8cc1Swenshuai.xi {
3068*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DQT_LENGTH );
3069*53ee8cc1Swenshuai.xi return FALSE;
3070*53ee8cc1Swenshuai.xi }
3071*53ee8cc1Swenshuai.xi
3072*53ee8cc1Swenshuai.xi left -= i;
3073*53ee8cc1Swenshuai.xi }
3074*53ee8cc1Swenshuai.xi return TRUE;
3075*53ee8cc1Swenshuai.xi }
3076*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3077*53ee8cc1Swenshuai.xi // Read the start of frame (SOF) marker.
JPEG_read_sof_marker(void)3078*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_sof_marker(void)
3079*53ee8cc1Swenshuai.xi {
3080*53ee8cc1Swenshuai.xi MS_U8 i;
3081*53ee8cc1Swenshuai.xi MS_U32 left;
3082*53ee8cc1Swenshuai.xi MS_U16 JpegMaxWidth, JpegMaxHeight;
3083*53ee8cc1Swenshuai.xi MS_U8 c1;
3084*53ee8cc1Swenshuai.xi
3085*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("SOF\n");
3086*53ee8cc1Swenshuai.xi
3087*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3088*53ee8cc1Swenshuai.xi
3089*53ee8cc1Swenshuai.xi if ( JPEG_get_char() != 8 ) /* precision: sorry, only 8-bit precision is supported right now */
3090*53ee8cc1Swenshuai.xi {
3091*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_PRECISION );
3092*53ee8cc1Swenshuai.xi return FALSE;
3093*53ee8cc1Swenshuai.xi }
3094*53ee8cc1Swenshuai.xi
3095*53ee8cc1Swenshuai.xi _u16Image_y_size = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3096*53ee8cc1Swenshuai.xi _u16Image_x_size = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3097*53ee8cc1Swenshuai.xi
3098*53ee8cc1Swenshuai.xi // save the original image size
3099*53ee8cc1Swenshuai.xi _u16OriginalImage_x_size = _u16Image_x_size;
3100*53ee8cc1Swenshuai.xi _u16OriginalImage_y_size = _u16Image_y_size;
3101*53ee8cc1Swenshuai.xi
3102*53ee8cc1Swenshuai.xi if((_bProgressive_flag)
3103*53ee8cc1Swenshuai.xi && (E_JPEG_TYPE_MAIN == _u8DecodeType))
3104*53ee8cc1Swenshuai.xi {
3105*53ee8cc1Swenshuai.xi //Define MAX picture size for progressive, 8 is the max factor of scale down
3106*53ee8cc1Swenshuai.xi JpegMaxWidth = JPEG_PRO_MAX_WIDTH * 8;
3107*53ee8cc1Swenshuai.xi JpegMaxHeight = JPEG_PRO_MAX_HEIGHT * 8;
3108*53ee8cc1Swenshuai.xi
3109*53ee8cc1Swenshuai.xi //Calculate Internal Buffer size
3110*53ee8cc1Swenshuai.xi //check needed buffer for progressive jpeg decoding, for worst case:
3111*53ee8cc1Swenshuai.xi MS_U32 buff_size = _u16Image_x_size*_u16Image_y_size*3*2
3112*53ee8cc1Swenshuai.xi + _u16Image_x_size*_u16Image_y_size*3*2/64
3113*53ee8cc1Swenshuai.xi + JPEG_DEFAULT_EXIF_SIZE
3114*53ee8cc1Swenshuai.xi + 8*1024;
3115*53ee8cc1Swenshuai.xi // if( (MS_U32)(_u16Image_x_size*_u16Image_y_size*3*2) > (MS_U32)(INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE) )
3116*53ee8cc1Swenshuai.xi if( buff_size > INTERNAL_BUFFER_SIZE )
3117*53ee8cc1Swenshuai.xi {
3118*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Progressive image size too big... do not handle it\n");
3119*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOTENOUGHMEM );
3120*53ee8cc1Swenshuai.xi return FALSE;
3121*53ee8cc1Swenshuai.xi }
3122*53ee8cc1Swenshuai.xi }
3123*53ee8cc1Swenshuai.xi else
3124*53ee8cc1Swenshuai.xi {
3125*53ee8cc1Swenshuai.xi //Define MAX picture size for Baseline, 8 is the max factor of scale down
3126*53ee8cc1Swenshuai.xi JpegMaxWidth = JPEG_MAX_WIDTH*8;
3127*53ee8cc1Swenshuai.xi JpegMaxHeight = JPEG_MAX_HEIGHT*8;
3128*53ee8cc1Swenshuai.xi }
3129*53ee8cc1Swenshuai.xi
3130*53ee8cc1Swenshuai.xi if ((_u16Image_y_size < 1) || (_u16Image_y_size > JpegMaxHeight))
3131*53ee8cc1Swenshuai.xi {
3132*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_BAD_HEIGHT);
3133*53ee8cc1Swenshuai.xi return FALSE;
3134*53ee8cc1Swenshuai.xi }
3135*53ee8cc1Swenshuai.xi
3136*53ee8cc1Swenshuai.xi if ((_u16Image_x_size < 1) || (_u16Image_x_size > JpegMaxWidth))
3137*53ee8cc1Swenshuai.xi {
3138*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_BAD_WIDTH);
3139*53ee8cc1Swenshuai.xi return FALSE;
3140*53ee8cc1Swenshuai.xi }
3141*53ee8cc1Swenshuai.xi
3142*53ee8cc1Swenshuai.xi _u8Comps_in_frame = JPEG_get_char();
3143*53ee8cc1Swenshuai.xi
3144*53ee8cc1Swenshuai.xi if ( _u8Comps_in_frame > JPEG_MAXCOMPONENTS )
3145*53ee8cc1Swenshuai.xi {
3146*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_TOO_MANY_COMPONENTS );
3147*53ee8cc1Swenshuai.xi return FALSE;
3148*53ee8cc1Swenshuai.xi }
3149*53ee8cc1Swenshuai.xi
3150*53ee8cc1Swenshuai.xi if ( left != ( MS_U32 )( _u8Comps_in_frame * 3 + 8 ) )
3151*53ee8cc1Swenshuai.xi {
3152*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOF_LENGTH );
3153*53ee8cc1Swenshuai.xi return FALSE;
3154*53ee8cc1Swenshuai.xi }
3155*53ee8cc1Swenshuai.xi
3156*53ee8cc1Swenshuai.xi for ( i = 0; i < _u8Comps_in_frame; i++ )
3157*53ee8cc1Swenshuai.xi {
3158*53ee8cc1Swenshuai.xi _u8Comp_ident[i] = JPEG_get_char();
3159*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
3160*53ee8cc1Swenshuai.xi {
3161*53ee8cc1Swenshuai.xi _u8LumaCi = 0;
3162*53ee8cc1Swenshuai.xi _u8ChromaCi = 1;
3163*53ee8cc1Swenshuai.xi _u8Chroma2Ci = 2;
3164*53ee8cc1Swenshuai.xi }
3165*53ee8cc1Swenshuai.xi
3166*53ee8cc1Swenshuai.xi c1 = JPEG_get_char();
3167*53ee8cc1Swenshuai.xi
3168*53ee8cc1Swenshuai.xi _u8Comp_h_samp[i] = (c1 & 0xf0)>>4;
3169*53ee8cc1Swenshuai.xi _u8Comp_v_samp[i] = (c1 & 0x0f);
3170*53ee8cc1Swenshuai.xi _u8Comp_quant[i] = JPEG_get_char();
3171*53ee8cc1Swenshuai.xi
3172*53ee8cc1Swenshuai.xi // patch from LG driver for the file with the following problem:
3173*53ee8cc1Swenshuai.xi // only has one component, but its sampling factor is 1x2
3174*53ee8cc1Swenshuai.xi // Per the JPEG spec A.2.2 (see the attached file, "regardless of the values of H1 and V1"),
3175*53ee8cc1Swenshuai.xi // please always set H=1 & V=1 to hw, when mono image.
3176*53ee8cc1Swenshuai.xi if(_u8Comps_in_frame==1) //allen.chang 2011/6/16 patch
3177*53ee8cc1Swenshuai.xi {
3178*53ee8cc1Swenshuai.xi _u8Comp_h_samp[0] =1;
3179*53ee8cc1Swenshuai.xi _u8Comp_v_samp[0] =1;
3180*53ee8cc1Swenshuai.xi }
3181*53ee8cc1Swenshuai.xi
3182*53ee8cc1Swenshuai.xi }
3183*53ee8cc1Swenshuai.xi return TRUE;
3184*53ee8cc1Swenshuai.xi }
3185*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3186*53ee8cc1Swenshuai.xi // Used to skip unrecognized markers.
JPEG_skip_variable_marker(void)3187*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_skip_variable_marker(void)
3188*53ee8cc1Swenshuai.xi {
3189*53ee8cc1Swenshuai.xi MS_U32 left;
3190*53ee8cc1Swenshuai.xi
3191*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("SKIP markers\n");
3192*53ee8cc1Swenshuai.xi
3193*53ee8cc1Swenshuai.xi left = (MS_U32)((JPEG_get_char()<<8)|JPEG_get_char());
3194*53ee8cc1Swenshuai.xi
3195*53ee8cc1Swenshuai.xi if ( left < 2 )
3196*53ee8cc1Swenshuai.xi {
3197*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_VARIABLE_MARKER );
3198*53ee8cc1Swenshuai.xi return FALSE;
3199*53ee8cc1Swenshuai.xi }
3200*53ee8cc1Swenshuai.xi
3201*53ee8cc1Swenshuai.xi left -= 2;
3202*53ee8cc1Swenshuai.xi
3203*53ee8cc1Swenshuai.xi JPEG_skip_bytes(left);
3204*53ee8cc1Swenshuai.xi return TRUE;
3205*53ee8cc1Swenshuai.xi }
3206*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3207*53ee8cc1Swenshuai.xi // Read a define restart interval (DRI) marker.
JPEG_read_dri_marker(void)3208*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_dri_marker(void)
3209*53ee8cc1Swenshuai.xi {
3210*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("DRI\n");
3211*53ee8cc1Swenshuai.xi
3212*53ee8cc1Swenshuai.xi if ( (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char()) != 4 )
3213*53ee8cc1Swenshuai.xi {
3214*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DRI_LENGTH );
3215*53ee8cc1Swenshuai.xi return FALSE;
3216*53ee8cc1Swenshuai.xi }
3217*53ee8cc1Swenshuai.xi
3218*53ee8cc1Swenshuai.xi _u16Restart_interval = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3219*53ee8cc1Swenshuai.xi return TRUE;
3220*53ee8cc1Swenshuai.xi }
3221*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3222*53ee8cc1Swenshuai.xi // Read a start of scan (SOS) marker.
JPEG_read_sos_marker(void)3223*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_sos_marker(void)
3224*53ee8cc1Swenshuai.xi {
3225*53ee8cc1Swenshuai.xi MS_U32 left;
3226*53ee8cc1Swenshuai.xi MS_U16 i, ci, n, c, cc;
3227*53ee8cc1Swenshuai.xi MS_U8 c1;
3228*53ee8cc1Swenshuai.xi
3229*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("SOS\n");
3230*53ee8cc1Swenshuai.xi
3231*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3232*53ee8cc1Swenshuai.xi
3233*53ee8cc1Swenshuai.xi n = JPEG_get_char();
3234*53ee8cc1Swenshuai.xi
3235*53ee8cc1Swenshuai.xi _u8Comps_in_scan = n;
3236*53ee8cc1Swenshuai.xi
3237*53ee8cc1Swenshuai.xi left -= 3;
3238*53ee8cc1Swenshuai.xi
3239*53ee8cc1Swenshuai.xi if ( ( left != ( MS_U32 )( n * 2 + 3 ) ) || ( n < 1 ) || ( n > JPEG_MAXCOMPSINSCAN ) )
3240*53ee8cc1Swenshuai.xi {
3241*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_LENGTH );
3242*53ee8cc1Swenshuai.xi return FALSE;
3243*53ee8cc1Swenshuai.xi }
3244*53ee8cc1Swenshuai.xi
3245*53ee8cc1Swenshuai.xi for ( i = 0; i < n; i++ )
3246*53ee8cc1Swenshuai.xi {
3247*53ee8cc1Swenshuai.xi cc = JPEG_get_char();
3248*53ee8cc1Swenshuai.xi c = JPEG_get_char();
3249*53ee8cc1Swenshuai.xi left -= 2;
3250*53ee8cc1Swenshuai.xi
3251*53ee8cc1Swenshuai.xi for ( ci = 0; ci < _u8Comps_in_frame; ci++ )
3252*53ee8cc1Swenshuai.xi {
3253*53ee8cc1Swenshuai.xi if ( cc == _u8Comp_ident[ci] )
3254*53ee8cc1Swenshuai.xi {
3255*53ee8cc1Swenshuai.xi break;
3256*53ee8cc1Swenshuai.xi }
3257*53ee8cc1Swenshuai.xi }
3258*53ee8cc1Swenshuai.xi
3259*53ee8cc1Swenshuai.xi if ( ci >= _u8Comps_in_frame )
3260*53ee8cc1Swenshuai.xi {
3261*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_COMP_ID );
3262*53ee8cc1Swenshuai.xi return FALSE;
3263*53ee8cc1Swenshuai.xi }
3264*53ee8cc1Swenshuai.xi
3265*53ee8cc1Swenshuai.xi _u8Comp_list[i] = ci;
3266*53ee8cc1Swenshuai.xi _u8Comp_dc_tab[ci] = ( c >> 4 ) & 15;
3267*53ee8cc1Swenshuai.xi _u8Comp_ac_tab[ci] = ( c & 15 ) + ( JPEG_MAXHUFFTABLES >> 1 );
3268*53ee8cc1Swenshuai.xi }
3269*53ee8cc1Swenshuai.xi
3270*53ee8cc1Swenshuai.xi #ifndef CMODEL
3271*53ee8cc1Swenshuai.xi //HW limitation, for baseline JPEG, U.V need to refer to the same DC and AC huffman table.
3272*53ee8cc1Swenshuai.xi if(!_bProgressive_flag && (_u8Comps_in_frame == 3)) //Y.U.V.
3273*53ee8cc1Swenshuai.xi {
3274*53ee8cc1Swenshuai.xi if((_u8Comp_dc_tab[1] != _u8Comp_dc_tab[2])
3275*53ee8cc1Swenshuai.xi || (_u8Comp_ac_tab[1] != _u8Comp_ac_tab[2]))
3276*53ee8cc1Swenshuai.xi {
3277*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==TRUE)
3278*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("U, V use different Huffman table~~\n");
3279*53ee8cc1Swenshuai.xi bIs3HuffTbl = TRUE;
3280*53ee8cc1Swenshuai.xi #else
3281*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_HUFF_DECODE );
3282*53ee8cc1Swenshuai.xi return FALSE;
3283*53ee8cc1Swenshuai.xi #endif
3284*53ee8cc1Swenshuai.xi }
3285*53ee8cc1Swenshuai.xi }
3286*53ee8cc1Swenshuai.xi #endif
3287*53ee8cc1Swenshuai.xi
3288*53ee8cc1Swenshuai.xi _u8Spectral_start = JPEG_get_char();
3289*53ee8cc1Swenshuai.xi _u8Spectral_end = JPEG_get_char();
3290*53ee8cc1Swenshuai.xi c1 = JPEG_get_char();
3291*53ee8cc1Swenshuai.xi _u8Successive_high = (c1 & 0xf0)>>4;
3292*53ee8cc1Swenshuai.xi _u8Successive_low = (c1 & 0x0f);
3293*53ee8cc1Swenshuai.xi
3294*53ee8cc1Swenshuai.xi if ( !_bProgressive_flag )
3295*53ee8cc1Swenshuai.xi {
3296*53ee8cc1Swenshuai.xi _u8Spectral_start = 0;
3297*53ee8cc1Swenshuai.xi _u8Spectral_end = 63;
3298*53ee8cc1Swenshuai.xi }
3299*53ee8cc1Swenshuai.xi
3300*53ee8cc1Swenshuai.xi left -= 3;
3301*53ee8cc1Swenshuai.xi
3302*53ee8cc1Swenshuai.xi JPEG_skip_bytes(left); /* read past whatever is left */
3303*53ee8cc1Swenshuai.xi return TRUE;
3304*53ee8cc1Swenshuai.xi }
3305*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3306*53ee8cc1Swenshuai.xi // Finds the next marker.
JPEG_next_marker(void)3307*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_next_marker(void) //ok
3308*53ee8cc1Swenshuai.xi {
3309*53ee8cc1Swenshuai.xi MS_U32 c, bytes;
3310*53ee8cc1Swenshuai.xi
3311*53ee8cc1Swenshuai.xi bytes = 0;
3312*53ee8cc1Swenshuai.xi
3313*53ee8cc1Swenshuai.xi do
3314*53ee8cc1Swenshuai.xi {
3315*53ee8cc1Swenshuai.xi do
3316*53ee8cc1Swenshuai.xi {
3317*53ee8cc1Swenshuai.xi bytes++;
3318*53ee8cc1Swenshuai.xi
3319*53ee8cc1Swenshuai.xi c = JPEG_get_char();
3320*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("c = %X\n",c);
3321*53ee8cc1Swenshuai.xi }
3322*53ee8cc1Swenshuai.xi while ( c != 0xFF );
3323*53ee8cc1Swenshuai.xi
3324*53ee8cc1Swenshuai.xi do
3325*53ee8cc1Swenshuai.xi {
3326*53ee8cc1Swenshuai.xi c = JPEG_get_char();
3327*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("c = %X\n",c);
3328*53ee8cc1Swenshuai.xi }
3329*53ee8cc1Swenshuai.xi while ( c == 0xFF );
3330*53ee8cc1Swenshuai.xi }
3331*53ee8cc1Swenshuai.xi while ( c == 0 );
3332*53ee8cc1Swenshuai.xi
3333*53ee8cc1Swenshuai.xi // If bytes > 0 here, there where extra bytes before the marker (not good).
3334*53ee8cc1Swenshuai.xi
3335*53ee8cc1Swenshuai.xi return c;
3336*53ee8cc1Swenshuai.xi }
3337*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3338*53ee8cc1Swenshuai.xi // Process markers. Returns when an SOFx, SOI, EOI, or SOS marker is
3339*53ee8cc1Swenshuai.xi // encountered.
JPEG_process_markers(void)3340*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_process_markers(void)
3341*53ee8cc1Swenshuai.xi {
3342*53ee8cc1Swenshuai.xi MS_U32 c;
3343*53ee8cc1Swenshuai.xi
3344*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_process_markers:\n");
3345*53ee8cc1Swenshuai.xi for ( ; ; )
3346*53ee8cc1Swenshuai.xi {
3347*53ee8cc1Swenshuai.xi c = JPEG_next_marker();
3348*53ee8cc1Swenshuai.xi
3349*53ee8cc1Swenshuai.xi switch ( c )
3350*53ee8cc1Swenshuai.xi {
3351*53ee8cc1Swenshuai.xi case E_JPEG_APP1:
3352*53ee8cc1Swenshuai.xi // Prevent from there's thumbnail in thumbnail... & multiple APP1
3353*53ee8cc1Swenshuai.xi // Although it's impossible.. =_=
3354*53ee8cc1Swenshuai.xi // if((E_JPEG_TYPE_THUMBNAIL == _u8DecodeType)
3355*53ee8cc1Swenshuai.xi // && (FALSE == _bThumbnailFound))
3356*53ee8cc1Swenshuai.xi // We need to get EXIF info for decoding main picture or thumbnail.
3357*53ee8cc1Swenshuai.xi if((__bIsMjpeg == FALSE)
3358*53ee8cc1Swenshuai.xi && (FALSE == _bThumbnailFound))
3359*53ee8cc1Swenshuai.xi {
3360*53ee8cc1Swenshuai.xi if( !JPEG_read_app1_marker() )
3361*53ee8cc1Swenshuai.xi return FALSE;
3362*53ee8cc1Swenshuai.xi }
3363*53ee8cc1Swenshuai.xi else
3364*53ee8cc1Swenshuai.xi {
3365*53ee8cc1Swenshuai.xi if( !JPEG_skip_variable_marker() )
3366*53ee8cc1Swenshuai.xi return FALSE;
3367*53ee8cc1Swenshuai.xi }
3368*53ee8cc1Swenshuai.xi break;
3369*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
3370*53ee8cc1Swenshuai.xi case E_JPEG_APP2:
3371*53ee8cc1Swenshuai.xi if( !JPEG_read_app2_marker() )
3372*53ee8cc1Swenshuai.xi return FALSE;
3373*53ee8cc1Swenshuai.xi break;
3374*53ee8cc1Swenshuai.xi
3375*53ee8cc1Swenshuai.xi #endif
3376*53ee8cc1Swenshuai.xi case E_JPEG_SOF0:
3377*53ee8cc1Swenshuai.xi case E_JPEG_SOF1:
3378*53ee8cc1Swenshuai.xi case E_JPEG_SOF2:
3379*53ee8cc1Swenshuai.xi case E_JPEG_SOF3:
3380*53ee8cc1Swenshuai.xi case E_JPEG_SOF5:
3381*53ee8cc1Swenshuai.xi case E_JPEG_SOF6:
3382*53ee8cc1Swenshuai.xi case E_JPEG_SOF7:
3383*53ee8cc1Swenshuai.xi // case E_JPEG_JPG:
3384*53ee8cc1Swenshuai.xi case E_JPEG_SOF9:
3385*53ee8cc1Swenshuai.xi case E_JPEG_SOF10:
3386*53ee8cc1Swenshuai.xi case E_JPEG_SOF11:
3387*53ee8cc1Swenshuai.xi case E_JPEG_SOF13:
3388*53ee8cc1Swenshuai.xi case E_JPEG_SOF14:
3389*53ee8cc1Swenshuai.xi case E_JPEG_SOF15:
3390*53ee8cc1Swenshuai.xi case E_JPEG_SOI:
3391*53ee8cc1Swenshuai.xi case E_JPEG_EOI:
3392*53ee8cc1Swenshuai.xi case E_JPEG_SOS:
3393*53ee8cc1Swenshuai.xi {
3394*53ee8cc1Swenshuai.xi return c;
3395*53ee8cc1Swenshuai.xi }
3396*53ee8cc1Swenshuai.xi case E_JPEG_DHT:
3397*53ee8cc1Swenshuai.xi {
3398*53ee8cc1Swenshuai.xi if( !JPEG_read_dht_marker() )
3399*53ee8cc1Swenshuai.xi return FALSE;
3400*53ee8cc1Swenshuai.xi _HeadCheck.DHT = TRUE;
3401*53ee8cc1Swenshuai.xi break;
3402*53ee8cc1Swenshuai.xi }
3403*53ee8cc1Swenshuai.xi // Sorry, no arithmitic support at this time. Dumb patents!
3404*53ee8cc1Swenshuai.xi case E_JPEG_DAC:
3405*53ee8cc1Swenshuai.xi {
3406*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NO_ARITHMETIC_SUPPORT );
3407*53ee8cc1Swenshuai.xi return FALSE;
3408*53ee8cc1Swenshuai.xi break;
3409*53ee8cc1Swenshuai.xi }
3410*53ee8cc1Swenshuai.xi case E_JPEG_DQT:
3411*53ee8cc1Swenshuai.xi {
3412*53ee8cc1Swenshuai.xi if( !JPEG_read_dqt_marker() )
3413*53ee8cc1Swenshuai.xi return FALSE;
3414*53ee8cc1Swenshuai.xi _HeadCheck.DQT = TRUE;
3415*53ee8cc1Swenshuai.xi break;
3416*53ee8cc1Swenshuai.xi }
3417*53ee8cc1Swenshuai.xi case E_JPEG_DRI:
3418*53ee8cc1Swenshuai.xi {
3419*53ee8cc1Swenshuai.xi if( !JPEG_read_dri_marker() )
3420*53ee8cc1Swenshuai.xi return FALSE;
3421*53ee8cc1Swenshuai.xi break;
3422*53ee8cc1Swenshuai.xi }
3423*53ee8cc1Swenshuai.xi //case E_JPEG_APP0: /* no need to read the JFIF marker */
3424*53ee8cc1Swenshuai.xi
3425*53ee8cc1Swenshuai.xi case E_JPEG_JPG:
3426*53ee8cc1Swenshuai.xi case E_JPEG_RST0:
3427*53ee8cc1Swenshuai.xi /* no parameters */
3428*53ee8cc1Swenshuai.xi case E_JPEG_RST1:
3429*53ee8cc1Swenshuai.xi case E_JPEG_RST2:
3430*53ee8cc1Swenshuai.xi case E_JPEG_RST3:
3431*53ee8cc1Swenshuai.xi case E_JPEG_RST4:
3432*53ee8cc1Swenshuai.xi case E_JPEG_RST5:
3433*53ee8cc1Swenshuai.xi case E_JPEG_RST6:
3434*53ee8cc1Swenshuai.xi case E_JPEG_RST7:
3435*53ee8cc1Swenshuai.xi case E_JPEG_TEM:
3436*53ee8cc1Swenshuai.xi {
3437*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
3438*53ee8cc1Swenshuai.xi return FALSE;
3439*53ee8cc1Swenshuai.xi break;
3440*53ee8cc1Swenshuai.xi }
3441*53ee8cc1Swenshuai.xi case E_JPEG_APP0:
3442*53ee8cc1Swenshuai.xi if (!bMHEG5)
3443*53ee8cc1Swenshuai.xi {
3444*53ee8cc1Swenshuai.xi if(!JPEG_skip_variable_marker())
3445*53ee8cc1Swenshuai.xi {
3446*53ee8cc1Swenshuai.xi return FALSE;
3447*53ee8cc1Swenshuai.xi }
3448*53ee8cc1Swenshuai.xi break;
3449*53ee8cc1Swenshuai.xi }
3450*53ee8cc1Swenshuai.xi if(!JPEG_read_app0_marker())
3451*53ee8cc1Swenshuai.xi {
3452*53ee8cc1Swenshuai.xi return FALSE;
3453*53ee8cc1Swenshuai.xi }
3454*53ee8cc1Swenshuai.xi break;
3455*53ee8cc1Swenshuai.xi case E_JPEG_APP14:
3456*53ee8cc1Swenshuai.xi if(__bIsMjpeg == FALSE)
3457*53ee8cc1Swenshuai.xi {
3458*53ee8cc1Swenshuai.xi if( !JPEG_read_app14_marker() )
3459*53ee8cc1Swenshuai.xi return FALSE;
3460*53ee8cc1Swenshuai.xi }
3461*53ee8cc1Swenshuai.xi else
3462*53ee8cc1Swenshuai.xi {
3463*53ee8cc1Swenshuai.xi if( !JPEG_skip_variable_marker() )
3464*53ee8cc1Swenshuai.xi return FALSE;
3465*53ee8cc1Swenshuai.xi }
3466*53ee8cc1Swenshuai.xi break;
3467*53ee8cc1Swenshuai.xi case E_JPEG_DNL:
3468*53ee8cc1Swenshuai.xi case E_JPEG_DHP:
3469*53ee8cc1Swenshuai.xi case E_JPEG_EXP:
3470*53ee8cc1Swenshuai.xi #if (SUPPORT_MPO_FORMAT == 0)
3471*53ee8cc1Swenshuai.xi case E_JPEG_APP2:
3472*53ee8cc1Swenshuai.xi #endif
3473*53ee8cc1Swenshuai.xi case E_JPEG_APP3:
3474*53ee8cc1Swenshuai.xi case E_JPEG_APP4:
3475*53ee8cc1Swenshuai.xi case E_JPEG_APP5:
3476*53ee8cc1Swenshuai.xi case E_JPEG_APP6:
3477*53ee8cc1Swenshuai.xi case E_JPEG_APP7:
3478*53ee8cc1Swenshuai.xi case E_JPEG_APP8:
3479*53ee8cc1Swenshuai.xi case E_JPEG_APP9:
3480*53ee8cc1Swenshuai.xi case E_JPEG_APP10:
3481*53ee8cc1Swenshuai.xi case E_JPEG_APP11:
3482*53ee8cc1Swenshuai.xi case E_JPEG_APP12:
3483*53ee8cc1Swenshuai.xi case E_JPEG_APP13:
3484*53ee8cc1Swenshuai.xi case E_JPEG_APP15:
3485*53ee8cc1Swenshuai.xi case E_JPEG_JPG0:
3486*53ee8cc1Swenshuai.xi case E_JPEG_JPG1:
3487*53ee8cc1Swenshuai.xi case E_JPEG_JPG2:
3488*53ee8cc1Swenshuai.xi case E_JPEG_JPG3:
3489*53ee8cc1Swenshuai.xi case E_JPEG_JPG4:
3490*53ee8cc1Swenshuai.xi case E_JPEG_JPG5:
3491*53ee8cc1Swenshuai.xi case E_JPEG_JPG6:
3492*53ee8cc1Swenshuai.xi case E_JPEG_JPG7:
3493*53ee8cc1Swenshuai.xi case E_JPEG_JPG8:
3494*53ee8cc1Swenshuai.xi case E_JPEG_JPG9:
3495*53ee8cc1Swenshuai.xi case E_JPEG_JPG10:
3496*53ee8cc1Swenshuai.xi case E_JPEG_JPG11:
3497*53ee8cc1Swenshuai.xi case E_JPEG_JPG12:
3498*53ee8cc1Swenshuai.xi case E_JPEG_JPG13:
3499*53ee8cc1Swenshuai.xi case E_JPEG_COM:
3500*53ee8cc1Swenshuai.xi /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */
3501*53ee8cc1Swenshuai.xi {
3502*53ee8cc1Swenshuai.xi if(!JPEG_skip_variable_marker())
3503*53ee8cc1Swenshuai.xi {
3504*53ee8cc1Swenshuai.xi return FALSE;
3505*53ee8cc1Swenshuai.xi }
3506*53ee8cc1Swenshuai.xi break;
3507*53ee8cc1Swenshuai.xi }
3508*53ee8cc1Swenshuai.xi default:
3509*53ee8cc1Swenshuai.xi break;
3510*53ee8cc1Swenshuai.xi }
3511*53ee8cc1Swenshuai.xi }
3512*53ee8cc1Swenshuai.xi return TRUE;
3513*53ee8cc1Swenshuai.xi }
3514*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3515*53ee8cc1Swenshuai.xi // Finds the start of image (SOI) marker.
3516*53ee8cc1Swenshuai.xi // This code is rather defensive: it only checks the first 512 bytes to avoid
3517*53ee8cc1Swenshuai.xi // FALSE positives.
JPEG_locate_soi_marker(void)3518*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_locate_soi_marker(void)
3519*53ee8cc1Swenshuai.xi {
3520*53ee8cc1Swenshuai.xi MS_U32 lastchar, thischar;
3521*53ee8cc1Swenshuai.xi MS_U32 bytesleft;
3522*53ee8cc1Swenshuai.xi
3523*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
3524*53ee8cc1Swenshuai.xi
3525*53ee8cc1Swenshuai.xi lastchar = JPEG_get_char();
3526*53ee8cc1Swenshuai.xi
3527*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("0x%lx\n", lastchar);
3528*53ee8cc1Swenshuai.xi thischar = JPEG_get_char();
3529*53ee8cc1Swenshuai.xi
3530*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("0x%lx\n", thischar);
3531*53ee8cc1Swenshuai.xi /* ok if it's a normal JPEG file without a special header */
3532*53ee8cc1Swenshuai.xi
3533*53ee8cc1Swenshuai.xi if ((0xFF == lastchar)
3534*53ee8cc1Swenshuai.xi && (E_JPEG_SOI == thischar))
3535*53ee8cc1Swenshuai.xi {
3536*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("SOI\n");
3537*53ee8cc1Swenshuai.xi return TRUE;
3538*53ee8cc1Swenshuai.xi }
3539*53ee8cc1Swenshuai.xi
3540*53ee8cc1Swenshuai.xi // Set this value to 0x1000 for 4k alignment MPO case when parse 2nd/3rd/... JPEG file
3541*53ee8cc1Swenshuai.xi bytesleft = 0x1000; //Fix this number from 512 -> 640 for some cases
3542*53ee8cc1Swenshuai.xi
3543*53ee8cc1Swenshuai.xi for ( ; ; )
3544*53ee8cc1Swenshuai.xi {
3545*53ee8cc1Swenshuai.xi if ( --bytesleft == 0 )
3546*53ee8cc1Swenshuai.xi {
3547*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOT_JPEG );
3548*53ee8cc1Swenshuai.xi return FALSE;
3549*53ee8cc1Swenshuai.xi }
3550*53ee8cc1Swenshuai.xi
3551*53ee8cc1Swenshuai.xi lastchar = thischar;
3552*53ee8cc1Swenshuai.xi
3553*53ee8cc1Swenshuai.xi thischar = JPEG_get_char();
3554*53ee8cc1Swenshuai.xi
3555*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("%x ", (MS_U8)thischar);
3556*53ee8cc1Swenshuai.xi //if(bytesleft%8==0)
3557*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("\n");
3558*53ee8cc1Swenshuai.xi
3559*53ee8cc1Swenshuai.xi if ((0xFF == lastchar)
3560*53ee8cc1Swenshuai.xi && (E_JPEG_SOI == thischar))
3561*53ee8cc1Swenshuai.xi {
3562*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("SOI\n");
3563*53ee8cc1Swenshuai.xi break;
3564*53ee8cc1Swenshuai.xi }
3565*53ee8cc1Swenshuai.xi }
3566*53ee8cc1Swenshuai.xi
3567*53ee8cc1Swenshuai.xi /* Check the next character after marker: if it's not 0xFF, it can't
3568*53ee8cc1Swenshuai.xi be the start of the next marker, so it probably isn't a JPEG */
3569*53ee8cc1Swenshuai.xi /* need to check for more detail, currently _u32Bit_buf is not updated during JPEG_get_char()
3570*53ee8cc1Swenshuai.xi thischar = ( _u32Bit_buf >> 8 ) & 0xFF;
3571*53ee8cc1Swenshuai.xi
3572*53ee8cc1Swenshuai.xi if ( thischar != 0xFF )
3573*53ee8cc1Swenshuai.xi {
3574*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOT_JPEG );
3575*53ee8cc1Swenshuai.xi return FALSE;
3576*53ee8cc1Swenshuai.xi }
3577*53ee8cc1Swenshuai.xi */
3578*53ee8cc1Swenshuai.xi return TRUE;
3579*53ee8cc1Swenshuai.xi }
3580*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3581*53ee8cc1Swenshuai.xi // Find a start of frame (SOF) marker.
JPEG_locate_sof_marker(void)3582*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_locate_sof_marker(void)
3583*53ee8cc1Swenshuai.xi {
3584*53ee8cc1Swenshuai.xi MS_U32 c;
3585*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
3586*53ee8cc1Swenshuai.xi
3587*53ee8cc1Swenshuai.xi if(!JPEG_locate_soi_marker())
3588*53ee8cc1Swenshuai.xi return FALSE;
3589*53ee8cc1Swenshuai.xi
3590*53ee8cc1Swenshuai.xi c = JPEG_process_markers();
3591*53ee8cc1Swenshuai.xi
3592*53ee8cc1Swenshuai.xi if( c == FALSE )
3593*53ee8cc1Swenshuai.xi return FALSE;
3594*53ee8cc1Swenshuai.xi
3595*53ee8cc1Swenshuai.xi switch ( c )
3596*53ee8cc1Swenshuai.xi {
3597*53ee8cc1Swenshuai.xi case E_JPEG_SOF2:
3598*53ee8cc1Swenshuai.xi {
3599*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Progressive\n");
3600*53ee8cc1Swenshuai.xi _bProgressive_flag = TRUE;
3601*53ee8cc1Swenshuai.xi u32SOFOffset = u32DataOffset + JPEG_GetECS() - 2;
3602*53ee8cc1Swenshuai.xi if(!JPEG_read_sof_marker())
3603*53ee8cc1Swenshuai.xi return FALSE;
3604*53ee8cc1Swenshuai.xi break;
3605*53ee8cc1Swenshuai.xi }
3606*53ee8cc1Swenshuai.xi case E_JPEG_SOF0:
3607*53ee8cc1Swenshuai.xi /* baseline DCT */
3608*53ee8cc1Swenshuai.xi case E_JPEG_SOF1:
3609*53ee8cc1Swenshuai.xi /* extended sequential DCT */
3610*53ee8cc1Swenshuai.xi {
3611*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Baseline\n");
3612*53ee8cc1Swenshuai.xi u32SOFOffset = u32DataOffset + JPEG_GetECS() - 2;
3613*53ee8cc1Swenshuai.xi if(!JPEG_read_sof_marker())
3614*53ee8cc1Swenshuai.xi return FALSE;
3615*53ee8cc1Swenshuai.xi break;
3616*53ee8cc1Swenshuai.xi }
3617*53ee8cc1Swenshuai.xi case E_JPEG_SOF9:
3618*53ee8cc1Swenshuai.xi /* Arithmitic coding */
3619*53ee8cc1Swenshuai.xi {
3620*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NO_ARITHMETIC_SUPPORT );
3621*53ee8cc1Swenshuai.xi return FALSE;
3622*53ee8cc1Swenshuai.xi break;
3623*53ee8cc1Swenshuai.xi }
3624*53ee8cc1Swenshuai.xi
3625*53ee8cc1Swenshuai.xi default:
3626*53ee8cc1Swenshuai.xi {
3627*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("parsed unsupported marker = 0x%04lX\n", c);
3628*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_MARKER );
3629*53ee8cc1Swenshuai.xi return FALSE;
3630*53ee8cc1Swenshuai.xi break;
3631*53ee8cc1Swenshuai.xi }
3632*53ee8cc1Swenshuai.xi }
3633*53ee8cc1Swenshuai.xi return TRUE;
3634*53ee8cc1Swenshuai.xi }
3635*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3636*53ee8cc1Swenshuai.xi // Find a start of scan (SOS) marker.
JPEG_locate_sos_marker(void)3637*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_locate_sos_marker(void)
3638*53ee8cc1Swenshuai.xi {
3639*53ee8cc1Swenshuai.xi MS_U32 c;
3640*53ee8cc1Swenshuai.xi
3641*53ee8cc1Swenshuai.xi c = JPEG_process_markers();
3642*53ee8cc1Swenshuai.xi
3643*53ee8cc1Swenshuai.xi if ( c == E_JPEG_EOI )
3644*53ee8cc1Swenshuai.xi {
3645*53ee8cc1Swenshuai.xi return FALSE;
3646*53ee8cc1Swenshuai.xi }
3647*53ee8cc1Swenshuai.xi else if ( c != E_JPEG_SOS )
3648*53ee8cc1Swenshuai.xi {
3649*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
3650*53ee8cc1Swenshuai.xi return FALSE;
3651*53ee8cc1Swenshuai.xi }
3652*53ee8cc1Swenshuai.xi
3653*53ee8cc1Swenshuai.xi if(!JPEG_read_sos_marker())
3654*53ee8cc1Swenshuai.xi return FALSE;
3655*53ee8cc1Swenshuai.xi
3656*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);
3657*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%02x %02x %02x %02x %02x %02x %02x %02x \n",
3658*53ee8cc1Swenshuai.xi *_pu8In_buf_ofs, *(_pu8In_buf_ofs+1), *(_pu8In_buf_ofs+2), *(_pu8In_buf_ofs+3),
3659*53ee8cc1Swenshuai.xi *(_pu8In_buf_ofs+4), *(_pu8In_buf_ofs+5), *(_pu8In_buf_ofs+6), *(_pu8In_buf_ofs+7)
3660*53ee8cc1Swenshuai.xi );
3661*53ee8cc1Swenshuai.xi
3662*53ee8cc1Swenshuai.xi return TRUE;
3663*53ee8cc1Swenshuai.xi }
3664*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3665*53ee8cc1Swenshuai.xi // Reset thumbnail parameters
JPEG_init_thumbnail(void)3666*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_init_thumbnail(void)
3667*53ee8cc1Swenshuai.xi {
3668*53ee8cc1Swenshuai.xi _bThumbnailFound = FALSE;
3669*53ee8cc1Swenshuai.xi _u32ThumbnailOffset = 0;
3670*53ee8cc1Swenshuai.xi _u16ThumbnailSize = 0;
3671*53ee8cc1Swenshuai.xi _bTiffBigEndian = FALSE;
3672*53ee8cc1Swenshuai.xi
3673*53ee8cc1Swenshuai.xi _u32ThumbnailBufferOffset = 0;
3674*53ee8cc1Swenshuai.xi _u16ThumbnailSize = 0;
3675*53ee8cc1Swenshuai.xi _bThumbnailAccessMode = FALSE;
3676*53ee8cc1Swenshuai.xi
3677*53ee8cc1Swenshuai.xi _stEXIF_DateTime.bHasDataTime = FALSE;
3678*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Year = 0;
3679*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Month = 0;
3680*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Day = 0;
3681*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Hour = 0;
3682*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Minute = 0;
3683*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Second = 0;
3684*53ee8cc1Swenshuai.xi _eEXIF_Orientation = E_JPEG_EXIF_ORIENT_NOT_FOUND;
3685*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
3686*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8EXIF_Manufacturer, 0, JPEG_MANUFACTURER_SIZE);
3687*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8EXIF_Model, 0, JPEG_MODEL_SIZE);
3688*53ee8cc1Swenshuai.xi _u16EXIF_Flash = 0;
3689*53ee8cc1Swenshuai.xi _u16EXIF_Exposureprogram = 0;
3690*53ee8cc1Swenshuai.xi _u32EXIF_ISOSpeedRatings = 0;
3691*53ee8cc1Swenshuai.xi _stEXIF_ShutterSpeedValue.numerator = 0;
3692*53ee8cc1Swenshuai.xi _stEXIF_ShutterSpeedValue.denominator= 0;
3693*53ee8cc1Swenshuai.xi _stEXIF_ApertureValue.s_numerator= 0;
3694*53ee8cc1Swenshuai.xi _stEXIF_ApertureValue.s_denominator= 0;
3695*53ee8cc1Swenshuai.xi _stEXIF_ExposureBiasValue.numerator= 0;
3696*53ee8cc1Swenshuai.xi _stEXIF_ExposureBiasValue.denominator= 0;
3697*53ee8cc1Swenshuai.xi _stEXIF_FocalLength.s_numerator= 0;
3698*53ee8cc1Swenshuai.xi _stEXIF_FocalLength.s_denominator= 0;
3699*53ee8cc1Swenshuai.xi _u32EXIF_ImageWidth = 0;
3700*53ee8cc1Swenshuai.xi _u32EXIF_ImageHeight = 0;
3701*53ee8cc1Swenshuai.xi _stEXIF_ExposureTime.numerator = 0;
3702*53ee8cc1Swenshuai.xi _stEXIF_ExposureTime.denominator =0;
3703*53ee8cc1Swenshuai.xi _stEXIF_FNumber.numerator = 0;
3704*53ee8cc1Swenshuai.xi _stEXIF_FNumber.denominator =0;
3705*53ee8cc1Swenshuai.xi #endif
3706*53ee8cc1Swenshuai.xi }
3707*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3708*53ee8cc1Swenshuai.xi // Reset everything to default/uninitialized state.
JPEG_init(void)3709*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init(void)
3710*53ee8cc1Swenshuai.xi {
3711*53ee8cc1Swenshuai.xi MS_U16 i;
3712*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s!!\n", __FUNCTION__);
3713*53ee8cc1Swenshuai.xi _u8LumaCi = 1;
3714*53ee8cc1Swenshuai.xi _u8ChromaCi = 2;
3715*53ee8cc1Swenshuai.xi _u8Chroma2Ci = 3;
3716*53ee8cc1Swenshuai.xi bIs3HuffTbl = FALSE;
3717*53ee8cc1Swenshuai.xi
3718*53ee8cc1Swenshuai.xi _Error_code = E_JPEG_NO_ERROR;
3719*53ee8cc1Swenshuai.xi
3720*53ee8cc1Swenshuai.xi #ifdef CMODEL
3721*53ee8cc1Swenshuai.xi _bReady_flag = FALSE;
3722*53ee8cc1Swenshuai.xi #endif
3723*53ee8cc1Swenshuai.xi
3724*53ee8cc1Swenshuai.xi _u16Image_x_size = _u16Image_y_size = 0;
3725*53ee8cc1Swenshuai.xi _u16OriginalImage_x_size = _u16OriginalImage_y_size = 0;
3726*53ee8cc1Swenshuai.xi _u16AlignedImageWidth = _u16AlignedImagePitch = _u16AlignedImageHeight = 0;
3727*53ee8cc1Swenshuai.xi _u16AlignedImagePitch_H = 0;
3728*53ee8cc1Swenshuai.xi
3729*53ee8cc1Swenshuai.xi //// _pStream = _Pstream;
3730*53ee8cc1Swenshuai.xi
3731*53ee8cc1Swenshuai.xi _bProgressive_flag = FALSE;
3732*53ee8cc1Swenshuai.xi #ifndef CMODEL
3733*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
3734*53ee8cc1Swenshuai.xi #endif
3735*53ee8cc1Swenshuai.xi _u32RLEOffset = 0;
3736*53ee8cc1Swenshuai.xi _bFirstRLE = TRUE;
3737*53ee8cc1Swenshuai.xi
3738*53ee8cc1Swenshuai.xi _s16dc_pred[0] = _s16dc_pred[1] = _s16dc_pred[2] = 0;
3739*53ee8cc1Swenshuai.xi
3740*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE; //For H/W bug, some cases can not exit after decode done.
3741*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = 0; //For H/W bug, some cases can not exit after decode done, record repeat time.
3742*53ee8cc1Swenshuai.xi _JPD_PreVIdx = 0; //For H/W bug, some cases can not exit after decode done, record previous Vidx.
3743*53ee8cc1Swenshuai.xi
3744*53ee8cc1Swenshuai.xi _Progressive_ROI_flag = FALSE; //CL82399
3745*53ee8cc1Swenshuai.xi ROI_width = 0; //CL82399
3746*53ee8cc1Swenshuai.xi
3747*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_NONE;
3748*53ee8cc1Swenshuai.xi
3749*53ee8cc1Swenshuai.xi u32MRCheckCount = 0;
3750*53ee8cc1Swenshuai.xi
3751*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MAXHUFFTABLES; i++)
3752*53ee8cc1Swenshuai.xi {
3753*53ee8cc1Swenshuai.xi _Huff_info[i].bValid = FALSE;
3754*53ee8cc1Swenshuai.xi JPEG_memset((void *)_Huff_info[i].u8Huff_num, 0, 17);
3755*53ee8cc1Swenshuai.xi JPEG_memset((void *)_Huff_info[i].u8Huff_val, 0, 256);
3756*53ee8cc1Swenshuai.xi JPEG_memset((void *)_Huff_info[i].u8Symbol, 0, 17);
3757*53ee8cc1Swenshuai.xi JPEG_memset((void *)_Huff_info[i].u16Code, 0, 17);
3758*53ee8cc1Swenshuai.xi }
3759*53ee8cc1Swenshuai.xi
3760*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MAXQUANTTABLES; i++)
3761*53ee8cc1Swenshuai.xi {
3762*53ee8cc1Swenshuai.xi _QuantTables[i].bValid = FALSE;
3763*53ee8cc1Swenshuai.xi JPEG_memset(_QuantTables[i].s16Value, 0, 64);
3764*53ee8cc1Swenshuai.xi }
3765*53ee8cc1Swenshuai.xi
3766*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_GRAYSCALE;
3767*53ee8cc1Swenshuai.xi
3768*53ee8cc1Swenshuai.xi _u8Comps_in_frame = 0;
3769*53ee8cc1Swenshuai.xi
3770*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_h_samp, 0, sizeof( _u8Comp_h_samp ) );
3771*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_v_samp, 0, sizeof( _u8Comp_v_samp ) );
3772*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_quant, 0, sizeof( _u8Comp_quant ) );
3773*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_ident, 0, sizeof( _u8Comp_ident ) );
3774*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u16Comp_h_blocks, 0, sizeof( _u16Comp_h_blocks ) );
3775*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u16Comp_v_blocks, 0, sizeof( _u16Comp_v_blocks ) );
3776*53ee8cc1Swenshuai.xi
3777*53ee8cc1Swenshuai.xi _u8Comps_in_scan = 0;
3778*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_list, 0, sizeof( _u8Comp_list ) );
3779*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_dc_tab, 0, sizeof( _u8Comp_dc_tab ) );
3780*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_ac_tab, 0, sizeof( _u8Comp_ac_tab ) );
3781*53ee8cc1Swenshuai.xi
3782*53ee8cc1Swenshuai.xi _u8Spectral_start = 0;
3783*53ee8cc1Swenshuai.xi _u8Spectral_end = 0;
3784*53ee8cc1Swenshuai.xi _u8Successive_low = 0;
3785*53ee8cc1Swenshuai.xi _u8Successive_high = 0;
3786*53ee8cc1Swenshuai.xi
3787*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 0;
3788*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 0;
3789*53ee8cc1Swenshuai.xi
3790*53ee8cc1Swenshuai.xi _u8Blocks_per_mcu = 0;
3791*53ee8cc1Swenshuai.xi _u32Max_blocks_per_row = 0;
3792*53ee8cc1Swenshuai.xi _u16Mcus_per_row = 0;
3793*53ee8cc1Swenshuai.xi _u16Mcus_per_col = 0;
3794*53ee8cc1Swenshuai.xi
3795*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Mcu_org, 0, sizeof( _u8Mcu_org ) );
3796*53ee8cc1Swenshuai.xi
3797*53ee8cc1Swenshuai.xi #ifdef CMODEL
3798*53ee8cc1Swenshuai.xi gu16Real_dest_bytes_per_scan_line = 0;
3799*53ee8cc1Swenshuai.xi gu16Dest_bytes_per_scan_line = 0;
3800*53ee8cc1Swenshuai.xi gu8Dest_bytes_per_pixel = 0;
3801*53ee8cc1Swenshuai.xi #endif
3802*53ee8cc1Swenshuai.xi
3803*53ee8cc1Swenshuai.xi JPEG_memset((void *)_pBlocks, 0, sizeof( _pBlocks ) );
3804*53ee8cc1Swenshuai.xi
3805*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3806*53ee8cc1Swenshuai.xi _u16Total_lines_left = 0;
3807*53ee8cc1Swenshuai.xi #ifdef CMODEL
3808*53ee8cc1Swenshuai.xi gu16Mcu_lines_left = 0;
3809*53ee8cc1Swenshuai.xi #endif
3810*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u32Block_y_mcu, 0, sizeof( _u32Block_y_mcu ) );
3811*53ee8cc1Swenshuai.xi JPEG_memset((void *)_Huff_tbls, 0, sizeof( _Huff_tbls ) );
3812*53ee8cc1Swenshuai.xi JPEG_memset((void *)_DC_Coeffs, 0, sizeof( _DC_Coeffs ) );
3813*53ee8cc1Swenshuai.xi JPEG_memset((void *)_AC_Coeffs, 0, sizeof( _AC_Coeffs ) );
3814*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u32Last_dc_val, 0, sizeof( _u32Last_dc_val ) );
3815*53ee8cc1Swenshuai.xi
3816*53ee8cc1Swenshuai.xi _u32EOB_run = 0;
3817*53ee8cc1Swenshuai.xi #endif
3818*53ee8cc1Swenshuai.xi
3819*53ee8cc1Swenshuai.xi _pu8In_buf_ofs = _pu8In_buf;
3820*53ee8cc1Swenshuai.xi //// _u32In_buf_left = 0;
3821*53ee8cc1Swenshuai.xi //// _bEOF_flag = FALSE;
3822*53ee8cc1Swenshuai.xi _u8Tem_flag = 0;
3823*53ee8cc1Swenshuai.xi
3824*53ee8cc1Swenshuai.xi //sharon JPEG_memset((void *)_pu8In_buf, 0, sizeof(MS_U8)*(MRC_BUFFER_SIZE + 128) );
3825*53ee8cc1Swenshuai.xi
3826*53ee8cc1Swenshuai.xi _u16Restart_interval = 0;
3827*53ee8cc1Swenshuai.xi _u16Restarts_left = 0;
3828*53ee8cc1Swenshuai.xi _u16Next_restart_num = 0;
3829*53ee8cc1Swenshuai.xi
3830*53ee8cc1Swenshuai.xi gu16Max_mcus_per_row = 0;
3831*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 0;
3832*53ee8cc1Swenshuai.xi _u16Max_mcus_per_col = 0;
3833*53ee8cc1Swenshuai.xi
3834*53ee8cc1Swenshuai.xi #ifdef CMODEL
3835*53ee8cc1Swenshuai.xi JPEG_memset((void *)gps16Block_seg, 0, sizeof( gps16Block_seg ) );
3836*53ee8cc1Swenshuai.xi gpu8Sample_buf = NULL;
3837*53ee8cc1Swenshuai.xi #endif
3838*53ee8cc1Swenshuai.xi
3839*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
3840*53ee8cc1Swenshuai.xi JPEG_memset( _ps16Block_seg, 0, sizeof( _ps16Block_seg ) );
3841*53ee8cc1Swenshuai.xi gpu8Sample_buf = NULL;
3842*53ee8cc1Swenshuai.xi #endif
3843*53ee8cc1Swenshuai.xi
3844*53ee8cc1Swenshuai.xi // Tell the stream we're going to use it.
3845*53ee8cc1Swenshuai.xi //_pStream->attach();
3846*53ee8cc1Swenshuai.xi
3847*53ee8cc1Swenshuai.xi // Ready the input buffer.
3848*53ee8cc1Swenshuai.xi if(_bThumbnailAccessMode)
3849*53ee8cc1Swenshuai.xi {
3850*53ee8cc1Swenshuai.xi // It means that thumbnail is found and re-call JPEG_init()
3851*53ee8cc1Swenshuai.xi // to re-fill thumbnail data to internal buffer.
3852*53ee8cc1Swenshuai.xi if(!JPEG_fill_read_buffer())
3853*53ee8cc1Swenshuai.xi {
3854*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_init : JPEG_fill_read_buffer failed!!!\n");
3855*53ee8cc1Swenshuai.xi return FALSE;
3856*53ee8cc1Swenshuai.xi }
3857*53ee8cc1Swenshuai.xi }
3858*53ee8cc1Swenshuai.xi else
3859*53ee8cc1Swenshuai.xi {
3860*53ee8cc1Swenshuai.xi //// _u32In_buf_left = MRC_BUFFER_SIZE; //sharon
3861*53ee8cc1Swenshuai.xi //// _Total_Decoded_Size = MRC_BUFFER_SIZE; //sharon
3862*53ee8cc1Swenshuai.xi //// _u32Total_bytes_read = MRC_BUFFER_SIZE; //sharon
3863*53ee8cc1Swenshuai.xi _u32Total_bytes_read = _u32In_buf_left;
3864*53ee8cc1Swenshuai.xi }
3865*53ee8cc1Swenshuai.xi
3866*53ee8cc1Swenshuai.xi // Prime the bit buffer.
3867*53ee8cc1Swenshuai.xi _s16Bits_left = 0;
3868*53ee8cc1Swenshuai.xi _u32Bit_buf = 0;
3869*53ee8cc1Swenshuai.xi
3870*53ee8cc1Swenshuai.xi // _pu32ExifHeaderAddr = 0;
3871*53ee8cc1Swenshuai.xi
3872*53ee8cc1Swenshuai.xi #ifdef CMODEL
3873*53ee8cc1Swenshuai.xi for ( i = 0; i < JPEG_MAXBLOCKSPERROW; i++ )
3874*53ee8cc1Swenshuai.xi {
3875*53ee8cc1Swenshuai.xi gu8Block_max_zag_set[i] = 64;
3876*53ee8cc1Swenshuai.xi }
3877*53ee8cc1Swenshuai.xi #endif
3878*53ee8cc1Swenshuai.xi
3879*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
3880*53ee8cc1Swenshuai.xi for ( i = 0; i < JPEG_MAXBLOCKSPERROW; i++ )
3881*53ee8cc1Swenshuai.xi {
3882*53ee8cc1Swenshuai.xi _u8Block_max_zag_set[i] = 64;
3883*53ee8cc1Swenshuai.xi }
3884*53ee8cc1Swenshuai.xi #endif
3885*53ee8cc1Swenshuai.xi return TRUE;
3886*53ee8cc1Swenshuai.xi }
3887*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3888*53ee8cc1Swenshuai.xi // The coeff_buf series of methods originally stored the coefficients
3889*53ee8cc1Swenshuai.xi // into a "virtual" file which was located in EMS, XMS, or a disk file. A cache
3890*53ee8cc1Swenshuai.xi // was used to make this process more efficient. Now, we can store the entire
3891*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)3892*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)
3893*53ee8cc1Swenshuai.xi {
3894*53ee8cc1Swenshuai.xi PJPEG_CoeffBuf cb = ( PJPEG_CoeffBuf )JPEG_alloc( sizeof( JPEG_CoeffBuf ) );
3895*53ee8cc1Swenshuai.xi
3896*53ee8cc1Swenshuai.xi if(cb == NULL)
3897*53ee8cc1Swenshuai.xi return NULL;
3898*53ee8cc1Swenshuai.xi
3899*53ee8cc1Swenshuai.xi cb->u16Block_num_x = block_num_x;
3900*53ee8cc1Swenshuai.xi cb->u16Block_num_y = block_num_y;
3901*53ee8cc1Swenshuai.xi
3902*53ee8cc1Swenshuai.xi cb->u8Block_len_x = block_len_x;
3903*53ee8cc1Swenshuai.xi cb->u8Block_len_y = block_len_y;
3904*53ee8cc1Swenshuai.xi
3905*53ee8cc1Swenshuai.xi cb->u16Block_size = ( block_len_x * block_len_y ) * sizeof( JPEG_BLOCK_TYPE );
3906*53ee8cc1Swenshuai.xi
3907*53ee8cc1Swenshuai.xi cb->pu8Data = ( MS_U8 * )JPEG_alloc( cb->u16Block_size * block_num_x * block_num_y );
3908*53ee8cc1Swenshuai.xi
3909*53ee8cc1Swenshuai.xi if(cb->pu8Data == NULL)
3910*53ee8cc1Swenshuai.xi return NULL;
3911*53ee8cc1Swenshuai.xi
3912*53ee8cc1Swenshuai.xi return cb;
3913*53ee8cc1Swenshuai.xi }
3914*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_coeff_buf_getp(PJPEG_CoeffBuf cb,MS_U16 block_x,MS_U16 block_y)3915*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_BLOCK_TYPE * JPEG_coeff_buf_getp( PJPEG_CoeffBuf cb, MS_U16 block_x, MS_U16 block_y )
3916*53ee8cc1Swenshuai.xi {
3917*53ee8cc1Swenshuai.xi if ( block_x >= cb->u16Block_num_x )
3918*53ee8cc1Swenshuai.xi {
3919*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_ASSERTION_ERROR );
3920*53ee8cc1Swenshuai.xi return NULL;
3921*53ee8cc1Swenshuai.xi }
3922*53ee8cc1Swenshuai.xi
3923*53ee8cc1Swenshuai.xi if ( block_y >= cb->u16Block_num_y )
3924*53ee8cc1Swenshuai.xi {
3925*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_ASSERTION_ERROR );
3926*53ee8cc1Swenshuai.xi return NULL;
3927*53ee8cc1Swenshuai.xi }
3928*53ee8cc1Swenshuai.xi
3929*53ee8cc1Swenshuai.xi return ( JPEG_BLOCK_TYPE * )((MS_U32)( cb->pu8Data + block_x * cb->u16Block_size
3930*53ee8cc1Swenshuai.xi + block_y * (cb->u16Block_size * cb->u16Block_num_x)));
3931*53ee8cc1Swenshuai.xi }
3932*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3933*53ee8cc1Swenshuai.xi // Creates the tables needed for efficient Huffman decoding.
JPEG_make_huff_table(MS_U8 indextmp)3934*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_make_huff_table(MS_U8 indextmp)
3935*53ee8cc1Swenshuai.xi {
3936*53ee8cc1Swenshuai.xi MS_U16 p, i, l, si;
3937*53ee8cc1Swenshuai.xi MS_U8 huffsize[257];
3938*53ee8cc1Swenshuai.xi MS_U16 huffcode[257];
3939*53ee8cc1Swenshuai.xi MS_U16 _code;
3940*53ee8cc1Swenshuai.xi MS_U16 subtree;
3941*53ee8cc1Swenshuai.xi MS_U16 code_size;
3942*53ee8cc1Swenshuai.xi MS_U16 lastp;
3943*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3944*53ee8cc1Swenshuai.xi MS_S16 nextfreeentry;
3945*53ee8cc1Swenshuai.xi #endif
3946*53ee8cc1Swenshuai.xi MS_S16 currententry;
3947*53ee8cc1Swenshuai.xi
3948*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3949*53ee8cc1Swenshuai.xi JPEG_HuffTbl *hs = &_Huff_tbls[indextmp];
3950*53ee8cc1Swenshuai.xi #endif
3951*53ee8cc1Swenshuai.xi
3952*53ee8cc1Swenshuai.xi JPEG_memset((void *)huffsize, 0, sizeof(huffsize));
3953*53ee8cc1Swenshuai.xi JPEG_memset((void *)huffcode, 0, sizeof(huffcode));
3954*53ee8cc1Swenshuai.xi
3955*53ee8cc1Swenshuai.xi p = 0;
3956*53ee8cc1Swenshuai.xi
3957*53ee8cc1Swenshuai.xi for ( l = 1; l <= 16; l++ )
3958*53ee8cc1Swenshuai.xi {
3959*53ee8cc1Swenshuai.xi for ( i = 1; i <= _Huff_info[indextmp].u8Huff_num[l]; i++ )
3960*53ee8cc1Swenshuai.xi {
3961*53ee8cc1Swenshuai.xi huffsize[p++] = l;
3962*53ee8cc1Swenshuai.xi
3963*53ee8cc1Swenshuai.xi //kevinhuang, add protection
3964*53ee8cc1Swenshuai.xi if ( p >= 257 )
3965*53ee8cc1Swenshuai.xi {
3966*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
3967*53ee8cc1Swenshuai.xi return FALSE;
3968*53ee8cc1Swenshuai.xi }
3969*53ee8cc1Swenshuai.xi }
3970*53ee8cc1Swenshuai.xi }
3971*53ee8cc1Swenshuai.xi
3972*53ee8cc1Swenshuai.xi huffsize[p] = 0;
3973*53ee8cc1Swenshuai.xi
3974*53ee8cc1Swenshuai.xi lastp = p;
3975*53ee8cc1Swenshuai.xi
3976*53ee8cc1Swenshuai.xi _code = 0;
3977*53ee8cc1Swenshuai.xi si = huffsize[0];
3978*53ee8cc1Swenshuai.xi p = 0;
3979*53ee8cc1Swenshuai.xi
3980*53ee8cc1Swenshuai.xi while ( huffsize[p] )
3981*53ee8cc1Swenshuai.xi {
3982*53ee8cc1Swenshuai.xi while ( huffsize[p] == si )
3983*53ee8cc1Swenshuai.xi {
3984*53ee8cc1Swenshuai.xi huffcode[p++] = _code;
3985*53ee8cc1Swenshuai.xi _code++;
3986*53ee8cc1Swenshuai.xi
3987*53ee8cc1Swenshuai.xi //kevinhuang, add protection
3988*53ee8cc1Swenshuai.xi if ( p >= 257 )
3989*53ee8cc1Swenshuai.xi {
3990*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
3991*53ee8cc1Swenshuai.xi return FALSE;
3992*53ee8cc1Swenshuai.xi }
3993*53ee8cc1Swenshuai.xi }
3994*53ee8cc1Swenshuai.xi
3995*53ee8cc1Swenshuai.xi _code <<= 1;
3996*53ee8cc1Swenshuai.xi si++;
3997*53ee8cc1Swenshuai.xi }
3998*53ee8cc1Swenshuai.xi
3999*53ee8cc1Swenshuai.xi // Calculate the min code
4000*53ee8cc1Swenshuai.xi for(i = 1; i<=16; i++)
4001*53ee8cc1Swenshuai.xi _Huff_info[indextmp].u16Code[i] = huffcode[_Huff_info[indextmp].u8Symbol[i]] << (15 - (i - 1));
4002*53ee8cc1Swenshuai.xi
4003*53ee8cc1Swenshuai.xi
4004*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
4005*53ee8cc1Swenshuai.xi // In JPD mode, SW doesn't need huff table when baseline decoding
4006*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
4007*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK != gu8Scan_type)
4008*53ee8cc1Swenshuai.xi && (E_JPEG_RGB != gu8Scan_type))
4009*53ee8cc1Swenshuai.xi #endif
4010*53ee8cc1Swenshuai.xi {
4011*53ee8cc1Swenshuai.xi #ifndef CMODEL
4012*53ee8cc1Swenshuai.xi if(_bProgressive_flag==FALSE)
4013*53ee8cc1Swenshuai.xi return TRUE;
4014*53ee8cc1Swenshuai.xi #endif
4015*53ee8cc1Swenshuai.xi }
4016*53ee8cc1Swenshuai.xi
4017*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Make HUFF TABLE\n");
4018*53ee8cc1Swenshuai.xi
4019*53ee8cc1Swenshuai.xi JPEG_memset((void *)(hs->s16Look_up), 0, sizeof( hs->s16Look_up ) );
4020*53ee8cc1Swenshuai.xi JPEG_memset((void *)(hs->s16Tree), 0, sizeof( hs->s16Tree ) );
4021*53ee8cc1Swenshuai.xi JPEG_memset((void *)(hs->u8Code_size), 0, sizeof( hs->u8Code_size ) );
4022*53ee8cc1Swenshuai.xi
4023*53ee8cc1Swenshuai.xi nextfreeentry = -1;
4024*53ee8cc1Swenshuai.xi
4025*53ee8cc1Swenshuai.xi p = 0;
4026*53ee8cc1Swenshuai.xi
4027*53ee8cc1Swenshuai.xi while ( p < lastp )
4028*53ee8cc1Swenshuai.xi {
4029*53ee8cc1Swenshuai.xi i = _Huff_info[indextmp].u8Huff_val[p];
4030*53ee8cc1Swenshuai.xi _code = huffcode[p];
4031*53ee8cc1Swenshuai.xi code_size = huffsize[p];
4032*53ee8cc1Swenshuai.xi
4033*53ee8cc1Swenshuai.xi hs->u8Code_size[i] = code_size;
4034*53ee8cc1Swenshuai.xi
4035*53ee8cc1Swenshuai.xi if ( code_size <= 8 )
4036*53ee8cc1Swenshuai.xi {
4037*53ee8cc1Swenshuai.xi _code <<= ( 8 - code_size );
4038*53ee8cc1Swenshuai.xi
4039*53ee8cc1Swenshuai.xi for ( l = 1 << ( 8 - code_size ); l > 0; l-- )
4040*53ee8cc1Swenshuai.xi {
4041*53ee8cc1Swenshuai.xi hs->s16Look_up[_code] = i;
4042*53ee8cc1Swenshuai.xi _code++;
4043*53ee8cc1Swenshuai.xi }
4044*53ee8cc1Swenshuai.xi }
4045*53ee8cc1Swenshuai.xi else
4046*53ee8cc1Swenshuai.xi {
4047*53ee8cc1Swenshuai.xi subtree = ( _code >> ( code_size - 8 ) ) & 0xFF;
4048*53ee8cc1Swenshuai.xi
4049*53ee8cc1Swenshuai.xi currententry = hs->s16Look_up[subtree];
4050*53ee8cc1Swenshuai.xi
4051*53ee8cc1Swenshuai.xi if ( currententry == 0 )
4052*53ee8cc1Swenshuai.xi {
4053*53ee8cc1Swenshuai.xi hs->s16Look_up[subtree] = currententry = nextfreeentry;
4054*53ee8cc1Swenshuai.xi
4055*53ee8cc1Swenshuai.xi nextfreeentry -= 2;
4056*53ee8cc1Swenshuai.xi }
4057*53ee8cc1Swenshuai.xi
4058*53ee8cc1Swenshuai.xi _code <<= ( 16 - ( code_size - 8 ) );
4059*53ee8cc1Swenshuai.xi
4060*53ee8cc1Swenshuai.xi for ( l = code_size; l > 9; l-- )
4061*53ee8cc1Swenshuai.xi {
4062*53ee8cc1Swenshuai.xi if ( ( _code & 0x8000 ) == 0 )
4063*53ee8cc1Swenshuai.xi {
4064*53ee8cc1Swenshuai.xi currententry--;
4065*53ee8cc1Swenshuai.xi }
4066*53ee8cc1Swenshuai.xi
4067*53ee8cc1Swenshuai.xi if ( hs->s16Tree[-currententry - 1] == 0 )
4068*53ee8cc1Swenshuai.xi {
4069*53ee8cc1Swenshuai.xi hs->s16Tree[-currententry - 1] = nextfreeentry;
4070*53ee8cc1Swenshuai.xi
4071*53ee8cc1Swenshuai.xi currententry = nextfreeentry;
4072*53ee8cc1Swenshuai.xi
4073*53ee8cc1Swenshuai.xi nextfreeentry -= 2;
4074*53ee8cc1Swenshuai.xi }
4075*53ee8cc1Swenshuai.xi else
4076*53ee8cc1Swenshuai.xi {
4077*53ee8cc1Swenshuai.xi currententry = hs->s16Tree[-currententry - 1];
4078*53ee8cc1Swenshuai.xi }
4079*53ee8cc1Swenshuai.xi
4080*53ee8cc1Swenshuai.xi _code <<= 1;
4081*53ee8cc1Swenshuai.xi }
4082*53ee8cc1Swenshuai.xi
4083*53ee8cc1Swenshuai.xi if ( ( _code & 0x8000 ) == 0 )
4084*53ee8cc1Swenshuai.xi {
4085*53ee8cc1Swenshuai.xi currententry--;
4086*53ee8cc1Swenshuai.xi }
4087*53ee8cc1Swenshuai.xi
4088*53ee8cc1Swenshuai.xi hs->s16Tree[-currententry - 1] = i;
4089*53ee8cc1Swenshuai.xi }
4090*53ee8cc1Swenshuai.xi
4091*53ee8cc1Swenshuai.xi p++;
4092*53ee8cc1Swenshuai.xi }
4093*53ee8cc1Swenshuai.xi #endif //SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
4094*53ee8cc1Swenshuai.xi return TRUE;
4095*53ee8cc1Swenshuai.xi }
4096*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4097*53ee8cc1Swenshuai.xi // Verifies the quantization tables needed for this scan are available.
JPEG_check_quant_tables(void)4098*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_check_quant_tables( void ) //ok
4099*53ee8cc1Swenshuai.xi {
4100*53ee8cc1Swenshuai.xi MS_U8 i;
4101*53ee8cc1Swenshuai.xi
4102*53ee8cc1Swenshuai.xi for ( i = 0; i < _u8Comps_in_scan; i++ )
4103*53ee8cc1Swenshuai.xi {
4104*53ee8cc1Swenshuai.xi if ( _QuantTables[_u8Comp_quant[_u8Comp_list[i]]].bValid==FALSE )
4105*53ee8cc1Swenshuai.xi {
4106*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNDEFINED_QUANT_TABLE );
4107*53ee8cc1Swenshuai.xi return FALSE;
4108*53ee8cc1Swenshuai.xi }
4109*53ee8cc1Swenshuai.xi }
4110*53ee8cc1Swenshuai.xi return TRUE;
4111*53ee8cc1Swenshuai.xi }
4112*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4113*53ee8cc1Swenshuai.xi // Verifies that all the Huffman tables needed for this scan are available.
JPEG_check_huff_tables(void)4114*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_check_huff_tables( void )
4115*53ee8cc1Swenshuai.xi {
4116*53ee8cc1Swenshuai.xi MS_U8 i;
4117*53ee8cc1Swenshuai.xi
4118*53ee8cc1Swenshuai.xi for ( i = 0; i < _u8Comps_in_scan; i++ )
4119*53ee8cc1Swenshuai.xi {
4120*53ee8cc1Swenshuai.xi if ( ( _u8Spectral_start == 0 ) && ( _Huff_info[_u8Comp_dc_tab[_u8Comp_list[i]]].bValid== FALSE ) )
4121*53ee8cc1Swenshuai.xi {
4122*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
4123*53ee8cc1Swenshuai.xi return FALSE;
4124*53ee8cc1Swenshuai.xi }
4125*53ee8cc1Swenshuai.xi
4126*53ee8cc1Swenshuai.xi if ( ( _u8Spectral_end > 0 ) && ( _Huff_info[_u8Comp_ac_tab[_u8Comp_list[i]]].bValid== FALSE ) )
4127*53ee8cc1Swenshuai.xi {
4128*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
4129*53ee8cc1Swenshuai.xi return FALSE;
4130*53ee8cc1Swenshuai.xi }
4131*53ee8cc1Swenshuai.xi }
4132*53ee8cc1Swenshuai.xi
4133*53ee8cc1Swenshuai.xi for ( i = 0; i < JPEG_MAXHUFFTABLES; i++ )
4134*53ee8cc1Swenshuai.xi {
4135*53ee8cc1Swenshuai.xi if ( _Huff_info[i].bValid )
4136*53ee8cc1Swenshuai.xi {
4137*53ee8cc1Swenshuai.xi if(!JPEG_make_huff_table(i))
4138*53ee8cc1Swenshuai.xi return FALSE;
4139*53ee8cc1Swenshuai.xi }
4140*53ee8cc1Swenshuai.xi }
4141*53ee8cc1Swenshuai.xi return TRUE;
4142*53ee8cc1Swenshuai.xi }
4143*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4144*53ee8cc1Swenshuai.xi // Determines the component order inside each MCU.
4145*53ee8cc1Swenshuai.xi // Also calcs how many MCU's are on each row, etc.
JPEG_calc_mcu_block_order(void)4146*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_calc_mcu_block_order( void ) //ok
4147*53ee8cc1Swenshuai.xi {
4148*53ee8cc1Swenshuai.xi MS_U8 component_num, component_id;
4149*53ee8cc1Swenshuai.xi MS_U8 max_h_samp = 0, max_v_samp = 0;
4150*53ee8cc1Swenshuai.xi
4151*53ee8cc1Swenshuai.xi for ( component_id = 0; component_id < _u8Comps_in_frame; component_id++ )
4152*53ee8cc1Swenshuai.xi {
4153*53ee8cc1Swenshuai.xi if ( _u8Comp_h_samp[component_id] > max_h_samp )
4154*53ee8cc1Swenshuai.xi {
4155*53ee8cc1Swenshuai.xi max_h_samp = _u8Comp_h_samp[component_id];
4156*53ee8cc1Swenshuai.xi }
4157*53ee8cc1Swenshuai.xi
4158*53ee8cc1Swenshuai.xi if ( _u8Comp_v_samp[component_id] > max_v_samp )
4159*53ee8cc1Swenshuai.xi {
4160*53ee8cc1Swenshuai.xi max_v_samp = _u8Comp_v_samp[component_id];
4161*53ee8cc1Swenshuai.xi }
4162*53ee8cc1Swenshuai.xi }
4163*53ee8cc1Swenshuai.xi
4164*53ee8cc1Swenshuai.xi if((max_h_samp == 0) || (max_v_samp == 0))
4165*53ee8cc1Swenshuai.xi {
4166*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOT_ENOUGH_HEADER_INFO );
4167*53ee8cc1Swenshuai.xi return;
4168*53ee8cc1Swenshuai.xi }
4169*53ee8cc1Swenshuai.xi
4170*53ee8cc1Swenshuai.xi for ( component_id = 0; component_id < _u8Comps_in_frame; component_id++ )
4171*53ee8cc1Swenshuai.xi {
4172*53ee8cc1Swenshuai.xi _u16Comp_h_blocks[component_id] = ( ( ( ( _u16Image_x_size * _u8Comp_h_samp[component_id] ) + ( max_h_samp - 1 ) ) / max_h_samp ) + 7 ) / 8;
4173*53ee8cc1Swenshuai.xi _u16Comp_v_blocks[component_id] = ( ( ( ( _u16Image_y_size * _u8Comp_v_samp[component_id] ) + ( max_v_samp - 1 ) ) / max_v_samp ) + 7 ) / 8;
4174*53ee8cc1Swenshuai.xi }
4175*53ee8cc1Swenshuai.xi
4176*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
4177*53ee8cc1Swenshuai.xi {
4178*53ee8cc1Swenshuai.xi _u16Mcus_per_row = _u16Comp_h_blocks[_u8Comp_list[0]];
4179*53ee8cc1Swenshuai.xi _u16Mcus_per_col = _u16Comp_v_blocks[_u8Comp_list[0]];
4180*53ee8cc1Swenshuai.xi }
4181*53ee8cc1Swenshuai.xi else
4182*53ee8cc1Swenshuai.xi {
4183*53ee8cc1Swenshuai.xi _u16Mcus_per_row = ( ( ( _u16Image_x_size + 7 ) / 8 ) + ( max_h_samp - 1 ) ) / max_h_samp;
4184*53ee8cc1Swenshuai.xi _u16Mcus_per_col = ( ( ( _u16Image_y_size + 7 ) / 8 ) + ( max_v_samp - 1 ) ) / max_v_samp;
4185*53ee8cc1Swenshuai.xi }
4186*53ee8cc1Swenshuai.xi
4187*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
4188*53ee8cc1Swenshuai.xi {
4189*53ee8cc1Swenshuai.xi _u8Mcu_org[0] = _u8Comp_list[0];
4190*53ee8cc1Swenshuai.xi
4191*53ee8cc1Swenshuai.xi _u8Blocks_per_mcu = 1;
4192*53ee8cc1Swenshuai.xi }
4193*53ee8cc1Swenshuai.xi else
4194*53ee8cc1Swenshuai.xi {
4195*53ee8cc1Swenshuai.xi _u8Blocks_per_mcu = 0;
4196*53ee8cc1Swenshuai.xi
4197*53ee8cc1Swenshuai.xi for ( component_num = 0; component_num < _u8Comps_in_scan; component_num++ )
4198*53ee8cc1Swenshuai.xi {
4199*53ee8cc1Swenshuai.xi MS_U8 num_blocks;
4200*53ee8cc1Swenshuai.xi
4201*53ee8cc1Swenshuai.xi component_id = _u8Comp_list[component_num];
4202*53ee8cc1Swenshuai.xi
4203*53ee8cc1Swenshuai.xi num_blocks = _u8Comp_h_samp[component_id] * _u8Comp_v_samp[component_id];
4204*53ee8cc1Swenshuai.xi
4205*53ee8cc1Swenshuai.xi while ( num_blocks-- )
4206*53ee8cc1Swenshuai.xi {
4207*53ee8cc1Swenshuai.xi _u8Mcu_org[_u8Blocks_per_mcu++] = component_id;
4208*53ee8cc1Swenshuai.xi }
4209*53ee8cc1Swenshuai.xi }
4210*53ee8cc1Swenshuai.xi }
4211*53ee8cc1Swenshuai.xi }
4212*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4213*53ee8cc1Swenshuai.xi /* Get current access byte address in MRC buffer relative to MRC start address */
JPEG_GetECS(void)4214*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_GetECS(void)
4215*53ee8cc1Swenshuai.xi {
4216*53ee8cc1Swenshuai.xi MS_U32 data_end_addr = (MS_U32)_pu8In_buf_ofs;
4217*53ee8cc1Swenshuai.xi MS_U32 data_start_addr =(MS_U32) _pu8In_buf;
4218*53ee8cc1Swenshuai.xi
4219*53ee8cc1Swenshuai.xi return (data_end_addr - data_start_addr);
4220*53ee8cc1Swenshuai.xi }
4221*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4222*53ee8cc1Swenshuai.xi //*************************************************
4223*53ee8cc1Swenshuai.xi //write symbol table
4224*53ee8cc1Swenshuai.xi //*************************************************
4225*53ee8cc1Swenshuai.xi #ifndef CMODEL
4226*53ee8cc1Swenshuai.xi #if 0
4227*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_write_symidx(void)
4228*53ee8cc1Swenshuai.xi {
4229*53ee8cc1Swenshuai.xi MS_U16 i, tbl_num_luma, tbl_num_chroma;
4230*53ee8cc1Swenshuai.xi MS_U8 ci, luma_ci = 0, chroma_ci = 0;
4231*53ee8cc1Swenshuai.xi
4232*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SYMIDX_BASE);
4233*53ee8cc1Swenshuai.xi if (_HeadCheck.DHT)
4234*53ee8cc1Swenshuai.xi {
4235*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4236*53ee8cc1Swenshuai.xi {
4237*53ee8cc1Swenshuai.xi if(_u8LumaCi==_u8Comp_ident[ci])
4238*53ee8cc1Swenshuai.xi {
4239*53ee8cc1Swenshuai.xi luma_ci = ci;
4240*53ee8cc1Swenshuai.xi break;
4241*53ee8cc1Swenshuai.xi }
4242*53ee8cc1Swenshuai.xi }
4243*53ee8cc1Swenshuai.xi
4244*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4245*53ee8cc1Swenshuai.xi {
4246*53ee8cc1Swenshuai.xi if(_u8ChromaCi==_u8Comp_ident[ci])
4247*53ee8cc1Swenshuai.xi {
4248*53ee8cc1Swenshuai.xi chroma_ci = ci;
4249*53ee8cc1Swenshuai.xi break;
4250*53ee8cc1Swenshuai.xi }
4251*53ee8cc1Swenshuai.xi }
4252*53ee8cc1Swenshuai.xi
4253*53ee8cc1Swenshuai.xi tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4254*53ee8cc1Swenshuai.xi tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4255*53ee8cc1Swenshuai.xi
4256*53ee8cc1Swenshuai.xi for ( i = 0; i < 256; 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 tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4262*53ee8cc1Swenshuai.xi tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4263*53ee8cc1Swenshuai.xi
4264*53ee8cc1Swenshuai.xi for ( i = 0; i < 16; i++ )
4265*53ee8cc1Swenshuai.xi {
4266*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] ) );
4267*53ee8cc1Swenshuai.xi }
4268*53ee8cc1Swenshuai.xi }
4269*53ee8cc1Swenshuai.xi else
4270*53ee8cc1Swenshuai.xi {
4271*53ee8cc1Swenshuai.xi for(i=0;i<272;i++)
4272*53ee8cc1Swenshuai.xi MDrv_Write2Byte( BK_JPD_TID_DAT, g16SYMIDX_TBL[i]);
4273*53ee8cc1Swenshuai.xi }
4274*53ee8cc1Swenshuai.xi }
4275*53ee8cc1Swenshuai.xi #endif
4276*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_WriteSymidx(void)4277*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_WriteSymidx(void)
4278*53ee8cc1Swenshuai.xi {
4279*53ee8cc1Swenshuai.xi //MS_U16 i, tbl_num_luma, tbl_num_chroma;
4280*53ee8cc1Swenshuai.xi MS_U16 ac_tbl_num_luma = 0, ac_tbl_num_chroma = 0;
4281*53ee8cc1Swenshuai.xi MS_U16 dc_tbl_num_luma = 0, dc_tbl_num_chroma = 0;
4282*53ee8cc1Swenshuai.xi MS_U8 ci, luma_ci = 0, chroma_ci = 0;
4283*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==TRUE)
4284*53ee8cc1Swenshuai.xi MS_U16 ac_tbl_num_chroma2 = 0;
4285*53ee8cc1Swenshuai.xi MS_U16 dc_tbl_num_chroma2 = 0;
4286*53ee8cc1Swenshuai.xi MS_U8 chroma2_ci = 0;
4287*53ee8cc1Swenshuai.xi #endif
4288*53ee8cc1Swenshuai.xi JPD_Symidx structSymidx;
4289*53ee8cc1Swenshuai.xi
4290*53ee8cc1Swenshuai.xi JPEG_memset((void *)(&structSymidx), 0, sizeof(structSymidx));
4291*53ee8cc1Swenshuai.xi
4292*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteSymidx()
4293*53ee8cc1Swenshuai.xi //MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SYMIDX_BASE);
4294*53ee8cc1Swenshuai.xi
4295*53ee8cc1Swenshuai.xi if (_HeadCheck.DHT)
4296*53ee8cc1Swenshuai.xi {
4297*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4298*53ee8cc1Swenshuai.xi {
4299*53ee8cc1Swenshuai.xi if(_u8LumaCi==_u8Comp_ident[ci])
4300*53ee8cc1Swenshuai.xi {
4301*53ee8cc1Swenshuai.xi luma_ci = ci;
4302*53ee8cc1Swenshuai.xi break;
4303*53ee8cc1Swenshuai.xi }
4304*53ee8cc1Swenshuai.xi }
4305*53ee8cc1Swenshuai.xi
4306*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4307*53ee8cc1Swenshuai.xi {
4308*53ee8cc1Swenshuai.xi if(_u8ChromaCi==_u8Comp_ident[ci])
4309*53ee8cc1Swenshuai.xi {
4310*53ee8cc1Swenshuai.xi chroma_ci = ci;
4311*53ee8cc1Swenshuai.xi break;
4312*53ee8cc1Swenshuai.xi }
4313*53ee8cc1Swenshuai.xi }
4314*53ee8cc1Swenshuai.xi
4315*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==TRUE)
4316*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4317*53ee8cc1Swenshuai.xi {
4318*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4319*53ee8cc1Swenshuai.xi {
4320*53ee8cc1Swenshuai.xi if(_u8Chroma2Ci==_u8Comp_ident[ci])
4321*53ee8cc1Swenshuai.xi {
4322*53ee8cc1Swenshuai.xi chroma2_ci = ci;
4323*53ee8cc1Swenshuai.xi break;
4324*53ee8cc1Swenshuai.xi }
4325*53ee8cc1Swenshuai.xi }
4326*53ee8cc1Swenshuai.xi }
4327*53ee8cc1Swenshuai.xi #endif
4328*53ee8cc1Swenshuai.xi
4329*53ee8cc1Swenshuai.xi //tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4330*53ee8cc1Swenshuai.xi ac_tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4331*53ee8cc1Swenshuai.xi //tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4332*53ee8cc1Swenshuai.xi ac_tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4333*53ee8cc1Swenshuai.xi
4334*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteSymidx()
4335*53ee8cc1Swenshuai.xi #if 0
4336*53ee8cc1Swenshuai.xi for ( i = 0; i < 256; i++ )
4337*53ee8cc1Swenshuai.xi {
4338*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] ) );
4339*53ee8cc1Swenshuai.xi }
4340*53ee8cc1Swenshuai.xi #endif
4341*53ee8cc1Swenshuai.xi
4342*53ee8cc1Swenshuai.xi dc_tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4343*53ee8cc1Swenshuai.xi dc_tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4344*53ee8cc1Swenshuai.xi #if 0
4345*53ee8cc1Swenshuai.xi for ( i = 0; i < 16; i++ )
4346*53ee8cc1Swenshuai.xi {
4347*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] ) );
4348*53ee8cc1Swenshuai.xi }
4349*53ee8cc1Swenshuai.xi #endif
4350*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==TRUE)
4351*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4352*53ee8cc1Swenshuai.xi {
4353*53ee8cc1Swenshuai.xi ac_tbl_num_chroma2 = _u8Comp_ac_tab[chroma2_ci];
4354*53ee8cc1Swenshuai.xi dc_tbl_num_chroma2 = _u8Comp_dc_tab[chroma2_ci];
4355*53ee8cc1Swenshuai.xi }
4356*53ee8cc1Swenshuai.xi #endif
4357*53ee8cc1Swenshuai.xi }
4358*53ee8cc1Swenshuai.xi else
4359*53ee8cc1Swenshuai.xi {
4360*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteSymidx()
4361*53ee8cc1Swenshuai.xi #if 0
4362*53ee8cc1Swenshuai.xi for(i=0;i<272;i++)
4363*53ee8cc1Swenshuai.xi MDrv_Write2Byte( BK_JPD_TID_DAT, g16SYMIDX_TBL[i]);
4364*53ee8cc1Swenshuai.xi #endif
4365*53ee8cc1Swenshuai.xi }
4366*53ee8cc1Swenshuai.xi
4367*53ee8cc1Swenshuai.xi structSymidx.DHT = _HeadCheck.DHT;
4368*53ee8cc1Swenshuai.xi structSymidx.bUVHuffman = bIs3HuffTbl;
4369*53ee8cc1Swenshuai.xi structSymidx.u8DcLumaHuffVal = _Huff_info[dc_tbl_num_luma].u8Huff_val;
4370*53ee8cc1Swenshuai.xi structSymidx.u8DcChromaHuffVal = _Huff_info[dc_tbl_num_chroma].u8Huff_val;
4371*53ee8cc1Swenshuai.xi structSymidx.u8AcLumaHuffVal = _Huff_info[ac_tbl_num_luma].u8Huff_val;
4372*53ee8cc1Swenshuai.xi structSymidx.u8AcChromaHuffVal = _Huff_info[ac_tbl_num_chroma].u8Huff_val;
4373*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==TRUE)
4374*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4375*53ee8cc1Swenshuai.xi {
4376*53ee8cc1Swenshuai.xi structSymidx.u8DcChroma2HuffVal = _Huff_info[dc_tbl_num_chroma2].u8Huff_val;
4377*53ee8cc1Swenshuai.xi structSymidx.u8AcChroma2HuffVal = _Huff_info[ac_tbl_num_chroma2].u8Huff_val;
4378*53ee8cc1Swenshuai.xi }
4379*53ee8cc1Swenshuai.xi #endif
4380*53ee8cc1Swenshuai.xi MDrv_JPD_WriteSymidx(structSymidx);
4381*53ee8cc1Swenshuai.xi }
4382*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4383*53ee8cc1Swenshuai.xi //***************************************************
4384*53ee8cc1Swenshuai.xi //write quantization table
4385*53ee8cc1Swenshuai.xi //***************************************************
4386*53ee8cc1Swenshuai.xi #if 0
4387*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_write_Qtbl(void)
4388*53ee8cc1Swenshuai.xi {
4389*53ee8cc1Swenshuai.xi MS_U8 i, j;
4390*53ee8cc1Swenshuai.xi MS_U8 com_num = 0;
4391*53ee8cc1Swenshuai.xi MS_U8 comp[JPEG_MAXCOMPONENTS];
4392*53ee8cc1Swenshuai.xi
4393*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_QTBL_BASE);
4394*53ee8cc1Swenshuai.xi
4395*53ee8cc1Swenshuai.xi if (_HeadCheck.DQT)
4396*53ee8cc1Swenshuai.xi {
4397*53ee8cc1Swenshuai.xi // Calculate how many valid quantization tables
4398*53ee8cc1Swenshuai.xi JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
4399*53ee8cc1Swenshuai.xi for(i = 0; i<_u8Comps_in_frame; i++)
4400*53ee8cc1Swenshuai.xi {
4401*53ee8cc1Swenshuai.xi comp[_u8Comp_quant[i]] = 1;
4402*53ee8cc1Swenshuai.xi }
4403*53ee8cc1Swenshuai.xi
4404*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
4405*53ee8cc1Swenshuai.xi {
4406*53ee8cc1Swenshuai.xi if(comp[i]==1)
4407*53ee8cc1Swenshuai.xi com_num++;
4408*53ee8cc1Swenshuai.xi }
4409*53ee8cc1Swenshuai.xi
4410*53ee8cc1Swenshuai.xi for ( i = 0; i < com_num; i++ )
4411*53ee8cc1Swenshuai.xi {
4412*53ee8cc1Swenshuai.xi for(j = 0; j<64; j++)
4413*53ee8cc1Swenshuai.xi {
4414*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4415*53ee8cc1Swenshuai.xi }
4416*53ee8cc1Swenshuai.xi }
4417*53ee8cc1Swenshuai.xi
4418*53ee8cc1Swenshuai.xi // if all compoents refer to the same Qtable, need to write Qtable twice
4419*53ee8cc1Swenshuai.xi if(com_num==1)
4420*53ee8cc1Swenshuai.xi {
4421*53ee8cc1Swenshuai.xi for ( i = 0; i < com_num; i++ )
4422*53ee8cc1Swenshuai.xi {
4423*53ee8cc1Swenshuai.xi for(j = 0; j<64; j++)
4424*53ee8cc1Swenshuai.xi {
4425*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4426*53ee8cc1Swenshuai.xi }
4427*53ee8cc1Swenshuai.xi }
4428*53ee8cc1Swenshuai.xi }
4429*53ee8cc1Swenshuai.xi }
4430*53ee8cc1Swenshuai.xi else
4431*53ee8cc1Swenshuai.xi {
4432*53ee8cc1Swenshuai.xi for (i=0; i<128; i++)
4433*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, g16IQ_TBL[i]);
4434*53ee8cc1Swenshuai.xi }
4435*53ee8cc1Swenshuai.xi }
4436*53ee8cc1Swenshuai.xi #endif
JPEG_WriteIQTbl(void)4437*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_WriteIQTbl(void)
4438*53ee8cc1Swenshuai.xi {
4439*53ee8cc1Swenshuai.xi //MS_U8 i, j;
4440*53ee8cc1Swenshuai.xi MS_U8 i;
4441*53ee8cc1Swenshuai.xi MS_U8 com_num = 0;
4442*53ee8cc1Swenshuai.xi MS_U8 comp[JPEG_MAXCOMPONENTS];
4443*53ee8cc1Swenshuai.xi JPD_IQTbl structIqtbl;
4444*53ee8cc1Swenshuai.xi
4445*53ee8cc1Swenshuai.xi JPEG_memset((void *)&structIqtbl, 0, sizeof(structIqtbl));
4446*53ee8cc1Swenshuai.xi
4447*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteIQTbl()
4448*53ee8cc1Swenshuai.xi //MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_QTBL_BASE);
4449*53ee8cc1Swenshuai.xi
4450*53ee8cc1Swenshuai.xi if (_HeadCheck.DQT)
4451*53ee8cc1Swenshuai.xi {
4452*53ee8cc1Swenshuai.xi // Calculate how many valid quantization tables
4453*53ee8cc1Swenshuai.xi JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
4454*53ee8cc1Swenshuai.xi for(i = 0; i<_u8Comps_in_frame; i++)
4455*53ee8cc1Swenshuai.xi {
4456*53ee8cc1Swenshuai.xi comp[_u8Comp_quant[i]] = 1;
4457*53ee8cc1Swenshuai.xi }
4458*53ee8cc1Swenshuai.xi
4459*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
4460*53ee8cc1Swenshuai.xi {
4461*53ee8cc1Swenshuai.xi if(comp[i]==1)
4462*53ee8cc1Swenshuai.xi com_num++;
4463*53ee8cc1Swenshuai.xi }
4464*53ee8cc1Swenshuai.xi
4465*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteIQTbl
4466*53ee8cc1Swenshuai.xi #if 0
4467*53ee8cc1Swenshuai.xi for ( i = 0; i < com_num; i++ )
4468*53ee8cc1Swenshuai.xi {
4469*53ee8cc1Swenshuai.xi for(j = 0; j<64; j++)
4470*53ee8cc1Swenshuai.xi {
4471*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4472*53ee8cc1Swenshuai.xi }
4473*53ee8cc1Swenshuai.xi }
4474*53ee8cc1Swenshuai.xi
4475*53ee8cc1Swenshuai.xi // if all compoents refer to the same Qtable, need to write Qtable twice
4476*53ee8cc1Swenshuai.xi if(com_num==1)
4477*53ee8cc1Swenshuai.xi {
4478*53ee8cc1Swenshuai.xi for ( i = 0; i < com_num; i++ )
4479*53ee8cc1Swenshuai.xi {
4480*53ee8cc1Swenshuai.xi for(j = 0; j<64; j++)
4481*53ee8cc1Swenshuai.xi {
4482*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4483*53ee8cc1Swenshuai.xi }
4484*53ee8cc1Swenshuai.xi }
4485*53ee8cc1Swenshuai.xi }
4486*53ee8cc1Swenshuai.xi #endif
4487*53ee8cc1Swenshuai.xi }
4488*53ee8cc1Swenshuai.xi else
4489*53ee8cc1Swenshuai.xi {
4490*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteIQTbl()
4491*53ee8cc1Swenshuai.xi #if 0
4492*53ee8cc1Swenshuai.xi for (i=0; i<128; i++)
4493*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, g16IQ_TBL[i]);
4494*53ee8cc1Swenshuai.xi #endif
4495*53ee8cc1Swenshuai.xi }
4496*53ee8cc1Swenshuai.xi
4497*53ee8cc1Swenshuai.xi structIqtbl.DQT = _HeadCheck.DQT;
4498*53ee8cc1Swenshuai.xi structIqtbl.u8CompNum = com_num;
4499*53ee8cc1Swenshuai.xi structIqtbl.u8CompQuant = _u8Comp_quant;
4500*53ee8cc1Swenshuai.xi structIqtbl.QuantTables = (JPD_QuanTbl *)_QuantTables;
4501*53ee8cc1Swenshuai.xi MDrv_JPD_WriteIQTbl(structIqtbl);
4502*53ee8cc1Swenshuai.xi }
4503*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4504*53ee8cc1Swenshuai.xi //*************************************************
4505*53ee8cc1Swenshuai.xi //write group information
4506*53ee8cc1Swenshuai.xi //*************************************************
4507*53ee8cc1Swenshuai.xi #if 0
4508*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_write_Scwgif(void) //type : luma=>0 chroma=>1
4509*53ee8cc1Swenshuai.xi {
4510*53ee8cc1Swenshuai.xi MS_U32 reg_value;
4511*53ee8cc1Swenshuai.xi MS_U16 i, ci, valid, tbl_num_luma, tbl_num_chroma;
4512*53ee8cc1Swenshuai.xi MS_U8 luma_ci = 0, chroma_ci = 0;
4513*53ee8cc1Swenshuai.xi
4514*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SCWGIF_BASE);
4515*53ee8cc1Swenshuai.xi if (_HeadCheck.DHT)
4516*53ee8cc1Swenshuai.xi {
4517*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4518*53ee8cc1Swenshuai.xi {
4519*53ee8cc1Swenshuai.xi if(_u8LumaCi==_u8Comp_ident[ci])
4520*53ee8cc1Swenshuai.xi {
4521*53ee8cc1Swenshuai.xi luma_ci = ci;
4522*53ee8cc1Swenshuai.xi break;
4523*53ee8cc1Swenshuai.xi }
4524*53ee8cc1Swenshuai.xi }
4525*53ee8cc1Swenshuai.xi
4526*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4527*53ee8cc1Swenshuai.xi {
4528*53ee8cc1Swenshuai.xi if(_u8ChromaCi==_u8Comp_ident[ci])
4529*53ee8cc1Swenshuai.xi {
4530*53ee8cc1Swenshuai.xi chroma_ci = ci;
4531*53ee8cc1Swenshuai.xi break;
4532*53ee8cc1Swenshuai.xi }
4533*53ee8cc1Swenshuai.xi }
4534*53ee8cc1Swenshuai.xi
4535*53ee8cc1Swenshuai.xi tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4536*53ee8cc1Swenshuai.xi tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4537*53ee8cc1Swenshuai.xi
4538*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4539*53ee8cc1Swenshuai.xi {
4540*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4541*53ee8cc1Swenshuai.xi valid = 0;
4542*53ee8cc1Swenshuai.xi else
4543*53ee8cc1Swenshuai.xi valid = 1;
4544*53ee8cc1Swenshuai.xi
4545*53ee8cc1Swenshuai.xi if ( valid )
4546*53ee8cc1Swenshuai.xi {
4547*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] << 4 );
4548*53ee8cc1Swenshuai.xi }
4549*53ee8cc1Swenshuai.xi else
4550*53ee8cc1Swenshuai.xi {
4551*53ee8cc1Swenshuai.xi reg_value = 0;
4552*53ee8cc1Swenshuai.xi }
4553*53ee8cc1Swenshuai.xi
4554*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4555*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4556*53ee8cc1Swenshuai.xi }
4557*53ee8cc1Swenshuai.xi
4558*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4559*53ee8cc1Swenshuai.xi {
4560*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4561*53ee8cc1Swenshuai.xi valid = 0;
4562*53ee8cc1Swenshuai.xi else
4563*53ee8cc1Swenshuai.xi valid = 1;
4564*53ee8cc1Swenshuai.xi
4565*53ee8cc1Swenshuai.xi if ( valid )
4566*53ee8cc1Swenshuai.xi {
4567*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] << 4 );
4568*53ee8cc1Swenshuai.xi }
4569*53ee8cc1Swenshuai.xi else
4570*53ee8cc1Swenshuai.xi {
4571*53ee8cc1Swenshuai.xi reg_value = 0;
4572*53ee8cc1Swenshuai.xi }
4573*53ee8cc1Swenshuai.xi
4574*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4575*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4576*53ee8cc1Swenshuai.xi }
4577*53ee8cc1Swenshuai.xi
4578*53ee8cc1Swenshuai.xi tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4579*53ee8cc1Swenshuai.xi tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4580*53ee8cc1Swenshuai.xi
4581*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4582*53ee8cc1Swenshuai.xi {
4583*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4584*53ee8cc1Swenshuai.xi valid = 0;
4585*53ee8cc1Swenshuai.xi else
4586*53ee8cc1Swenshuai.xi valid = 1;
4587*53ee8cc1Swenshuai.xi
4588*53ee8cc1Swenshuai.xi if ( valid )
4589*53ee8cc1Swenshuai.xi {
4590*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] );
4591*53ee8cc1Swenshuai.xi }
4592*53ee8cc1Swenshuai.xi else
4593*53ee8cc1Swenshuai.xi {
4594*53ee8cc1Swenshuai.xi reg_value = 0;
4595*53ee8cc1Swenshuai.xi }
4596*53ee8cc1Swenshuai.xi
4597*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4598*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4599*53ee8cc1Swenshuai.xi }
4600*53ee8cc1Swenshuai.xi
4601*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4602*53ee8cc1Swenshuai.xi {
4603*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4604*53ee8cc1Swenshuai.xi valid = 0;
4605*53ee8cc1Swenshuai.xi else
4606*53ee8cc1Swenshuai.xi valid = 1;
4607*53ee8cc1Swenshuai.xi
4608*53ee8cc1Swenshuai.xi if ( valid )
4609*53ee8cc1Swenshuai.xi {
4610*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] );
4611*53ee8cc1Swenshuai.xi }
4612*53ee8cc1Swenshuai.xi else
4613*53ee8cc1Swenshuai.xi {
4614*53ee8cc1Swenshuai.xi reg_value = 0;
4615*53ee8cc1Swenshuai.xi }
4616*53ee8cc1Swenshuai.xi
4617*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4618*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4619*53ee8cc1Swenshuai.xi }
4620*53ee8cc1Swenshuai.xi }
4621*53ee8cc1Swenshuai.xi else
4622*53ee8cc1Swenshuai.xi {
4623*53ee8cc1Swenshuai.xi for( i = 0; i < 128; i++ )
4624*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, g16GRPINFO_TBL[i]);
4625*53ee8cc1Swenshuai.xi }
4626*53ee8cc1Swenshuai.xi }
4627*53ee8cc1Swenshuai.xi #endif
JPEG_WriteGrpinf(void)4628*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_WriteGrpinf(void) //type : luma=>0 chroma=>1
4629*53ee8cc1Swenshuai.xi {
4630*53ee8cc1Swenshuai.xi //MS_U32 reg_value;
4631*53ee8cc1Swenshuai.xi //MS_U16 i, ci, valid, tbl_num_luma, tbl_num_chroma;
4632*53ee8cc1Swenshuai.xi MS_U16 ci, dc_tbl_num_luma = 0, dc_tbl_num_chroma = 0;
4633*53ee8cc1Swenshuai.xi MS_U16 ac_tbl_num_luma = 0, ac_tbl_num_chroma = 0;
4634*53ee8cc1Swenshuai.xi MS_U8 luma_ci = 0, chroma_ci = 0;
4635*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==TRUE)
4636*53ee8cc1Swenshuai.xi MS_U16 dc_tbl_num_chroma2 = 0;
4637*53ee8cc1Swenshuai.xi MS_U16 ac_tbl_num_chroma2 = 0;
4638*53ee8cc1Swenshuai.xi MS_U8 chroma2_ci = 0;
4639*53ee8cc1Swenshuai.xi #endif
4640*53ee8cc1Swenshuai.xi JPD_Grpinf structGrpinf;
4641*53ee8cc1Swenshuai.xi
4642*53ee8cc1Swenshuai.xi JPEG_memset((void *)&structGrpinf, 0, sizeof(structGrpinf));
4643*53ee8cc1Swenshuai.xi
4644*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteGrpinf()
4645*53ee8cc1Swenshuai.xi #if 0
4646*53ee8cc1Swenshuai.xi //MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SCWGIF_BASE);
4647*53ee8cc1Swenshuai.xi #endif
4648*53ee8cc1Swenshuai.xi if (_HeadCheck.DHT)
4649*53ee8cc1Swenshuai.xi {
4650*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4651*53ee8cc1Swenshuai.xi {
4652*53ee8cc1Swenshuai.xi if(_u8LumaCi==_u8Comp_ident[ci])
4653*53ee8cc1Swenshuai.xi {
4654*53ee8cc1Swenshuai.xi luma_ci = ci;
4655*53ee8cc1Swenshuai.xi break;
4656*53ee8cc1Swenshuai.xi }
4657*53ee8cc1Swenshuai.xi }
4658*53ee8cc1Swenshuai.xi
4659*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4660*53ee8cc1Swenshuai.xi {
4661*53ee8cc1Swenshuai.xi if(_u8ChromaCi==_u8Comp_ident[ci])
4662*53ee8cc1Swenshuai.xi {
4663*53ee8cc1Swenshuai.xi chroma_ci = ci;
4664*53ee8cc1Swenshuai.xi break;
4665*53ee8cc1Swenshuai.xi }
4666*53ee8cc1Swenshuai.xi }
4667*53ee8cc1Swenshuai.xi
4668*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==TRUE)
4669*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4670*53ee8cc1Swenshuai.xi {
4671*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4672*53ee8cc1Swenshuai.xi {
4673*53ee8cc1Swenshuai.xi if(_u8Chroma2Ci==_u8Comp_ident[ci])
4674*53ee8cc1Swenshuai.xi {
4675*53ee8cc1Swenshuai.xi chroma2_ci = ci;
4676*53ee8cc1Swenshuai.xi break;
4677*53ee8cc1Swenshuai.xi }
4678*53ee8cc1Swenshuai.xi }
4679*53ee8cc1Swenshuai.xi }
4680*53ee8cc1Swenshuai.xi #endif
4681*53ee8cc1Swenshuai.xi
4682*53ee8cc1Swenshuai.xi dc_tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4683*53ee8cc1Swenshuai.xi dc_tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4684*53ee8cc1Swenshuai.xi
4685*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteGrpinf()
4686*53ee8cc1Swenshuai.xi #if 0
4687*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4688*53ee8cc1Swenshuai.xi {
4689*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4690*53ee8cc1Swenshuai.xi valid = 0;
4691*53ee8cc1Swenshuai.xi else
4692*53ee8cc1Swenshuai.xi valid = 1;
4693*53ee8cc1Swenshuai.xi
4694*53ee8cc1Swenshuai.xi if ( valid )
4695*53ee8cc1Swenshuai.xi {
4696*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] << 4 );
4697*53ee8cc1Swenshuai.xi }
4698*53ee8cc1Swenshuai.xi else
4699*53ee8cc1Swenshuai.xi {
4700*53ee8cc1Swenshuai.xi reg_value = 0;
4701*53ee8cc1Swenshuai.xi }
4702*53ee8cc1Swenshuai.xi
4703*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4704*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4705*53ee8cc1Swenshuai.xi }
4706*53ee8cc1Swenshuai.xi
4707*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4708*53ee8cc1Swenshuai.xi {
4709*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4710*53ee8cc1Swenshuai.xi valid = 0;
4711*53ee8cc1Swenshuai.xi else
4712*53ee8cc1Swenshuai.xi valid = 1;
4713*53ee8cc1Swenshuai.xi
4714*53ee8cc1Swenshuai.xi if ( valid )
4715*53ee8cc1Swenshuai.xi {
4716*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] << 4 );
4717*53ee8cc1Swenshuai.xi }
4718*53ee8cc1Swenshuai.xi else
4719*53ee8cc1Swenshuai.xi {
4720*53ee8cc1Swenshuai.xi reg_value = 0;
4721*53ee8cc1Swenshuai.xi }
4722*53ee8cc1Swenshuai.xi
4723*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4724*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4725*53ee8cc1Swenshuai.xi }
4726*53ee8cc1Swenshuai.xi #endif
4727*53ee8cc1Swenshuai.xi
4728*53ee8cc1Swenshuai.xi ac_tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4729*53ee8cc1Swenshuai.xi ac_tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4730*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteGrpinf()
4731*53ee8cc1Swenshuai.xi #if 0
4732*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4733*53ee8cc1Swenshuai.xi {
4734*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4735*53ee8cc1Swenshuai.xi valid = 0;
4736*53ee8cc1Swenshuai.xi else
4737*53ee8cc1Swenshuai.xi valid = 1;
4738*53ee8cc1Swenshuai.xi
4739*53ee8cc1Swenshuai.xi if ( valid )
4740*53ee8cc1Swenshuai.xi {
4741*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] );
4742*53ee8cc1Swenshuai.xi }
4743*53ee8cc1Swenshuai.xi else
4744*53ee8cc1Swenshuai.xi {
4745*53ee8cc1Swenshuai.xi reg_value = 0;
4746*53ee8cc1Swenshuai.xi }
4747*53ee8cc1Swenshuai.xi
4748*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4749*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4750*53ee8cc1Swenshuai.xi }
4751*53ee8cc1Swenshuai.xi
4752*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4753*53ee8cc1Swenshuai.xi {
4754*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4755*53ee8cc1Swenshuai.xi valid = 0;
4756*53ee8cc1Swenshuai.xi else
4757*53ee8cc1Swenshuai.xi valid = 1;
4758*53ee8cc1Swenshuai.xi
4759*53ee8cc1Swenshuai.xi if ( valid )
4760*53ee8cc1Swenshuai.xi {
4761*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] );
4762*53ee8cc1Swenshuai.xi }
4763*53ee8cc1Swenshuai.xi else
4764*53ee8cc1Swenshuai.xi {
4765*53ee8cc1Swenshuai.xi reg_value = 0;
4766*53ee8cc1Swenshuai.xi }
4767*53ee8cc1Swenshuai.xi
4768*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4769*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4770*53ee8cc1Swenshuai.xi }
4771*53ee8cc1Swenshuai.xi #endif
4772*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==TRUE)
4773*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4774*53ee8cc1Swenshuai.xi {
4775*53ee8cc1Swenshuai.xi dc_tbl_num_chroma2 = _u8Comp_dc_tab[chroma2_ci];
4776*53ee8cc1Swenshuai.xi ac_tbl_num_chroma2 = _u8Comp_ac_tab[chroma2_ci];
4777*53ee8cc1Swenshuai.xi }
4778*53ee8cc1Swenshuai.xi #endif
4779*53ee8cc1Swenshuai.xi }
4780*53ee8cc1Swenshuai.xi else
4781*53ee8cc1Swenshuai.xi {
4782*53ee8cc1Swenshuai.xi #if 0
4783*53ee8cc1Swenshuai.xi for( i = 0; i < 128; i++ )
4784*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, g16GRPINFO_TBL[i]);
4785*53ee8cc1Swenshuai.xi #endif
4786*53ee8cc1Swenshuai.xi }
4787*53ee8cc1Swenshuai.xi
4788*53ee8cc1Swenshuai.xi structGrpinf.DHT = _HeadCheck.DHT;
4789*53ee8cc1Swenshuai.xi structGrpinf.bUVHuffman = bIs3HuffTbl;
4790*53ee8cc1Swenshuai.xi structGrpinf.u8DcLumaSymbol = _Huff_info[dc_tbl_num_luma].u8Symbol;
4791*53ee8cc1Swenshuai.xi structGrpinf.u16DcLumaCode = _Huff_info[dc_tbl_num_luma].u16Code;
4792*53ee8cc1Swenshuai.xi structGrpinf.u8DcChromaSymbol = _Huff_info[dc_tbl_num_chroma].u8Symbol;
4793*53ee8cc1Swenshuai.xi structGrpinf.u16DcChromaCode = _Huff_info[dc_tbl_num_chroma].u16Code;
4794*53ee8cc1Swenshuai.xi structGrpinf.u8AcLumaSymbol = _Huff_info[ac_tbl_num_luma].u8Symbol;
4795*53ee8cc1Swenshuai.xi structGrpinf.u16AcLumaCode = _Huff_info[ac_tbl_num_luma].u16Code;
4796*53ee8cc1Swenshuai.xi structGrpinf.u8AcChromaSymbol = _Huff_info[ac_tbl_num_chroma].u8Symbol;
4797*53ee8cc1Swenshuai.xi structGrpinf.u16AcChromaCode = _Huff_info[ac_tbl_num_chroma].u16Code;
4798*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==TRUE)
4799*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4800*53ee8cc1Swenshuai.xi {
4801*53ee8cc1Swenshuai.xi structGrpinf.u8DcChroma2Symbol = _Huff_info[dc_tbl_num_chroma2].u8Symbol;
4802*53ee8cc1Swenshuai.xi structGrpinf.u16DcChroma2Code = _Huff_info[dc_tbl_num_chroma2].u16Code;
4803*53ee8cc1Swenshuai.xi structGrpinf.u8AcChroma2Symbol = _Huff_info[ac_tbl_num_chroma2].u8Symbol;
4804*53ee8cc1Swenshuai.xi structGrpinf.u16AcChroma2Code = _Huff_info[ac_tbl_num_chroma2].u16Code;
4805*53ee8cc1Swenshuai.xi }
4806*53ee8cc1Swenshuai.xi #endif
4807*53ee8cc1Swenshuai.xi MDrv_JPD_WriteGrpinf(structGrpinf);
4808*53ee8cc1Swenshuai.xi }
4809*53ee8cc1Swenshuai.xi #endif /* #ifndef CMODEL */
4810*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4811*53ee8cc1Swenshuai.xi // Write RLE result
JPEG_write_RLE(JPEG_SVLD * pVld,MS_BOOL bDecodeNow)4812*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_write_RLE(JPEG_SVLD *pVld, MS_BOOL bDecodeNow)
4813*53ee8cc1Swenshuai.xi {
4814*53ee8cc1Swenshuai.xi #ifdef CMODEL
4815*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);
4816*53ee8cc1Swenshuai.xi #else
4817*53ee8cc1Swenshuai.xi MS_U8 *mrc_buffer = (MS_U8 *) MRC_BUFFER_ADDR;
4818*53ee8cc1Swenshuai.xi MS_U16 status;
4819*53ee8cc1Swenshuai.xi MS_U32 start_time;
4820*53ee8cc1Swenshuai.xi MS_U16 cur_vIdx;
4821*53ee8cc1Swenshuai.xi
4822*53ee8cc1Swenshuai.xi JPEG_memcpy((void *)(mrc_buffer + _u32RLEOffset), (void *)pVld, 4);
4823*53ee8cc1Swenshuai.xi _u32RLEOffset += 4;
4824*53ee8cc1Swenshuai.xi
4825*53ee8cc1Swenshuai.xi // Check if buffer full
4826*53ee8cc1Swenshuai.xi if((MRC_BUFFER_SIZE == _u32RLEOffset)
4827*53ee8cc1Swenshuai.xi || (TRUE == bDecodeNow))
4828*53ee8cc1Swenshuai.xi {
4829*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Do RLE, LENG 0x%lx, bDecodeNow = %d\n", _u32RLEOffset, bDecodeNow);
4830*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CPU Sync and Flush Memory~~~~\n");
4831*53ee8cc1Swenshuai.xi MAsm_CPU_Sync();
4832*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
4833*53ee8cc1Swenshuai.xi
4834*53ee8cc1Swenshuai.xi if(_bFirstRLE == TRUE)
4835*53ee8cc1Swenshuai.xi {
4836*53ee8cc1Swenshuai.xi // Trigger JPD decoding
4837*53ee8cc1Swenshuai.xi if(!JPEG_StartDecode())
4838*53ee8cc1Swenshuai.xi return FALSE;
4839*53ee8cc1Swenshuai.xi _bFirstRLE = FALSE;
4840*53ee8cc1Swenshuai.xi }
4841*53ee8cc1Swenshuai.xi else
4842*53ee8cc1Swenshuai.xi {
4843*53ee8cc1Swenshuai.xi // clear MRC low/high portion read complete event
4844*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE | E_JPD_EVENT_MRBL_DONE);
4845*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE | E_JPD_EVENT_MRBL_DONE);
4846*53ee8cc1Swenshuai.xi // mark low/high buffer valid
4847*53ee8cc1Swenshuai.xi //MDrv_Write2Byte( BK_JPD_MCONFIG, (MDrv_Read2Byte(BK_JPD_MCONFIG) & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
4848*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
4849*53ee8cc1Swenshuai.xi }
4850*53ee8cc1Swenshuai.xi
4851*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
4852*53ee8cc1Swenshuai.xi start_time = MsOS_GetSystemTime();
4853*53ee8cc1Swenshuai.xi #else
4854*53ee8cc1Swenshuai.xi start_time = 0;
4855*53ee8cc1Swenshuai.xi #endif
4856*53ee8cc1Swenshuai.xi //cur_vIdx = MDrv_Read2Byte(BK_JPD_CUR_VIDX);
4857*53ee8cc1Swenshuai.xi cur_vIdx = MDrv_JPD_GetCurVidx();
4858*53ee8cc1Swenshuai.xi
4859*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("cur_vIdx = 0x%04X\n",cur_vIdx);
4860*53ee8cc1Swenshuai.xi
4861*53ee8cc1Swenshuai.xi if( bDecodeNow )
4862*53ee8cc1Swenshuai.xi {
4863*53ee8cc1Swenshuai.xi return TRUE; //wait done in main loop
4864*53ee8cc1Swenshuai.xi }
4865*53ee8cc1Swenshuai.xi
4866*53ee8cc1Swenshuai.xi while(1)
4867*53ee8cc1Swenshuai.xi {
4868*53ee8cc1Swenshuai.xi //status = MDrv_JPD_ReadJPDStatus();
4869*53ee8cc1Swenshuai.xi status = MDrv_JPD_GetEventFlag();
4870*53ee8cc1Swenshuai.xi
4871*53ee8cc1Swenshuai.xi if(status & E_JPD_EVENT_DEC_DONE)
4872*53ee8cc1Swenshuai.xi {
4873*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("P deocde done\n");
4874*53ee8cc1Swenshuai.xi break;
4875*53ee8cc1Swenshuai.xi }
4876*53ee8cc1Swenshuai.xi
4877*53ee8cc1Swenshuai.xi if((status & E_JPD_EVENT_ECS_ERROR) || (status & E_JPD_EVENT_IS_ERROR) || (status & E_JPD_EVENT_RST_ERROR)
4878*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_AUTO_PROTECT==TRUE)
4879*53ee8cc1Swenshuai.xi || (status & E_JPD_EVENT_MWB_FULL)
4880*53ee8cc1Swenshuai.xi #endif
4881*53ee8cc1Swenshuai.xi )
4882*53ee8cc1Swenshuai.xi {
4883*53ee8cc1Swenshuai.xi // temp patch for protect JPD from writing to illegal memory
4884*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CurVidx = %d, CurRow = %d, CurCol = %d ",
4885*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurVidx(),
4886*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurRow(),
4887*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurCol());
4888*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%lx\n", MDrv_JPD_GetCurMRCAddr());
4889*53ee8cc1Swenshuai.xi //MDrv_JPD_SW_Pause_Reset();
4890*53ee8cc1Swenshuai.xi MDrv_JPD_Rst();
4891*53ee8cc1Swenshuai.xi
4892*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_JPD_DECODE_ERROR );
4893*53ee8cc1Swenshuai.xi return FALSE;
4894*53ee8cc1Swenshuai.xi }
4895*53ee8cc1Swenshuai.xi
4896*53ee8cc1Swenshuai.xi if((status & E_JPD_EVENT_MRBH_DONE) && (status & E_JPD_EVENT_MRBL_DONE))
4897*53ee8cc1Swenshuai.xi {
4898*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Partial SVLD decode done\n");
4899*53ee8cc1Swenshuai.xi break;
4900*53ee8cc1Swenshuai.xi }
4901*53ee8cc1Swenshuai.xi
4902*53ee8cc1Swenshuai.xi // Check the V index. If it is not changed withing 500ms, it means that the JPD has some problem.
4903*53ee8cc1Swenshuai.xi // We need to break the infinite loop
4904*53ee8cc1Swenshuai.xi //if(cur_vIdx!=MDrv_Read2Byte(BK_JPD_CUR_VIDX))
4905*53ee8cc1Swenshuai.xi if(cur_vIdx != MDrv_JPD_GetCurVidx())
4906*53ee8cc1Swenshuai.xi {
4907*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
4908*53ee8cc1Swenshuai.xi start_time = MsOS_GetSystemTime();
4909*53ee8cc1Swenshuai.xi #else
4910*53ee8cc1Swenshuai.xi start_time = 0;
4911*53ee8cc1Swenshuai.xi #endif
4912*53ee8cc1Swenshuai.xi //cur_vIdx = MDrv_Read2Byte(BK_JPD_CUR_VIDX);
4913*53ee8cc1Swenshuai.xi cur_vIdx = MDrv_JPD_GetCurVidx();
4914*53ee8cc1Swenshuai.xi }
4915*53ee8cc1Swenshuai.xi else
4916*53ee8cc1Swenshuai.xi {
4917*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
4918*53ee8cc1Swenshuai.xi if((MsOS_GetSystemTime() - start_time) >= DEFAULT_DECODE_TIMEOUT)
4919*53ee8cc1Swenshuai.xi #else
4920*53ee8cc1Swenshuai.xi if(start_time++ >= DEFAULT_DECODE_TIMEOUT * 100)
4921*53ee8cc1Swenshuai.xi #endif
4922*53ee8cc1Swenshuai.xi {
4923*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("ERROR: SVLD deocde time out, VIdx %d\n", cur_vIdx);
4924*53ee8cc1Swenshuai.xi return FALSE;
4925*53ee8cc1Swenshuai.xi }
4926*53ee8cc1Swenshuai.xi }
4927*53ee8cc1Swenshuai.xi }
4928*53ee8cc1Swenshuai.xi
4929*53ee8cc1Swenshuai.xi _u32RLEOffset = 0;
4930*53ee8cc1Swenshuai.xi }
4931*53ee8cc1Swenshuai.xi #endif
4932*53ee8cc1Swenshuai.xi return TRUE;
4933*53ee8cc1Swenshuai.xi }
4934*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4935*53ee8cc1Swenshuai.xi // Do run length encode of coefficient buffer
4936*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)4937*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_do_RLE(JPEG_BLOCK_TYPE *p, MS_BOOL eop, MS_U8 comp_id, MS_BOOL BlockInRange)
4938*53ee8cc1Swenshuai.xi {
4939*53ee8cc1Swenshuai.xi JPEG_SVLD my_vld;
4940*53ee8cc1Swenshuai.xi MS_U8 counter;
4941*53ee8cc1Swenshuai.xi MS_S16 value;
4942*53ee8cc1Swenshuai.xi MS_U16 run;
4943*53ee8cc1Swenshuai.xi MS_U8 cur_blk;
4944*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE predictor;
4945*53ee8cc1Swenshuai.xi
4946*53ee8cc1Swenshuai.xi if(comp_id==0)
4947*53ee8cc1Swenshuai.xi cur_blk = 1; // Y
4948*53ee8cc1Swenshuai.xi else if(comp_id==1)
4949*53ee8cc1Swenshuai.xi cur_blk = 3; // U
4950*53ee8cc1Swenshuai.xi else
4951*53ee8cc1Swenshuai.xi cur_blk = 2; // V
4952*53ee8cc1Swenshuai.xi
4953*53ee8cc1Swenshuai.xi predictor = _s16dc_pred[cur_blk - 1];
4954*53ee8cc1Swenshuai.xi
4955*53ee8cc1Swenshuai.xi run = 0;
4956*53ee8cc1Swenshuai.xi my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4957*53ee8cc1Swenshuai.xi my_vld.blk_type = cur_blk;
4958*53ee8cc1Swenshuai.xi
4959*53ee8cc1Swenshuai.xi //sent DC info
4960*53ee8cc1Swenshuai.xi //// my_vld.run = 8;
4961*53ee8cc1Swenshuai.xi if( BlockInRange )//Current block is within display range.
4962*53ee8cc1Swenshuai.xi my_vld.run = 8;
4963*53ee8cc1Swenshuai.xi else
4964*53ee8cc1Swenshuai.xi my_vld.run = 0;
4965*53ee8cc1Swenshuai.xi
4966*53ee8cc1Swenshuai.xi value = (p[0] - predictor);
4967*53ee8cc1Swenshuai.xi my_vld.sign = (value<0)?1:0;
4968*53ee8cc1Swenshuai.xi my_vld.amp = JPEG_ABS(value);
4969*53ee8cc1Swenshuai.xi my_vld.sym_type = E_RLE_DC;
4970*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, FALSE))
4971*53ee8cc1Swenshuai.xi return FALSE;
4972*53ee8cc1Swenshuai.xi
4973*53ee8cc1Swenshuai.xi if( BlockInRange == FALSE )//Current block is not within display range.
4974*53ee8cc1Swenshuai.xi return TRUE;
4975*53ee8cc1Swenshuai.xi
4976*53ee8cc1Swenshuai.xi my_vld.byte0 = my_vld.byte1 =my_vld.byte2 = my_vld.byte3= 0;
4977*53ee8cc1Swenshuai.xi my_vld.blk_type = cur_blk;
4978*53ee8cc1Swenshuai.xi
4979*53ee8cc1Swenshuai.xi for(counter = 1;counter<64; counter++)
4980*53ee8cc1Swenshuai.xi {
4981*53ee8cc1Swenshuai.xi if(p[counter]==0)
4982*53ee8cc1Swenshuai.xi {
4983*53ee8cc1Swenshuai.xi run++;
4984*53ee8cc1Swenshuai.xi }
4985*53ee8cc1Swenshuai.xi else
4986*53ee8cc1Swenshuai.xi {
4987*53ee8cc1Swenshuai.xi while(run>15)
4988*53ee8cc1Swenshuai.xi {
4989*53ee8cc1Swenshuai.xi my_vld.sign = 0;
4990*53ee8cc1Swenshuai.xi my_vld.amp = 0;
4991*53ee8cc1Swenshuai.xi my_vld.sym_type = E_RLE_ZRL;
4992*53ee8cc1Swenshuai.xi my_vld.run = 15;
4993*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, FALSE))
4994*53ee8cc1Swenshuai.xi return FALSE;
4995*53ee8cc1Swenshuai.xi my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4996*53ee8cc1Swenshuai.xi my_vld.blk_type = cur_blk;
4997*53ee8cc1Swenshuai.xi run -= 16;
4998*53ee8cc1Swenshuai.xi }
4999*53ee8cc1Swenshuai.xi
5000*53ee8cc1Swenshuai.xi my_vld.sign = (p[counter]<0)?1:0;
5001*53ee8cc1Swenshuai.xi my_vld.amp = JPEG_ABS(p[counter]);
5002*53ee8cc1Swenshuai.xi my_vld.sym_type = E_RLE_AC;
5003*53ee8cc1Swenshuai.xi my_vld.run = run;
5004*53ee8cc1Swenshuai.xi
5005*53ee8cc1Swenshuai.xi // Check if the last byte is non-zero. If it's non-zero & EOP, add the EOP flag
5006*53ee8cc1Swenshuai.xi if(counter==63&&eop&&p[63]!=0)
5007*53ee8cc1Swenshuai.xi {
5008*53ee8cc1Swenshuai.xi my_vld.EOP = 1;
5009*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, TRUE))
5010*53ee8cc1Swenshuai.xi return FALSE;
5011*53ee8cc1Swenshuai.xi
5012*53ee8cc1Swenshuai.xi _s16dc_pred[cur_blk - 1] = p[0];//update predictor
5013*53ee8cc1Swenshuai.xi return TRUE;
5014*53ee8cc1Swenshuai.xi }
5015*53ee8cc1Swenshuai.xi else
5016*53ee8cc1Swenshuai.xi {
5017*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, FALSE))
5018*53ee8cc1Swenshuai.xi return FALSE;
5019*53ee8cc1Swenshuai.xi }
5020*53ee8cc1Swenshuai.xi
5021*53ee8cc1Swenshuai.xi my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
5022*53ee8cc1Swenshuai.xi my_vld.blk_type = cur_blk;
5023*53ee8cc1Swenshuai.xi run = 0;
5024*53ee8cc1Swenshuai.xi }
5025*53ee8cc1Swenshuai.xi }
5026*53ee8cc1Swenshuai.xi
5027*53ee8cc1Swenshuai.xi counter = 63;
5028*53ee8cc1Swenshuai.xi
5029*53ee8cc1Swenshuai.xi if(p[counter]==0)
5030*53ee8cc1Swenshuai.xi {
5031*53ee8cc1Swenshuai.xi my_vld.amp = JPEG_ABS(p[counter]);
5032*53ee8cc1Swenshuai.xi my_vld.sign = p[counter]<0?1:0;
5033*53ee8cc1Swenshuai.xi my_vld.sym_type = E_RLE_EOB;
5034*53ee8cc1Swenshuai.xi my_vld.run = 0;
5035*53ee8cc1Swenshuai.xi if(eop)
5036*53ee8cc1Swenshuai.xi {
5037*53ee8cc1Swenshuai.xi my_vld.EOP = 1;
5038*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, TRUE))
5039*53ee8cc1Swenshuai.xi return FALSE;
5040*53ee8cc1Swenshuai.xi }
5041*53ee8cc1Swenshuai.xi else
5042*53ee8cc1Swenshuai.xi {
5043*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, FALSE))
5044*53ee8cc1Swenshuai.xi return FALSE;
5045*53ee8cc1Swenshuai.xi }
5046*53ee8cc1Swenshuai.xi }
5047*53ee8cc1Swenshuai.xi
5048*53ee8cc1Swenshuai.xi _s16dc_pred[cur_blk - 1] = p[0];//update predictor
5049*53ee8cc1Swenshuai.xi return TRUE;
5050*53ee8cc1Swenshuai.xi }
5051*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5052*53ee8cc1Swenshuai.xi // Starts a new scan.
JPEG_init_scan(void)5053*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_scan(void)
5054*53ee8cc1Swenshuai.xi {
5055*53ee8cc1Swenshuai.xi if (!JPEG_locate_sos_marker())
5056*53ee8cc1Swenshuai.xi return FALSE;
5057*53ee8cc1Swenshuai.xi
5058*53ee8cc1Swenshuai.xi JPEG_calc_mcu_block_order();
5059*53ee8cc1Swenshuai.xi
5060*53ee8cc1Swenshuai.xi if (_HeadCheck.DHT)
5061*53ee8cc1Swenshuai.xi {
5062*53ee8cc1Swenshuai.xi if(!JPEG_check_huff_tables())
5063*53ee8cc1Swenshuai.xi return FALSE;
5064*53ee8cc1Swenshuai.xi }
5065*53ee8cc1Swenshuai.xi
5066*53ee8cc1Swenshuai.xi if (_HeadCheck.DQT)
5067*53ee8cc1Swenshuai.xi {
5068*53ee8cc1Swenshuai.xi if(!JPEG_check_quant_tables())
5069*53ee8cc1Swenshuai.xi return FALSE;
5070*53ee8cc1Swenshuai.xi }
5071*53ee8cc1Swenshuai.xi
5072*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
5073*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u32Last_dc_val, 0, _u8Comps_in_frame * sizeof( MS_U32 ) );
5074*53ee8cc1Swenshuai.xi
5075*53ee8cc1Swenshuai.xi _u32EOB_run = 0;
5076*53ee8cc1Swenshuai.xi #endif
5077*53ee8cc1Swenshuai.xi
5078*53ee8cc1Swenshuai.xi if ( _u16Restart_interval )
5079*53ee8cc1Swenshuai.xi {
5080*53ee8cc1Swenshuai.xi _u16Restarts_left = _u16Restart_interval;
5081*53ee8cc1Swenshuai.xi _u16Next_restart_num = 0;
5082*53ee8cc1Swenshuai.xi }
5083*53ee8cc1Swenshuai.xi
5084*53ee8cc1Swenshuai.xi //// _Total_Decoded_Size = (MS_S32)JPEG_GetECS();
5085*53ee8cc1Swenshuai.xi
5086*53ee8cc1Swenshuai.xi #ifdef CMODEL
5087*53ee8cc1Swenshuai.xi {
5088*53ee8cc1Swenshuai.xi // pre-fill bit buffer for later decoding
5089*53ee8cc1Swenshuai.xi _s16Bits_left = 16;
5090*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5091*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5092*53ee8cc1Swenshuai.xi }
5093*53ee8cc1Swenshuai.xi #else
5094*53ee8cc1Swenshuai.xi {
5095*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5096*53ee8cc1Swenshuai.xi if(_bProgressive_flag
5097*53ee8cc1Swenshuai.xi || (E_JPEG_CMYK == gu8Scan_type)
5098*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5099*53ee8cc1Swenshuai.xi #else
5100*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
5101*53ee8cc1Swenshuai.xi #endif
5102*53ee8cc1Swenshuai.xi {
5103*53ee8cc1Swenshuai.xi // pre-fill bit buffer for later decoding
5104*53ee8cc1Swenshuai.xi _s16Bits_left = 16;
5105*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5106*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5107*53ee8cc1Swenshuai.xi }
5108*53ee8cc1Swenshuai.xi }
5109*53ee8cc1Swenshuai.xi #endif
5110*53ee8cc1Swenshuai.xi
5111*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_init_scan:ECS 0x%08lx\n", JPEG_GetECS());
5112*53ee8cc1Swenshuai.xi
5113*53ee8cc1Swenshuai.xi return TRUE;
5114*53ee8cc1Swenshuai.xi }
5115*53ee8cc1Swenshuai.xi
5116*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5117*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5118*53ee8cc1Swenshuai.xi // Create a few tables that allow us to quickly convert YCbCr to RGB.
msAPI_JPEG_create_look_ups(void)5119*53ee8cc1Swenshuai.xi JPEG_STATIC void msAPI_JPEG_create_look_ups( void )
5120*53ee8cc1Swenshuai.xi {
5121*53ee8cc1Swenshuai.xi MS_S16 i, k;
5122*53ee8cc1Swenshuai.xi //kevinhuang, modify
5123*53ee8cc1Swenshuai.xi /*
5124*53ee8cc1Swenshuai.xi for (i = 0; i <= 255; i++)
5125*53ee8cc1Swenshuai.xi {
5126*53ee8cc1Swenshuai.xi //k = (i * 2) - 255;
5127*53ee8cc1Swenshuai.xi k = (i * 2) - 256; // Dec. 28 2001- change so table[128] == 0
5128*53ee8cc1Swenshuai.xi gs32Crr[i] = ( FIX(1.40200/2) * k + ONE_HALF) >> SCALEBITS;
5129*53ee8cc1Swenshuai.xi gs32Cbb[i] = ( FIX(1.77200/2) * k + ONE_HALF) >> SCALEBITS;
5130*53ee8cc1Swenshuai.xi gs32Crg[i] = (-FIX(0.71414/2)) * k;
5131*53ee8cc1Swenshuai.xi gs32Cbg[i] = (-FIX(0.34414/2)) * k + ONE_HALF;
5132*53ee8cc1Swenshuai.xi }
5133*53ee8cc1Swenshuai.xi */
5134*53ee8cc1Swenshuai.xi for ( i = 0; i <= 255; i++ )
5135*53ee8cc1Swenshuai.xi {
5136*53ee8cc1Swenshuai.xi k = i - 128;
5137*53ee8cc1Swenshuai.xi
5138*53ee8cc1Swenshuai.xi gs32Crr[i] = ( FIX( 1.40200 ) * k + ONE_HALF ) >> SCALEBITS;
5139*53ee8cc1Swenshuai.xi gs32Cbb[i] = ( FIX( 1.77200 ) * k + ONE_HALF ) >> SCALEBITS;
5140*53ee8cc1Swenshuai.xi
5141*53ee8cc1Swenshuai.xi gs32Crg[i] = ( -FIX( 0.71414 ) ) * k ; //+ ONE_HALF) >> SCALEBITS;???
5142*53ee8cc1Swenshuai.xi gs32Cbg[i] = ( -FIX( 0.34414 ) ) * k + ONE_HALF; //>> SCALEBITS;???
5143*53ee8cc1Swenshuai.xi
5144*53ee8cc1Swenshuai.xi }
5145*53ee8cc1Swenshuai.xi }
5146*53ee8cc1Swenshuai.xi
5147*53ee8cc1Swenshuai.xi #endif //SW_JPD_RGB_CMYK
5148*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5149*53ee8cc1Swenshuai.xi // Starts a frame. Determines if the number of components or sampling factors
5150*53ee8cc1Swenshuai.xi // are supported.
JPEG_init_frame(void)5151*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_frame(void) //ok
5152*53ee8cc1Swenshuai.xi {
5153*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5154*53ee8cc1Swenshuai.xi MS_U32 i;
5155*53ee8cc1Swenshuai.xi MS_U8 *q;
5156*53ee8cc1Swenshuai.xi #endif
5157*53ee8cc1Swenshuai.xi
5158*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_init_frame:\n");
5159*53ee8cc1Swenshuai.xi if ( _u8Comps_in_frame == 1 )
5160*53ee8cc1Swenshuai.xi {
5161*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_GRAYSCALE;
5162*53ee8cc1Swenshuai.xi
5163*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 1;
5164*53ee8cc1Swenshuai.xi
5165*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 8;
5166*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 8;
5167*53ee8cc1Swenshuai.xi }
5168*53ee8cc1Swenshuai.xi else if ( _u8Comps_in_frame == 3 )
5169*53ee8cc1Swenshuai.xi {
5170*53ee8cc1Swenshuai.xi if ( ( ( _u8Comp_h_samp[1] != 1 ) || ( _u8Comp_v_samp[1] != 1 ) ) || //support only U_H1V1 & V_H1V1
5171*53ee8cc1Swenshuai.xi ( ( _u8Comp_h_samp[2] != 1 ) || ( _u8Comp_v_samp[2] != 1 ) ) )
5172*53ee8cc1Swenshuai.xi {
5173*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5174*53ee8cc1Swenshuai.xi return FALSE;
5175*53ee8cc1Swenshuai.xi }
5176*53ee8cc1Swenshuai.xi
5177*53ee8cc1Swenshuai.xi if ( ( _u8Comp_h_samp[0] == 1 ) && ( _u8Comp_v_samp[0] == 1 ) )
5178*53ee8cc1Swenshuai.xi {
5179*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5180*53ee8cc1Swenshuai.xi //set RGB based jpeg flag
5181*53ee8cc1Swenshuai.xi if(_u8Comp_ident[0] == 82 || _u8Comp_ident[0] == 71 || _u8Comp_ident[0] == 66)
5182*53ee8cc1Swenshuai.xi {
5183*53ee8cc1Swenshuai.xi if( FALSE == bEnableRGB )
5184*53ee8cc1Swenshuai.xi {
5185*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5186*53ee8cc1Swenshuai.xi return FALSE;
5187*53ee8cc1Swenshuai.xi }
5188*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Get JPEG_RGB\n");
5189*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_RGB; //RGB
5190*53ee8cc1Swenshuai.xi }
5191*53ee8cc1Swenshuai.xi else
5192*53ee8cc1Swenshuai.xi #endif
5193*53ee8cc1Swenshuai.xi {
5194*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Get JPEG_YH1V1\n");
5195*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_YH1V1; //4:4:4
5196*53ee8cc1Swenshuai.xi }
5197*53ee8cc1Swenshuai.xi
5198*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 3;
5199*53ee8cc1Swenshuai.xi
5200*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 8;
5201*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 8;
5202*53ee8cc1Swenshuai.xi }
5203*53ee8cc1Swenshuai.xi else if ( ( _u8Comp_h_samp[0] == 2 ) && ( _u8Comp_v_samp[0] == 1 ) )
5204*53ee8cc1Swenshuai.xi {
5205*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_YH2V1; //4:2:2
5206*53ee8cc1Swenshuai.xi
5207*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 4;
5208*53ee8cc1Swenshuai.xi
5209*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 16;
5210*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 8;
5211*53ee8cc1Swenshuai.xi }
5212*53ee8cc1Swenshuai.xi else if ( ( _u8Comp_h_samp[0] == 1 ) && ( _u8Comp_v_samp[0] == 2 ) )
5213*53ee8cc1Swenshuai.xi {
5214*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_YH1V2;
5215*53ee8cc1Swenshuai.xi
5216*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 4;
5217*53ee8cc1Swenshuai.xi
5218*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 8;
5219*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 16;
5220*53ee8cc1Swenshuai.xi }
5221*53ee8cc1Swenshuai.xi else if ( ( _u8Comp_h_samp[0] == 2 ) && ( _u8Comp_v_samp[0] == 2 ) )
5222*53ee8cc1Swenshuai.xi {
5223*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_YH2V2; //4:2:0
5224*53ee8cc1Swenshuai.xi
5225*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 6;
5226*53ee8cc1Swenshuai.xi
5227*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 16;
5228*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 16;
5229*53ee8cc1Swenshuai.xi }
5230*53ee8cc1Swenshuai.xi else if ( ( _u8Comp_h_samp[0] == 4 ) && ( _u8Comp_v_samp[0] == 1 ) )
5231*53ee8cc1Swenshuai.xi {
5232*53ee8cc1Swenshuai.xi // 4:1:1
5233*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_YH4V1;
5234*53ee8cc1Swenshuai.xi
5235*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 6;
5236*53ee8cc1Swenshuai.xi
5237*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 32;
5238*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 8;
5239*53ee8cc1Swenshuai.xi //#if CMODEL
5240*53ee8cc1Swenshuai.xi //JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5241*53ee8cc1Swenshuai.xi //#endif
5242*53ee8cc1Swenshuai.xi }
5243*53ee8cc1Swenshuai.xi else
5244*53ee8cc1Swenshuai.xi {
5245*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5246*53ee8cc1Swenshuai.xi return FALSE;
5247*53ee8cc1Swenshuai.xi }
5248*53ee8cc1Swenshuai.xi }
5249*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5250*53ee8cc1Swenshuai.xi else if(_u8Comps_in_frame == 4) //handle YCCK & CMYK case, must distinguish YCCK and CMYK later
5251*53ee8cc1Swenshuai.xi {
5252*53ee8cc1Swenshuai.xi if( FALSE == bEnableCMYK )
5253*53ee8cc1Swenshuai.xi {
5254*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5255*53ee8cc1Swenshuai.xi return FALSE;
5256*53ee8cc1Swenshuai.xi }
5257*53ee8cc1Swenshuai.xi
5258*53ee8cc1Swenshuai.xi if ( ( _u8Comp_h_samp[0] == 1 ) && ( _u8Comp_v_samp[0] == 1 ) )
5259*53ee8cc1Swenshuai.xi {
5260*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Get JPEG_CMYK\n");
5261*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_CMYK;
5262*53ee8cc1Swenshuai.xi
5263*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 4;
5264*53ee8cc1Swenshuai.xi
5265*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 8;
5266*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 8;
5267*53ee8cc1Swenshuai.xi }
5268*53ee8cc1Swenshuai.xi else
5269*53ee8cc1Swenshuai.xi {
5270*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5271*53ee8cc1Swenshuai.xi return FALSE;
5272*53ee8cc1Swenshuai.xi }
5273*53ee8cc1Swenshuai.xi }
5274*53ee8cc1Swenshuai.xi #endif
5275*53ee8cc1Swenshuai.xi else
5276*53ee8cc1Swenshuai.xi {
5277*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5278*53ee8cc1Swenshuai.xi return FALSE;
5279*53ee8cc1Swenshuai.xi }
5280*53ee8cc1Swenshuai.xi
5281*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_init_frame:gu8Scan_type = %d\n", gu8Scan_type);
5282*53ee8cc1Swenshuai.xi
5283*53ee8cc1Swenshuai.xi gu16Max_mcus_per_row = ( _u16Image_x_size + ( gu8Max_mcu_x_size - 1 ) ) / gu8Max_mcu_x_size;
5284*53ee8cc1Swenshuai.xi _u16Max_mcus_per_col = ( _u16Image_y_size + ( gu8Max_mcu_y_size - 1 ) ) / gu8Max_mcu_y_size;
5285*53ee8cc1Swenshuai.xi
5286*53ee8cc1Swenshuai.xi #ifdef CMODEL
5287*53ee8cc1Swenshuai.xi /* these values are for the *destination* pixels: after conversion */
5288*53ee8cc1Swenshuai.xi
5289*53ee8cc1Swenshuai.xi if ( E_JPEG_GRAYSCALE == gu8Scan_type )
5290*53ee8cc1Swenshuai.xi {
5291*53ee8cc1Swenshuai.xi gu8Dest_bytes_per_pixel = 1;
5292*53ee8cc1Swenshuai.xi }
5293*53ee8cc1Swenshuai.xi else
5294*53ee8cc1Swenshuai.xi //kevinhuang, ToDo 4 -> 3 later
5295*53ee8cc1Swenshuai.xi {
5296*53ee8cc1Swenshuai.xi gu8Dest_bytes_per_pixel = 4;
5297*53ee8cc1Swenshuai.xi }
5298*53ee8cc1Swenshuai.xi
5299*53ee8cc1Swenshuai.xi gu16Dest_bytes_per_scan_line = ( ( _u16Image_x_size + 15 ) & 0xFFF0 ) * gu8Dest_bytes_per_pixel;
5300*53ee8cc1Swenshuai.xi gu16Real_dest_bytes_per_scan_line = ( _u16Image_x_size * gu8Dest_bytes_per_pixel );
5301*53ee8cc1Swenshuai.xi
5302*53ee8cc1Swenshuai.xi // Initialize two scan line buffers.
5303*53ee8cc1Swenshuai.xi // FIXME: Only the V2 sampling factors need two buffers.
5304*53ee8cc1Swenshuai.xi #define DC_ALIGNMENT 16
5305*53ee8cc1Swenshuai.xi //pgu8Scan_line_0 = (MS_U8 *)JPEG_alloc(gu16Dest_bytes_per_scan_line + 8);
5306*53ee8cc1Swenshuai.xi pgu8Scan_line_0 = ( MS_U8 * )JPEG_alloc( gu16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5307*53ee8cc1Swenshuai.xi if(pgu8Scan_line_0 == NULL)
5308*53ee8cc1Swenshuai.xi return FALSE;
5309*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
5310*53ee8cc1Swenshuai.xi
5311*53ee8cc1Swenshuai.xi //pgu8scan_line_1 = (MS_U8 *)JPEG_alloc(gu16Dest_bytes_per_scan_line + 8);
5312*53ee8cc1Swenshuai.xi pgu8scan_line_1 = ( MS_U8 * )JPEG_alloc( gu16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5313*53ee8cc1Swenshuai.xi if(pgu8scan_line_1 == NULL)
5314*53ee8cc1Swenshuai.xi return FALSE;
5315*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
5316*53ee8cc1Swenshuai.xi #endif
5317*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5318*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5319*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5320*53ee8cc1Swenshuai.xi {
5321*53ee8cc1Swenshuai.xi /* these values are for the *destination* pixels: after conversion */
5322*53ee8cc1Swenshuai.xi
5323*53ee8cc1Swenshuai.xi //Reset image x size by new Max_mcus
5324*53ee8cc1Swenshuai.xi _u16Image_x_size = gu16Max_mcus_per_row*gu8Max_mcu_x_size;
5325*53ee8cc1Swenshuai.xi
5326*53ee8cc1Swenshuai.xi _u16NonAlignmentImage_x_size = _u16Image_x_size;
5327*53ee8cc1Swenshuai.xi
5328*53ee8cc1Swenshuai.xi if ( E_JPEG_GRAYSCALE == gu8Scan_type )
5329*53ee8cc1Swenshuai.xi {
5330*53ee8cc1Swenshuai.xi _u8Dest_bytes_per_pixel = 1;
5331*53ee8cc1Swenshuai.xi }
5332*53ee8cc1Swenshuai.xi else
5333*53ee8cc1Swenshuai.xi //kevinhuang, ToDo 4 -> 3 later
5334*53ee8cc1Swenshuai.xi {
5335*53ee8cc1Swenshuai.xi _u8Dest_bytes_per_pixel = 4;
5336*53ee8cc1Swenshuai.xi }
5337*53ee8cc1Swenshuai.xi
5338*53ee8cc1Swenshuai.xi _u16Dest_bytes_per_scan_line = ( ( _u16Image_x_size + 15 ) & 0xFFF0 ) * _u8Dest_bytes_per_pixel;
5339*53ee8cc1Swenshuai.xi // _u16Real_dest_bytes_per_scan_line = ( _u16Image_x_size * _u8Dest_bytes_per_pixel );
5340*53ee8cc1Swenshuai.xi
5341*53ee8cc1Swenshuai.xi // Initialize two scan line buffers.
5342*53ee8cc1Swenshuai.xi // FIXME: Only the V2 sampling factors need two buffers.
5343*53ee8cc1Swenshuai.xi #define DC_ALIGNMENT 16
5344*53ee8cc1Swenshuai.xi //pgu8Scan_line_0 = (U8 *)alloc(_u16Dest_bytes_per_scan_line + 8);
5345*53ee8cc1Swenshuai.xi pgu8Scan_line_0 = ( MS_U8 * )JPEG_alloc( _u16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5346*53ee8cc1Swenshuai.xi if(pgu8Scan_line_0 == NULL)
5347*53ee8cc1Swenshuai.xi return FALSE;
5348*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
5349*53ee8cc1Swenshuai.xi
5350*53ee8cc1Swenshuai.xi //pgu8scan_line_1 = (U8 *)alloc(_u16Dest_bytes_per_scan_line + 8);
5351*53ee8cc1Swenshuai.xi pgu8scan_line_1 = ( MS_U8 * )JPEG_alloc( _u16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5352*53ee8cc1Swenshuai.xi if(pgu8scan_line_1 == NULL)
5353*53ee8cc1Swenshuai.xi return FALSE;
5354*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
5355*53ee8cc1Swenshuai.xi }
5356*53ee8cc1Swenshuai.xi #endif
5357*53ee8cc1Swenshuai.xi
5358*53ee8cc1Swenshuai.xi _u32Max_blocks_per_row = gu16Max_mcus_per_row * _u16Max_blocks_per_mcu;
5359*53ee8cc1Swenshuai.xi
5360*53ee8cc1Swenshuai.xi // Should never happen
5361*53ee8cc1Swenshuai.xi if ( _u32Max_blocks_per_row > JPEG_MAXBLOCKSPERROW )
5362*53ee8cc1Swenshuai.xi {
5363*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_ASSERTION_ERROR );
5364*53ee8cc1Swenshuai.xi return FALSE;
5365*53ee8cc1Swenshuai.xi }
5366*53ee8cc1Swenshuai.xi
5367*53ee8cc1Swenshuai.xi #ifdef CMODEL
5368*53ee8cc1Swenshuai.xi {
5369*53ee8cc1Swenshuai.xi MS_U32 i;
5370*53ee8cc1Swenshuai.xi MS_U8 *q;
5371*53ee8cc1Swenshuai.xi
5372*53ee8cc1Swenshuai.xi // Allocate the coefficient buffer, enough for one row's worth of MCU's
5373*53ee8cc1Swenshuai.xi q = ( MS_U8 * )JPEG_alloc( _u32Max_blocks_per_row * 64 * sizeof( JPEG_BLOCK_TYPE ) + 8 );
5374*53ee8cc1Swenshuai.xi if(q == NULL)
5375*53ee8cc1Swenshuai.xi return FALSE;
5376*53ee8cc1Swenshuai.xi
5377*53ee8cc1Swenshuai.xi // Align to 8-byte boundry, for MMX code
5378*53ee8cc1Swenshuai.xi q = ( MS_U8 * )( ( ( MS_U32 )q + 7 ) & ~7 );
5379*53ee8cc1Swenshuai.xi if(q == NULL)
5380*53ee8cc1Swenshuai.xi return FALSE;
5381*53ee8cc1Swenshuai.xi
5382*53ee8cc1Swenshuai.xi // The gps16Block_seg[] array's name dates back to the
5383*53ee8cc1Swenshuai.xi // 16-bit assembler implementation. "seg" stood for "segment".
5384*53ee8cc1Swenshuai.xi for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5385*53ee8cc1Swenshuai.xi {
5386*53ee8cc1Swenshuai.xi gps16Block_seg[i] = ( JPEG_BLOCK_TYPE * )( q + i * 64 * sizeof( JPEG_BLOCK_TYPE ) );
5387*53ee8cc1Swenshuai.xi }
5388*53ee8cc1Swenshuai.xi
5389*53ee8cc1Swenshuai.xi for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5390*53ee8cc1Swenshuai.xi {
5391*53ee8cc1Swenshuai.xi gu8Block_max_zag_set[i] = 64;
5392*53ee8cc1Swenshuai.xi }
5393*53ee8cc1Swenshuai.xi
5394*53ee8cc1Swenshuai.xi gpu8Sample_buf = ( MS_U8 * )( ( ( MS_U32 )JPEG_alloc( _u32Max_blocks_per_row * 64 + 8 ) + 7 ) & ~7 );
5395*53ee8cc1Swenshuai.xi if(gpu8Sample_buf == NULL)
5396*53ee8cc1Swenshuai.xi return FALSE;
5397*53ee8cc1Swenshuai.xi
5398*53ee8cc1Swenshuai.xi JPEG_CMODEL_create_look_ups();
5399*53ee8cc1Swenshuai.xi }
5400*53ee8cc1Swenshuai.xi #endif
5401*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5402*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5403*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5404*53ee8cc1Swenshuai.xi {
5405*53ee8cc1Swenshuai.xi // Allocate the coefficient buffer, enough for one row's worth of MCU's
5406*53ee8cc1Swenshuai.xi q = ( MS_U8 * )JPEG_alloc( _u32Max_blocks_per_row * 64 * sizeof( JPEG_BLOCK_TYPE ) + 8 );
5407*53ee8cc1Swenshuai.xi if(q == NULL)
5408*53ee8cc1Swenshuai.xi return FALSE;
5409*53ee8cc1Swenshuai.xi
5410*53ee8cc1Swenshuai.xi // Align to 8-byte boundry, for MMX code
5411*53ee8cc1Swenshuai.xi q = ( MS_U8 * )( ( ( MS_U32 )q + 7 ) & ~7 );
5412*53ee8cc1Swenshuai.xi
5413*53ee8cc1Swenshuai.xi // The _ps16Block_seg[] array's name dates back to the
5414*53ee8cc1Swenshuai.xi // 16-bit assembler implementation. "seg" stood for "segment".
5415*53ee8cc1Swenshuai.xi for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5416*53ee8cc1Swenshuai.xi {
5417*53ee8cc1Swenshuai.xi _ps16Block_seg[i] = ( JPEG_BLOCK_TYPE * )( (MS_U32)q + i * 64 * sizeof( JPEG_BLOCK_TYPE ) );
5418*53ee8cc1Swenshuai.xi }
5419*53ee8cc1Swenshuai.xi
5420*53ee8cc1Swenshuai.xi for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5421*53ee8cc1Swenshuai.xi {
5422*53ee8cc1Swenshuai.xi _u8Block_max_zag_set[i] = 64;
5423*53ee8cc1Swenshuai.xi }
5424*53ee8cc1Swenshuai.xi
5425*53ee8cc1Swenshuai.xi gpu8Sample_buf = ( MS_U8 * )( ( ( MS_U32 )JPEG_alloc( _u32Max_blocks_per_row * 64 + 8 ) + 7 ) & ~7 );
5426*53ee8cc1Swenshuai.xi if(gpu8Sample_buf == NULL)
5427*53ee8cc1Swenshuai.xi return FALSE;
5428*53ee8cc1Swenshuai.xi
5429*53ee8cc1Swenshuai.xi _u16Total_lines_left = _u16Image_y_size;
5430*53ee8cc1Swenshuai.xi
5431*53ee8cc1Swenshuai.xi #ifdef CMODEL
5432*53ee8cc1Swenshuai.xi gu16Mcu_lines_left = 0;
5433*53ee8cc1Swenshuai.xi #endif
5434*53ee8cc1Swenshuai.xi
5435*53ee8cc1Swenshuai.xi msAPI_JPEG_create_look_ups();
5436*53ee8cc1Swenshuai.xi }
5437*53ee8cc1Swenshuai.xi #endif
5438*53ee8cc1Swenshuai.xi
5439*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
5440*53ee8cc1Swenshuai.xi _u16Total_lines_left = _u16Max_mcus_per_col * gu8Max_mcu_y_size;
5441*53ee8cc1Swenshuai.xi #ifdef CMODEL
5442*53ee8cc1Swenshuai.xi gu16Mcu_lines_left = 0;
5443*53ee8cc1Swenshuai.xi #endif
5444*53ee8cc1Swenshuai.xi #endif
5445*53ee8cc1Swenshuai.xi return TRUE;
5446*53ee8cc1Swenshuai.xi }
5447*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5448*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
5449*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5450*53ee8cc1Swenshuai.xi // Restart interval processing.
JPEG_process_restart(void)5451*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_process_restart(void)
5452*53ee8cc1Swenshuai.xi {
5453*53ee8cc1Swenshuai.xi MS_U16 i, c = 0;
5454*53ee8cc1Swenshuai.xi
5455*53ee8cc1Swenshuai.xi // Let's scan a little bit to find the marker, but not _too_ far.
5456*53ee8cc1Swenshuai.xi // 1536 is a "fudge factor" that determines how much to scan.
5457*53ee8cc1Swenshuai.xi for ( i = 1536; i > 0; i-- )
5458*53ee8cc1Swenshuai.xi {
5459*53ee8cc1Swenshuai.xi if ( JPEG_get_char() == 0xFF )
5460*53ee8cc1Swenshuai.xi {
5461*53ee8cc1Swenshuai.xi break;
5462*53ee8cc1Swenshuai.xi }
5463*53ee8cc1Swenshuai.xi }
5464*53ee8cc1Swenshuai.xi
5465*53ee8cc1Swenshuai.xi if ( i == 0 )
5466*53ee8cc1Swenshuai.xi {
5467*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5468*53ee8cc1Swenshuai.xi return FALSE;
5469*53ee8cc1Swenshuai.xi }
5470*53ee8cc1Swenshuai.xi
5471*53ee8cc1Swenshuai.xi for ( ; i > 0; i-- )
5472*53ee8cc1Swenshuai.xi {
5473*53ee8cc1Swenshuai.xi c = JPEG_get_char();
5474*53ee8cc1Swenshuai.xi if ( c != 0xFF )
5475*53ee8cc1Swenshuai.xi {
5476*53ee8cc1Swenshuai.xi break;
5477*53ee8cc1Swenshuai.xi }
5478*53ee8cc1Swenshuai.xi }
5479*53ee8cc1Swenshuai.xi
5480*53ee8cc1Swenshuai.xi if ( i == 0 )
5481*53ee8cc1Swenshuai.xi {
5482*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5483*53ee8cc1Swenshuai.xi return FALSE;
5484*53ee8cc1Swenshuai.xi }
5485*53ee8cc1Swenshuai.xi
5486*53ee8cc1Swenshuai.xi // Is it the expected marker? If not, something bad happened.
5487*53ee8cc1Swenshuai.xi if ( c != ( _u16Next_restart_num + E_JPEG_RST0 ) )
5488*53ee8cc1Swenshuai.xi {
5489*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5490*53ee8cc1Swenshuai.xi return FALSE;
5491*53ee8cc1Swenshuai.xi }
5492*53ee8cc1Swenshuai.xi
5493*53ee8cc1Swenshuai.xi // Reset each component's DC prediction values.
5494*53ee8cc1Swenshuai.xi JPEG_memset((void *)&_u32Last_dc_val, 0, _u8Comps_in_frame * sizeof( MS_U32 ) );
5495*53ee8cc1Swenshuai.xi
5496*53ee8cc1Swenshuai.xi _u32EOB_run = 0;
5497*53ee8cc1Swenshuai.xi
5498*53ee8cc1Swenshuai.xi _u16Restarts_left = _u16Restart_interval;
5499*53ee8cc1Swenshuai.xi
5500*53ee8cc1Swenshuai.xi _u16Next_restart_num = ( _u16Next_restart_num + 1 ) & 7;
5501*53ee8cc1Swenshuai.xi
5502*53ee8cc1Swenshuai.xi // Get the bit buffer going again...
5503*53ee8cc1Swenshuai.xi {
5504*53ee8cc1Swenshuai.xi _s16Bits_left = 16;
5505*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5506*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5507*53ee8cc1Swenshuai.xi }
5508*53ee8cc1Swenshuai.xi return TRUE;
5509*53ee8cc1Swenshuai.xi }
5510*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5511*53ee8cc1Swenshuai.xi // The following methods decode the various types of blocks encountered
5512*53ee8cc1Swenshuai.xi // in progressively encoded images.
JPEG_decode_block_dc_first(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5513*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_dc_first(//JPEG_DECODER *Pd,
5514*53ee8cc1Swenshuai.xi MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5515*53ee8cc1Swenshuai.xi {
5516*53ee8cc1Swenshuai.xi MS_S32 s, r;
5517*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( _DC_Coeffs[component_id], block_x, block_y );
5518*53ee8cc1Swenshuai.xi
5519*53ee8cc1Swenshuai.xi if(p == NULL)
5520*53ee8cc1Swenshuai.xi {
5521*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5522*53ee8cc1Swenshuai.xi return FALSE;
5523*53ee8cc1Swenshuai.xi }
5524*53ee8cc1Swenshuai.xi
5525*53ee8cc1Swenshuai.xi s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_dc_tab[component_id]] );
5526*53ee8cc1Swenshuai.xi if ( s != 0 )
5527*53ee8cc1Swenshuai.xi {
5528*53ee8cc1Swenshuai.xi r = JPEG_get_bits_2( s );
5529*53ee8cc1Swenshuai.xi s = HUFF_EXTEND_P( r, s );
5530*53ee8cc1Swenshuai.xi }
5531*53ee8cc1Swenshuai.xi
5532*53ee8cc1Swenshuai.xi // In JPD mode, the DC coefficient is the difference of nearest DC
5533*53ee8cc1Swenshuai.xi _u32Last_dc_val[component_id] = ( s += _u32Last_dc_val[component_id] );
5534*53ee8cc1Swenshuai.xi
5535*53ee8cc1Swenshuai.xi p[0] = s << _u8Successive_low;
5536*53ee8cc1Swenshuai.xi return TRUE;
5537*53ee8cc1Swenshuai.xi }
5538*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_decode_block_dc_refine(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5539*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_dc_refine(//JPEG_DECODER *Pd,
5540*53ee8cc1Swenshuai.xi MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5541*53ee8cc1Swenshuai.xi {
5542*53ee8cc1Swenshuai.xi if ( JPEG_get_bits_2( 1 ) )
5543*53ee8cc1Swenshuai.xi {
5544*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( _DC_Coeffs[component_id], block_x, block_y );
5545*53ee8cc1Swenshuai.xi
5546*53ee8cc1Swenshuai.xi if(p == NULL)
5547*53ee8cc1Swenshuai.xi {
5548*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5549*53ee8cc1Swenshuai.xi return FALSE;
5550*53ee8cc1Swenshuai.xi }
5551*53ee8cc1Swenshuai.xi
5552*53ee8cc1Swenshuai.xi p[0] |= ( 1 << _u8Successive_low );
5553*53ee8cc1Swenshuai.xi }
5554*53ee8cc1Swenshuai.xi return TRUE;
5555*53ee8cc1Swenshuai.xi }
5556*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_decode_block_ac_first(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5557*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_ac_first(//JPEG_DECODER *Pd,
5558*53ee8cc1Swenshuai.xi MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5559*53ee8cc1Swenshuai.xi {
5560*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p;
5561*53ee8cc1Swenshuai.xi MS_S32 k, s, r;
5562*53ee8cc1Swenshuai.xi
5563*53ee8cc1Swenshuai.xi if ( _u32EOB_run )
5564*53ee8cc1Swenshuai.xi {
5565*53ee8cc1Swenshuai.xi _u32EOB_run--;
5566*53ee8cc1Swenshuai.xi return TRUE;
5567*53ee8cc1Swenshuai.xi }
5568*53ee8cc1Swenshuai.xi
5569*53ee8cc1Swenshuai.xi p = JPEG_coeff_buf_getp( _AC_Coeffs[component_id], block_x, block_y );
5570*53ee8cc1Swenshuai.xi
5571*53ee8cc1Swenshuai.xi if(p == NULL)
5572*53ee8cc1Swenshuai.xi {
5573*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5574*53ee8cc1Swenshuai.xi return FALSE;
5575*53ee8cc1Swenshuai.xi }
5576*53ee8cc1Swenshuai.xi
5577*53ee8cc1Swenshuai.xi for ( k = _u8Spectral_start; k <= _u8Spectral_end; k++ )
5578*53ee8cc1Swenshuai.xi {
5579*53ee8cc1Swenshuai.xi s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_ac_tab[component_id]] );
5580*53ee8cc1Swenshuai.xi
5581*53ee8cc1Swenshuai.xi r = s >> 4;
5582*53ee8cc1Swenshuai.xi s &= 15;
5583*53ee8cc1Swenshuai.xi
5584*53ee8cc1Swenshuai.xi if ( s )
5585*53ee8cc1Swenshuai.xi {
5586*53ee8cc1Swenshuai.xi k += r;
5587*53ee8cc1Swenshuai.xi if ( k > 63 )
5588*53ee8cc1Swenshuai.xi {
5589*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
5590*53ee8cc1Swenshuai.xi return FALSE;
5591*53ee8cc1Swenshuai.xi }
5592*53ee8cc1Swenshuai.xi
5593*53ee8cc1Swenshuai.xi r = JPEG_get_bits_2( s );
5594*53ee8cc1Swenshuai.xi s = HUFF_EXTEND_P( r, s );
5595*53ee8cc1Swenshuai.xi
5596*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
5597*53ee8cc1Swenshuai.xi #ifdef CMODEL
5598*53ee8cc1Swenshuai.xi //p[_u8ZAG[k]] = s << _u8Successive_low;
5599*53ee8cc1Swenshuai.xi p[k] = s << _u8Successive_low;
5600*53ee8cc1Swenshuai.xi #else
5601*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5602*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5603*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5604*53ee8cc1Swenshuai.xi {
5605*53ee8cc1Swenshuai.xi p[_u8ZAG[k]] = s << _u8Successive_low;
5606*53ee8cc1Swenshuai.xi }
5607*53ee8cc1Swenshuai.xi else
5608*53ee8cc1Swenshuai.xi #endif
5609*53ee8cc1Swenshuai.xi {
5610*53ee8cc1Swenshuai.xi p[k] = s << _u8Successive_low;
5611*53ee8cc1Swenshuai.xi }
5612*53ee8cc1Swenshuai.xi #endif
5613*53ee8cc1Swenshuai.xi }
5614*53ee8cc1Swenshuai.xi else
5615*53ee8cc1Swenshuai.xi {
5616*53ee8cc1Swenshuai.xi if ( r == 15 )
5617*53ee8cc1Swenshuai.xi {
5618*53ee8cc1Swenshuai.xi k += 15;
5619*53ee8cc1Swenshuai.xi if ( k > 63 )
5620*53ee8cc1Swenshuai.xi {
5621*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
5622*53ee8cc1Swenshuai.xi return FALSE;
5623*53ee8cc1Swenshuai.xi }
5624*53ee8cc1Swenshuai.xi }
5625*53ee8cc1Swenshuai.xi else
5626*53ee8cc1Swenshuai.xi {
5627*53ee8cc1Swenshuai.xi _u32EOB_run = 1 << r;
5628*53ee8cc1Swenshuai.xi
5629*53ee8cc1Swenshuai.xi if ( r )
5630*53ee8cc1Swenshuai.xi {
5631*53ee8cc1Swenshuai.xi _u32EOB_run += JPEG_get_bits_2( r );
5632*53ee8cc1Swenshuai.xi }
5633*53ee8cc1Swenshuai.xi
5634*53ee8cc1Swenshuai.xi _u32EOB_run--;
5635*53ee8cc1Swenshuai.xi
5636*53ee8cc1Swenshuai.xi break;
5637*53ee8cc1Swenshuai.xi }
5638*53ee8cc1Swenshuai.xi }
5639*53ee8cc1Swenshuai.xi }
5640*53ee8cc1Swenshuai.xi return TRUE;
5641*53ee8cc1Swenshuai.xi }
5642*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_decode_block_ac_refine(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5643*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_ac_refine(//JPEG_DECODER *Pd,
5644*53ee8cc1Swenshuai.xi MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5645*53ee8cc1Swenshuai.xi {
5646*53ee8cc1Swenshuai.xi MS_S32 s, k, r;
5647*53ee8cc1Swenshuai.xi MS_S32 p1 = 1 << _u8Successive_low;
5648*53ee8cc1Swenshuai.xi MS_S32 m1 = ( -1 ) << _u8Successive_low;
5649*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( _AC_Coeffs[component_id], block_x, block_y );
5650*53ee8cc1Swenshuai.xi
5651*53ee8cc1Swenshuai.xi if(p == NULL)
5652*53ee8cc1Swenshuai.xi {
5653*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5654*53ee8cc1Swenshuai.xi return FALSE;
5655*53ee8cc1Swenshuai.xi }
5656*53ee8cc1Swenshuai.xi
5657*53ee8cc1Swenshuai.xi k = _u8Spectral_start;
5658*53ee8cc1Swenshuai.xi
5659*53ee8cc1Swenshuai.xi if ( _u32EOB_run == 0 )
5660*53ee8cc1Swenshuai.xi {
5661*53ee8cc1Swenshuai.xi for ( ; (k <= _u8Spectral_end) && ( k < 64 ); k++ )
5662*53ee8cc1Swenshuai.xi {
5663*53ee8cc1Swenshuai.xi s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_ac_tab[component_id]] );
5664*53ee8cc1Swenshuai.xi
5665*53ee8cc1Swenshuai.xi r = s >> 4;
5666*53ee8cc1Swenshuai.xi s &= 15;
5667*53ee8cc1Swenshuai.xi
5668*53ee8cc1Swenshuai.xi if ( s )
5669*53ee8cc1Swenshuai.xi {
5670*53ee8cc1Swenshuai.xi if ( s != 1 )
5671*53ee8cc1Swenshuai.xi {
5672*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
5673*53ee8cc1Swenshuai.xi return FALSE;
5674*53ee8cc1Swenshuai.xi }
5675*53ee8cc1Swenshuai.xi
5676*53ee8cc1Swenshuai.xi if ( JPEG_get_bits_2( 1 ) )
5677*53ee8cc1Swenshuai.xi {
5678*53ee8cc1Swenshuai.xi s = p1;
5679*53ee8cc1Swenshuai.xi }
5680*53ee8cc1Swenshuai.xi else
5681*53ee8cc1Swenshuai.xi {
5682*53ee8cc1Swenshuai.xi s = m1;
5683*53ee8cc1Swenshuai.xi }
5684*53ee8cc1Swenshuai.xi }
5685*53ee8cc1Swenshuai.xi else
5686*53ee8cc1Swenshuai.xi {
5687*53ee8cc1Swenshuai.xi if ( r != 15 )
5688*53ee8cc1Swenshuai.xi {
5689*53ee8cc1Swenshuai.xi _u32EOB_run = 1 << r;
5690*53ee8cc1Swenshuai.xi
5691*53ee8cc1Swenshuai.xi if ( r )
5692*53ee8cc1Swenshuai.xi {
5693*53ee8cc1Swenshuai.xi _u32EOB_run += JPEG_get_bits_2( r );
5694*53ee8cc1Swenshuai.xi }
5695*53ee8cc1Swenshuai.xi
5696*53ee8cc1Swenshuai.xi break;
5697*53ee8cc1Swenshuai.xi }
5698*53ee8cc1Swenshuai.xi }
5699*53ee8cc1Swenshuai.xi
5700*53ee8cc1Swenshuai.xi do
5701*53ee8cc1Swenshuai.xi {
5702*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
5703*53ee8cc1Swenshuai.xi #ifdef CMODEL
5704*53ee8cc1Swenshuai.xi //JPEG_BLOCK_TYPE *this_coef = p + _u8ZAG[k];
5705*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *this_coef = p + k;
5706*53ee8cc1Swenshuai.xi #else
5707*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *this_coef;
5708*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5709*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5710*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5711*53ee8cc1Swenshuai.xi {
5712*53ee8cc1Swenshuai.xi this_coef = p + _u8ZAG[k];
5713*53ee8cc1Swenshuai.xi }
5714*53ee8cc1Swenshuai.xi else
5715*53ee8cc1Swenshuai.xi #endif
5716*53ee8cc1Swenshuai.xi {
5717*53ee8cc1Swenshuai.xi this_coef = p + k;
5718*53ee8cc1Swenshuai.xi }
5719*53ee8cc1Swenshuai.xi #endif
5720*53ee8cc1Swenshuai.xi
5721*53ee8cc1Swenshuai.xi if ( *this_coef != 0 )
5722*53ee8cc1Swenshuai.xi {
5723*53ee8cc1Swenshuai.xi if ( JPEG_get_bits_2( 1 ) )
5724*53ee8cc1Swenshuai.xi {
5725*53ee8cc1Swenshuai.xi if ( ( *this_coef & p1 ) == 0 )
5726*53ee8cc1Swenshuai.xi {
5727*53ee8cc1Swenshuai.xi if ( *this_coef >= 0 )
5728*53ee8cc1Swenshuai.xi {
5729*53ee8cc1Swenshuai.xi *this_coef += p1;
5730*53ee8cc1Swenshuai.xi }
5731*53ee8cc1Swenshuai.xi else
5732*53ee8cc1Swenshuai.xi {
5733*53ee8cc1Swenshuai.xi *this_coef += m1;
5734*53ee8cc1Swenshuai.xi }
5735*53ee8cc1Swenshuai.xi }
5736*53ee8cc1Swenshuai.xi }
5737*53ee8cc1Swenshuai.xi }
5738*53ee8cc1Swenshuai.xi else
5739*53ee8cc1Swenshuai.xi {
5740*53ee8cc1Swenshuai.xi if ( --r < 0 )
5741*53ee8cc1Swenshuai.xi {
5742*53ee8cc1Swenshuai.xi break;
5743*53ee8cc1Swenshuai.xi }
5744*53ee8cc1Swenshuai.xi }
5745*53ee8cc1Swenshuai.xi
5746*53ee8cc1Swenshuai.xi k++;
5747*53ee8cc1Swenshuai.xi }
5748*53ee8cc1Swenshuai.xi while ( (k <= _u8Spectral_end) && ( k < 64 ) );
5749*53ee8cc1Swenshuai.xi
5750*53ee8cc1Swenshuai.xi if ( ( s ) && ( k < 64 ) )
5751*53ee8cc1Swenshuai.xi {
5752*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
5753*53ee8cc1Swenshuai.xi #ifdef CMODEL
5754*53ee8cc1Swenshuai.xi //p[_u8ZAG[k]] = s;
5755*53ee8cc1Swenshuai.xi p[k] = s;
5756*53ee8cc1Swenshuai.xi #else
5757*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5758*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5759*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5760*53ee8cc1Swenshuai.xi {
5761*53ee8cc1Swenshuai.xi p[_u8ZAG[k]] = s;
5762*53ee8cc1Swenshuai.xi }
5763*53ee8cc1Swenshuai.xi else
5764*53ee8cc1Swenshuai.xi #endif
5765*53ee8cc1Swenshuai.xi {
5766*53ee8cc1Swenshuai.xi p[k] = s;
5767*53ee8cc1Swenshuai.xi }
5768*53ee8cc1Swenshuai.xi #endif
5769*53ee8cc1Swenshuai.xi }
5770*53ee8cc1Swenshuai.xi }
5771*53ee8cc1Swenshuai.xi }
5772*53ee8cc1Swenshuai.xi
5773*53ee8cc1Swenshuai.xi if ( _u32EOB_run > 0 )
5774*53ee8cc1Swenshuai.xi {
5775*53ee8cc1Swenshuai.xi for ( ; (k <= _u8Spectral_end) && ( k < 64 ); k++ )
5776*53ee8cc1Swenshuai.xi {
5777*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
5778*53ee8cc1Swenshuai.xi #ifdef CMODEL
5779*53ee8cc1Swenshuai.xi //JPEG_BLOCK_TYPE *this_coef = p + _u8ZAG[k];
5780*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *this_coef = p + k;
5781*53ee8cc1Swenshuai.xi #else
5782*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *this_coef;
5783*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5784*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5785*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5786*53ee8cc1Swenshuai.xi {
5787*53ee8cc1Swenshuai.xi this_coef = p + _u8ZAG[k];
5788*53ee8cc1Swenshuai.xi }
5789*53ee8cc1Swenshuai.xi else
5790*53ee8cc1Swenshuai.xi #endif
5791*53ee8cc1Swenshuai.xi {
5792*53ee8cc1Swenshuai.xi this_coef = p + k;
5793*53ee8cc1Swenshuai.xi }
5794*53ee8cc1Swenshuai.xi #endif
5795*53ee8cc1Swenshuai.xi
5796*53ee8cc1Swenshuai.xi if ( *this_coef != 0 )
5797*53ee8cc1Swenshuai.xi {
5798*53ee8cc1Swenshuai.xi if ( JPEG_get_bits_2( 1 ) )
5799*53ee8cc1Swenshuai.xi {
5800*53ee8cc1Swenshuai.xi if ( ( *this_coef & p1 ) == 0 )
5801*53ee8cc1Swenshuai.xi {
5802*53ee8cc1Swenshuai.xi if ( *this_coef >= 0 )
5803*53ee8cc1Swenshuai.xi {
5804*53ee8cc1Swenshuai.xi *this_coef += p1;
5805*53ee8cc1Swenshuai.xi }
5806*53ee8cc1Swenshuai.xi else
5807*53ee8cc1Swenshuai.xi {
5808*53ee8cc1Swenshuai.xi *this_coef += m1;
5809*53ee8cc1Swenshuai.xi }
5810*53ee8cc1Swenshuai.xi }
5811*53ee8cc1Swenshuai.xi }
5812*53ee8cc1Swenshuai.xi }
5813*53ee8cc1Swenshuai.xi }
5814*53ee8cc1Swenshuai.xi
5815*53ee8cc1Swenshuai.xi _u32EOB_run--;
5816*53ee8cc1Swenshuai.xi }
5817*53ee8cc1Swenshuai.xi return TRUE;
5818*53ee8cc1Swenshuai.xi }
5819*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5820*53ee8cc1Swenshuai.xi // Decode a scan in a progressively encoded image.
JPEG_decode_scan(Pdecode_block_func decode_block_func)5821*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_scan(Pdecode_block_func decode_block_func)
5822*53ee8cc1Swenshuai.xi {
5823*53ee8cc1Swenshuai.xi MS_U16 mcu_row, mcu_col, mcu_block;
5824*53ee8cc1Swenshuai.xi MS_U32 block_x_mcu[JPEG_MAXCOMPONENTS], block_y_mcu[JPEG_MAXCOMPONENTS];
5825*53ee8cc1Swenshuai.xi
5826*53ee8cc1Swenshuai.xi JPEG_memset((void *)block_y_mcu, 0, sizeof( block_y_mcu ) );
5827*53ee8cc1Swenshuai.xi
5828*53ee8cc1Swenshuai.xi for ( mcu_col = 0; mcu_col < _u16Mcus_per_col; mcu_col++ )
5829*53ee8cc1Swenshuai.xi {
5830*53ee8cc1Swenshuai.xi MS_U32 component_num, component_id;
5831*53ee8cc1Swenshuai.xi
5832*53ee8cc1Swenshuai.xi JPEG_memset((void *)block_x_mcu, 0, sizeof( block_x_mcu ) );
5833*53ee8cc1Swenshuai.xi
5834*53ee8cc1Swenshuai.xi for ( mcu_row = 0; mcu_row < _u16Mcus_per_row; mcu_row++ )
5835*53ee8cc1Swenshuai.xi {
5836*53ee8cc1Swenshuai.xi MS_U8 block_x_mcu_ofs = 0, block_y_mcu_ofs = 0;
5837*53ee8cc1Swenshuai.xi
5838*53ee8cc1Swenshuai.xi if ( ( _u16Restart_interval ) && ( _u16Restarts_left == 0 ) )
5839*53ee8cc1Swenshuai.xi {
5840*53ee8cc1Swenshuai.xi if(!JPEG_process_restart())
5841*53ee8cc1Swenshuai.xi return FALSE;
5842*53ee8cc1Swenshuai.xi }
5843*53ee8cc1Swenshuai.xi
5844*53ee8cc1Swenshuai.xi for ( mcu_block = 0; mcu_block < _u8Blocks_per_mcu; mcu_block++ )
5845*53ee8cc1Swenshuai.xi {
5846*53ee8cc1Swenshuai.xi component_id = _u8Mcu_org[mcu_block];
5847*53ee8cc1Swenshuai.xi
5848*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 ))
5849*53ee8cc1Swenshuai.xi {
5850*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5851*53ee8cc1Swenshuai.xi return FALSE;
5852*53ee8cc1Swenshuai.xi }
5853*53ee8cc1Swenshuai.xi
5854*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
5855*53ee8cc1Swenshuai.xi {
5856*53ee8cc1Swenshuai.xi block_x_mcu[component_id]++;
5857*53ee8cc1Swenshuai.xi }
5858*53ee8cc1Swenshuai.xi else
5859*53ee8cc1Swenshuai.xi {
5860*53ee8cc1Swenshuai.xi if ( ++block_x_mcu_ofs == _u8Comp_h_samp[component_id] )
5861*53ee8cc1Swenshuai.xi {
5862*53ee8cc1Swenshuai.xi block_x_mcu_ofs = 0;
5863*53ee8cc1Swenshuai.xi
5864*53ee8cc1Swenshuai.xi if ( ++block_y_mcu_ofs == _u8Comp_v_samp[component_id] )
5865*53ee8cc1Swenshuai.xi {
5866*53ee8cc1Swenshuai.xi block_y_mcu_ofs = 0;
5867*53ee8cc1Swenshuai.xi
5868*53ee8cc1Swenshuai.xi block_x_mcu[component_id] += _u8Comp_h_samp[component_id];
5869*53ee8cc1Swenshuai.xi }
5870*53ee8cc1Swenshuai.xi }
5871*53ee8cc1Swenshuai.xi }
5872*53ee8cc1Swenshuai.xi }
5873*53ee8cc1Swenshuai.xi
5874*53ee8cc1Swenshuai.xi _u16Restarts_left--;
5875*53ee8cc1Swenshuai.xi }
5876*53ee8cc1Swenshuai.xi
5877*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
5878*53ee8cc1Swenshuai.xi {
5879*53ee8cc1Swenshuai.xi block_y_mcu[_u8Comp_list[0]]++;
5880*53ee8cc1Swenshuai.xi }
5881*53ee8cc1Swenshuai.xi else
5882*53ee8cc1Swenshuai.xi {
5883*53ee8cc1Swenshuai.xi for ( component_num = 0; component_num < _u8Comps_in_scan; component_num++ )
5884*53ee8cc1Swenshuai.xi {
5885*53ee8cc1Swenshuai.xi component_id = _u8Comp_list[component_num];
5886*53ee8cc1Swenshuai.xi
5887*53ee8cc1Swenshuai.xi block_y_mcu[component_id] += _u8Comp_v_samp[component_id];
5888*53ee8cc1Swenshuai.xi }
5889*53ee8cc1Swenshuai.xi }
5890*53ee8cc1Swenshuai.xi }
5891*53ee8cc1Swenshuai.xi return TRUE;
5892*53ee8cc1Swenshuai.xi }
5893*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5894*53ee8cc1Swenshuai.xi // Decode a progressively encoded image.
JPEG_init_progressive(void)5895*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_progressive(void)
5896*53ee8cc1Swenshuai.xi {
5897*53ee8cc1Swenshuai.xi MS_U8 i;
5898*53ee8cc1Swenshuai.xi
5899*53ee8cc1Swenshuai.xi if ( _u8Comps_in_frame == 4 )
5900*53ee8cc1Swenshuai.xi {
5901*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5902*53ee8cc1Swenshuai.xi return FALSE;
5903*53ee8cc1Swenshuai.xi }
5904*53ee8cc1Swenshuai.xi
5905*53ee8cc1Swenshuai.xi // Allocate the coefficient buffers.
5906*53ee8cc1Swenshuai.xi for ( i = 0; i < _u8Comps_in_frame; i++ )
5907*53ee8cc1Swenshuai.xi {
5908*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 );
5909*53ee8cc1Swenshuai.xi if(_DC_Coeffs[i] == NULL)
5910*53ee8cc1Swenshuai.xi {
5911*53ee8cc1Swenshuai.xi return FALSE;
5912*53ee8cc1Swenshuai.xi }
5913*53ee8cc1Swenshuai.xi
5914*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 );
5915*53ee8cc1Swenshuai.xi if(_AC_Coeffs[i] == NULL)
5916*53ee8cc1Swenshuai.xi {
5917*53ee8cc1Swenshuai.xi return FALSE;
5918*53ee8cc1Swenshuai.xi }
5919*53ee8cc1Swenshuai.xi }
5920*53ee8cc1Swenshuai.xi
5921*53ee8cc1Swenshuai.xi for ( ; ; )
5922*53ee8cc1Swenshuai.xi {
5923*53ee8cc1Swenshuai.xi MS_BOOL dc_only_scan, refinement_scan;
5924*53ee8cc1Swenshuai.xi Pdecode_block_func decode_block_func;
5925*53ee8cc1Swenshuai.xi
5926*53ee8cc1Swenshuai.xi if (!JPEG_init_scan())
5927*53ee8cc1Swenshuai.xi {
5928*53ee8cc1Swenshuai.xi break;
5929*53ee8cc1Swenshuai.xi }
5930*53ee8cc1Swenshuai.xi
5931*53ee8cc1Swenshuai.xi dc_only_scan = ( _u8Spectral_start == 0 );
5932*53ee8cc1Swenshuai.xi refinement_scan = ( _u8Successive_high != 0 );
5933*53ee8cc1Swenshuai.xi
5934*53ee8cc1Swenshuai.xi if ( ( _u8Spectral_start > _u8Spectral_end ) || ( _u8Spectral_end > 63 ) )
5935*53ee8cc1Swenshuai.xi {
5936*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5937*53ee8cc1Swenshuai.xi return FALSE;
5938*53ee8cc1Swenshuai.xi }
5939*53ee8cc1Swenshuai.xi
5940*53ee8cc1Swenshuai.xi if ( dc_only_scan )
5941*53ee8cc1Swenshuai.xi {
5942*53ee8cc1Swenshuai.xi if ( _u8Spectral_end )
5943*53ee8cc1Swenshuai.xi {
5944*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5945*53ee8cc1Swenshuai.xi return FALSE;
5946*53ee8cc1Swenshuai.xi }
5947*53ee8cc1Swenshuai.xi }
5948*53ee8cc1Swenshuai.xi else if ( _u8Comps_in_scan != 1 ) /* AC scans can only contain one component */
5949*53ee8cc1Swenshuai.xi {
5950*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5951*53ee8cc1Swenshuai.xi return FALSE;
5952*53ee8cc1Swenshuai.xi }
5953*53ee8cc1Swenshuai.xi
5954*53ee8cc1Swenshuai.xi if ( ( refinement_scan ) && ( _u8Successive_low != _u8Successive_high - 1 ) )
5955*53ee8cc1Swenshuai.xi {
5956*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_SUCCESSIVE );
5957*53ee8cc1Swenshuai.xi return FALSE;
5958*53ee8cc1Swenshuai.xi }
5959*53ee8cc1Swenshuai.xi
5960*53ee8cc1Swenshuai.xi if ( dc_only_scan )
5961*53ee8cc1Swenshuai.xi {
5962*53ee8cc1Swenshuai.xi if ( refinement_scan )
5963*53ee8cc1Swenshuai.xi {
5964*53ee8cc1Swenshuai.xi decode_block_func = JPEG_decode_block_dc_refine;
5965*53ee8cc1Swenshuai.xi }
5966*53ee8cc1Swenshuai.xi else
5967*53ee8cc1Swenshuai.xi {
5968*53ee8cc1Swenshuai.xi decode_block_func = JPEG_decode_block_dc_first;
5969*53ee8cc1Swenshuai.xi }
5970*53ee8cc1Swenshuai.xi }
5971*53ee8cc1Swenshuai.xi else
5972*53ee8cc1Swenshuai.xi {
5973*53ee8cc1Swenshuai.xi if ( refinement_scan )
5974*53ee8cc1Swenshuai.xi {
5975*53ee8cc1Swenshuai.xi decode_block_func = JPEG_decode_block_ac_refine;
5976*53ee8cc1Swenshuai.xi }
5977*53ee8cc1Swenshuai.xi else
5978*53ee8cc1Swenshuai.xi {
5979*53ee8cc1Swenshuai.xi decode_block_func = JPEG_decode_block_ac_first;
5980*53ee8cc1Swenshuai.xi }
5981*53ee8cc1Swenshuai.xi }
5982*53ee8cc1Swenshuai.xi
5983*53ee8cc1Swenshuai.xi if(!JPEG_decode_scan( decode_block_func ))
5984*53ee8cc1Swenshuai.xi return FALSE;
5985*53ee8cc1Swenshuai.xi
5986*53ee8cc1Swenshuai.xi _s16Bits_left = 0;
5987*53ee8cc1Swenshuai.xi }
5988*53ee8cc1Swenshuai.xi
5989*53ee8cc1Swenshuai.xi _u8Comps_in_scan = _u8Comps_in_frame;
5990*53ee8cc1Swenshuai.xi
5991*53ee8cc1Swenshuai.xi for ( i = 0; i < _u8Comps_in_frame; i++ )
5992*53ee8cc1Swenshuai.xi {
5993*53ee8cc1Swenshuai.xi _u8Comp_list[i] = i;
5994*53ee8cc1Swenshuai.xi }
5995*53ee8cc1Swenshuai.xi
5996*53ee8cc1Swenshuai.xi JPEG_calc_mcu_block_order();
5997*53ee8cc1Swenshuai.xi return TRUE;
5998*53ee8cc1Swenshuai.xi }
5999*53ee8cc1Swenshuai.xi #endif
6000*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_init_sequential(void)6001*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_sequential(void)
6002*53ee8cc1Swenshuai.xi {
6003*53ee8cc1Swenshuai.xi if ( !JPEG_init_scan() )
6004*53ee8cc1Swenshuai.xi {
6005*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("JPEG_init_scan - E_JPEG_UNEXPECTED_MARKER\n");
6006*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
6007*53ee8cc1Swenshuai.xi return FALSE;
6008*53ee8cc1Swenshuai.xi }
6009*53ee8cc1Swenshuai.xi return TRUE;
6010*53ee8cc1Swenshuai.xi }
6011*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6012*53ee8cc1Swenshuai.xi #if 0
6013*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_decode_start(void)
6014*53ee8cc1Swenshuai.xi {
6015*53ee8cc1Swenshuai.xi JPEG_init_frame();
6016*53ee8cc1Swenshuai.xi
6017*53ee8cc1Swenshuai.xi if ( _bProgressive_flag )
6018*53ee8cc1Swenshuai.xi {
6019*53ee8cc1Swenshuai.xi JPEG_init_progressive();
6020*53ee8cc1Swenshuai.xi }
6021*53ee8cc1Swenshuai.xi else
6022*53ee8cc1Swenshuai.xi {
6023*53ee8cc1Swenshuai.xi JPEG_init_sequential();
6024*53ee8cc1Swenshuai.xi }
6025*53ee8cc1Swenshuai.xi }
6026*53ee8cc1Swenshuai.xi #endif
6027*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6028*53ee8cc1Swenshuai.xi // Find the start of the JPEG file and reads enough data to determine
6029*53ee8cc1Swenshuai.xi // its size, number of components, etc.
JPEG_decode_init(void)6030*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_init(void)
6031*53ee8cc1Swenshuai.xi {
6032*53ee8cc1Swenshuai.xi MS_U16 pic_width, pic_height;
6033*53ee8cc1Swenshuai.xi
6034*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6035*53ee8cc1Swenshuai.xi
6036*53ee8cc1Swenshuai.xi _HeadCheck.result = 0;
6037*53ee8cc1Swenshuai.xi
6038*53ee8cc1Swenshuai.xi if(!JPEG_init())
6039*53ee8cc1Swenshuai.xi return FALSE;
6040*53ee8cc1Swenshuai.xi
6041*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
6042*53ee8cc1Swenshuai.xi _pu8In_buf_ofs = _pu8In_buf_MPO_ofs;
6043*53ee8cc1Swenshuai.xi _u32In_buf_left = _u32In_buf_MPO_left;
6044*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);
6045*53ee8cc1Swenshuai.xi #endif
6046*53ee8cc1Swenshuai.xi
6047*53ee8cc1Swenshuai.xi if(!JPEG_locate_sof_marker())
6048*53ee8cc1Swenshuai.xi return FALSE;
6049*53ee8cc1Swenshuai.xi
6050*53ee8cc1Swenshuai.xi if (bMHEG5)
6051*53ee8cc1Swenshuai.xi {
6052*53ee8cc1Swenshuai.xi if(_Error_code == E_JPEG_UNSUPPORTED_MARKER)
6053*53ee8cc1Swenshuai.xi {
6054*53ee8cc1Swenshuai.xi return TRUE;
6055*53ee8cc1Swenshuai.xi }
6056*53ee8cc1Swenshuai.xi }
6057*53ee8cc1Swenshuai.xi
6058*53ee8cc1Swenshuai.xi if(_u8DecodeType == E_JPEG_TYPE_THUMBNAIL)
6059*53ee8cc1Swenshuai.xi {
6060*53ee8cc1Swenshuai.xi if(_bThumbnailFound)
6061*53ee8cc1Swenshuai.xi {
6062*53ee8cc1Swenshuai.xi _bThumbnailAccessMode = TRUE;
6063*53ee8cc1Swenshuai.xi ////MApi_JPEG_Finalize(); //replace with JPEG_free_all_blocks()
6064*53ee8cc1Swenshuai.xi JPEG_free_all_blocks();
6065*53ee8cc1Swenshuai.xi
6066*53ee8cc1Swenshuai.xi if(!JPEG_init())
6067*53ee8cc1Swenshuai.xi return FALSE;
6068*53ee8cc1Swenshuai.xi
6069*53ee8cc1Swenshuai.xi // save the original image size, because msAPI_JPEG_init will reset all variables to 0
6070*53ee8cc1Swenshuai.xi if(!JPEG_locate_sof_marker())
6071*53ee8cc1Swenshuai.xi return FALSE;
6072*53ee8cc1Swenshuai.xi
6073*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6074*53ee8cc1Swenshuai.xi {
6075*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Progressive image in thumbnail... do not handle it\n");
6076*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
6077*53ee8cc1Swenshuai.xi return FALSE;
6078*53ee8cc1Swenshuai.xi }
6079*53ee8cc1Swenshuai.xi }
6080*53ee8cc1Swenshuai.xi else
6081*53ee8cc1Swenshuai.xi {
6082*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NO_THUMBNAIL );
6083*53ee8cc1Swenshuai.xi return FALSE;
6084*53ee8cc1Swenshuai.xi }
6085*53ee8cc1Swenshuai.xi }
6086*53ee8cc1Swenshuai.xi
6087*53ee8cc1Swenshuai.xi // calculate aligned resolution
6088*53ee8cc1Swenshuai.xi JPEG_GetAlignedResolution(&pic_width, &pic_height);
6089*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("pic_width = %d, pic_height = %d\n",pic_width, pic_height);
6090*53ee8cc1Swenshuai.xi
6091*53ee8cc1Swenshuai.xi _u16AlignedImagePitch = pic_width;
6092*53ee8cc1Swenshuai.xi _u16AlignedImagePitch_H = pic_height;
6093*53ee8cc1Swenshuai.xi _u16AlignedImageWidth = _u16Image_x_size;
6094*53ee8cc1Swenshuai.xi _u16AlignedImageHeight = _u16Image_y_size;
6095*53ee8cc1Swenshuai.xi
6096*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
6097*53ee8cc1Swenshuai.xi if(bIsMPOFormat)
6098*53ee8cc1Swenshuai.xi {
6099*53ee8cc1Swenshuai.xi JPEG_PRO_MAX_WIDTH = JPEG_MPO_PRO_MAX_WIDTH;
6100*53ee8cc1Swenshuai.xi JPEG_PRO_MAX_HEIGHT = JPEG_MPO_PRO_MAX_HEIGHT;
6101*53ee8cc1Swenshuai.xi JPEG_MAX_WIDTH = JPEG_MPO_MAX_WIDTH;
6102*53ee8cc1Swenshuai.xi JPEG_MAX_HEIGHT = JPEG_MPO_MAX_HEIGHT;
6103*53ee8cc1Swenshuai.xi }
6104*53ee8cc1Swenshuai.xi #endif
6105*53ee8cc1Swenshuai.xi
6106*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6107*53ee8cc1Swenshuai.xi {
6108*53ee8cc1Swenshuai.xi MAX_JPEG_WIDTH_HD = JPEG_PRO_MAX_WIDTH;
6109*53ee8cc1Swenshuai.xi MAX_JPEG_HEIGHT_HD = JPEG_PRO_MAX_HEIGHT;
6110*53ee8cc1Swenshuai.xi }
6111*53ee8cc1Swenshuai.xi else
6112*53ee8cc1Swenshuai.xi {
6113*53ee8cc1Swenshuai.xi MAX_JPEG_WIDTH_HD = JPEG_MAX_WIDTH;
6114*53ee8cc1Swenshuai.xi MAX_JPEG_HEIGHT_HD = JPEG_MAX_HEIGHT;
6115*53ee8cc1Swenshuai.xi }
6116*53ee8cc1Swenshuai.xi
6117*53ee8cc1Swenshuai.xi #ifndef CMODEL
6118*53ee8cc1Swenshuai.xi // calculate down scale factor
6119*53ee8cc1Swenshuai.xi if ((_u16Image_x_size > MAX_JPEG_WIDTH_HD * 4) || (_u16Image_y_size > MAX_JPEG_HEIGHT_HD * 4))
6120*53ee8cc1Swenshuai.xi {
6121*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/8!!\n");
6122*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_EIGHTH;
6123*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 8;
6124*53ee8cc1Swenshuai.xi }
6125*53ee8cc1Swenshuai.xi else if ((_u16Image_x_size > MAX_JPEG_WIDTH_HD * 2) || (_u16Image_y_size > MAX_JPEG_HEIGHT_HD * 2))
6126*53ee8cc1Swenshuai.xi {
6127*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/4!!\n");
6128*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_FOURTH;
6129*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 4;
6130*53ee8cc1Swenshuai.xi }
6131*53ee8cc1Swenshuai.xi else if ((_u16Image_x_size > MAX_JPEG_WIDTH_HD) || (_u16Image_y_size > MAX_JPEG_HEIGHT_HD))
6132*53ee8cc1Swenshuai.xi {
6133*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/2!!\n");
6134*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_HALF;
6135*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 2;
6136*53ee8cc1Swenshuai.xi }
6137*53ee8cc1Swenshuai.xi else
6138*53ee8cc1Swenshuai.xi {
6139*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/1!!\n");
6140*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
6141*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 1;
6142*53ee8cc1Swenshuai.xi }
6143*53ee8cc1Swenshuai.xi
6144*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_11_JPEGScaleDownFunctionTest_2==TRUE) \
6145*53ee8cc1Swenshuai.xi || (ENABLE_TEST_11_JPEGScaleDownFunctionTest_4==TRUE) \
6146*53ee8cc1Swenshuai.xi || (ENABLE_TEST_11_JPEGScaleDownFunctionTest_8==TRUE)
6147*53ee8cc1Swenshuai.xi //downscale test(only for unit test)
6148*53ee8cc1Swenshuai.xi
6149*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_11_JPEGScaleDownFunctionTest_2==TRUE)
6150*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_HALF;
6151*53ee8cc1Swenshuai.xi #elif (ENABLE_TEST_11_JPEGScaleDownFunctionTest_4==TRUE)
6152*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_FOURTH;
6153*53ee8cc1Swenshuai.xi #elif (ENABLE_TEST_11_JPEGScaleDownFunctionTest_8==TRUE)
6154*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_EIGHTH;
6155*53ee8cc1Swenshuai.xi #else
6156*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
6157*53ee8cc1Swenshuai.xi #endif
6158*53ee8cc1Swenshuai.xi
6159*53ee8cc1Swenshuai.xi if(_u8DownScaleRatio == E_JPD_DOWNSCALE_HALF)
6160*53ee8cc1Swenshuai.xi {
6161*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 2;
6162*53ee8cc1Swenshuai.xi }
6163*53ee8cc1Swenshuai.xi else if(_u8DownScaleRatio == E_JPD_DOWNSCALE_FOURTH)
6164*53ee8cc1Swenshuai.xi {
6165*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 4;
6166*53ee8cc1Swenshuai.xi }
6167*53ee8cc1Swenshuai.xi else if(_u8DownScaleRatio == E_JPD_DOWNSCALE_EIGHTH)
6168*53ee8cc1Swenshuai.xi {
6169*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 8;
6170*53ee8cc1Swenshuai.xi }
6171*53ee8cc1Swenshuai.xi #endif
6172*53ee8cc1Swenshuai.xi
6173*53ee8cc1Swenshuai.xi if (E_JPD_DOWNSCALE_ORG != _u8DownScaleRatio)
6174*53ee8cc1Swenshuai.xi {
6175*53ee8cc1Swenshuai.xi _u16AlignedImagePitch = pic_width / _u8ScaleDownFactor;
6176*53ee8cc1Swenshuai.xi _u16AlignedImagePitch_H =
6177*53ee8cc1Swenshuai.xi ((pic_height + ((MS_U32)_u8ScaleDownFactor - 1)) & (~((MS_U32)_u8ScaleDownFactor - 1)))/ _u8ScaleDownFactor;
6178*53ee8cc1Swenshuai.xi _u16AlignedImageWidth = _u16Image_x_size / _u8ScaleDownFactor;
6179*53ee8cc1Swenshuai.xi _u16AlignedImageHeight =
6180*53ee8cc1Swenshuai.xi ((_u16AlignedImageHeight + ((MS_U32)_u8ScaleDownFactor - 1)) & (~((MS_U32)_u8ScaleDownFactor - 1))) / _u8ScaleDownFactor;
6181*53ee8cc1Swenshuai.xi }
6182*53ee8cc1Swenshuai.xi
6183*53ee8cc1Swenshuai.xi switch (_u8DownScaleRatio)
6184*53ee8cc1Swenshuai.xi {
6185*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_HALF:
6186*53ee8cc1Swenshuai.xi ROI_width = (pic_width / 16) * 16;
6187*53ee8cc1Swenshuai.xi break;
6188*53ee8cc1Swenshuai.xi
6189*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_FOURTH:
6190*53ee8cc1Swenshuai.xi ROI_width = (pic_width / 32) * 32;
6191*53ee8cc1Swenshuai.xi break;
6192*53ee8cc1Swenshuai.xi
6193*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_EIGHTH:
6194*53ee8cc1Swenshuai.xi ROI_width = (pic_width / 64) * 64;
6195*53ee8cc1Swenshuai.xi break;
6196*53ee8cc1Swenshuai.xi
6197*53ee8cc1Swenshuai.xi default:
6198*53ee8cc1Swenshuai.xi ROI_width = pic_width;
6199*53ee8cc1Swenshuai.xi break;
6200*53ee8cc1Swenshuai.xi }
6201*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Original ROI_width = %d \n", ROI_width);
6202*53ee8cc1Swenshuai.xi
6203*53ee8cc1Swenshuai.xi if (ROI_width != pic_width)
6204*53ee8cc1Swenshuai.xi {
6205*53ee8cc1Swenshuai.xi _u16AlignedImagePitch = _u16AlignedImageWidth = ROI_width / _u8ScaleDownFactor;
6206*53ee8cc1Swenshuai.xi
6207*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6208*53ee8cc1Swenshuai.xi _Progressive_ROI_flag = TRUE;
6209*53ee8cc1Swenshuai.xi }
6210*53ee8cc1Swenshuai.xi #endif //#ifndef CMODEL
6211*53ee8cc1Swenshuai.xi return TRUE;
6212*53ee8cc1Swenshuai.xi }
6213*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI - harold
6214*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6215*53ee8cc1Swenshuai.xi JPEG_STATIC void msAPI_MJPEG_decode_init(PJPEG_FILE_FileSystem_t Pstream)
6216*53ee8cc1Swenshuai.xi {
6217*53ee8cc1Swenshuai.xi JPEG_init( Pstream );
6218*53ee8cc1Swenshuai.xi MSAPI_MJPEG_Get_Pics();
6219*53ee8cc1Swenshuai.xi JPEG_locate_sof_marker();
6220*53ee8cc1Swenshuai.xi
6221*53ee8cc1Swenshuai.xi if(_u8DecodeType == E_JPEG_TYPE_THUMBNAIL)
6222*53ee8cc1Swenshuai.xi {
6223*53ee8cc1Swenshuai.xi if(_bThumbnailFound)
6224*53ee8cc1Swenshuai.xi {
6225*53ee8cc1Swenshuai.xi _bThumbnailAccessMode = TRUE;
6226*53ee8cc1Swenshuai.xi ////MApi_JPEG_Finalize(); //replace with JPEG_free_all_blocks()
6227*53ee8cc1Swenshuai.xi JPEG_free_all_blocks();
6228*53ee8cc1Swenshuai.xi JPEG_init( Pstream );
6229*53ee8cc1Swenshuai.xi
6230*53ee8cc1Swenshuai.xi JPEG_locate_sof_marker();
6231*53ee8cc1Swenshuai.xi
6232*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6233*53ee8cc1Swenshuai.xi {
6234*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Progressive image in thumbnail... do not handle it\n");
6235*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
6236*53ee8cc1Swenshuai.xi }
6237*53ee8cc1Swenshuai.xi }
6238*53ee8cc1Swenshuai.xi else
6239*53ee8cc1Swenshuai.xi {
6240*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NO_THUMBNAIL );
6241*53ee8cc1Swenshuai.xi }
6242*53ee8cc1Swenshuai.xi }
6243*53ee8cc1Swenshuai.xi }
6244*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6245*53ee8cc1Swenshuai.xi // Parse header of MJPEG to get total num of pics in the file
6246*53ee8cc1Swenshuai.xi JPEG_STATIC void MSAPI_MJPEG_Get_Pics(void)
6247*53ee8cc1Swenshuai.xi {
6248*53ee8cc1Swenshuai.xi //Num of pics located at Byte 49~52, hence we need to offset 48 bytes
6249*53ee8cc1Swenshuai.xi MS_U8 ByteOffset, ByteSkip = 48;
6250*53ee8cc1Swenshuai.xi
6251*53ee8cc1Swenshuai.xi //Total num of pics
6252*53ee8cc1Swenshuai.xi NumPics = 0;
6253*53ee8cc1Swenshuai.xi
6254*53ee8cc1Swenshuai.xi for(ByteOffset = 0; ByteOffset < ByteSkip; ByteOffset++)
6255*53ee8cc1Swenshuai.xi {
6256*53ee8cc1Swenshuai.xi JPEG_get_char();
6257*53ee8cc1Swenshuai.xi }
6258*53ee8cc1Swenshuai.xi
6259*53ee8cc1Swenshuai.xi //Handle Little-Ending
6260*53ee8cc1Swenshuai.xi NumPics += (JPEG_get_char());
6261*53ee8cc1Swenshuai.xi NumPics += (JPEG_get_char() << 8);
6262*53ee8cc1Swenshuai.xi NumPics += (JPEG_get_char() << 16);
6263*53ee8cc1Swenshuai.xi NumPics += (JPEG_get_char() << 24);
6264*53ee8cc1Swenshuai.xi
6265*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("NumPics = %ld\n",NumPics);
6266*53ee8cc1Swenshuai.xi }
6267*53ee8cc1Swenshuai.xi #endif // not implement for new MDDI - harold
6268*53ee8cc1Swenshuai.xi
6269*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
6270*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6271*53ee8cc1Swenshuai.xi // Loads and dequantizes the next row of (already decoded) coefficients.
6272*53ee8cc1Swenshuai.xi // Progressive images only.
JPEG_load_next_row(void)6273*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_load_next_row(void)
6274*53ee8cc1Swenshuai.xi {
6275*53ee8cc1Swenshuai.xi #ifndef CMODEL
6276*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE p[64];
6277*53ee8cc1Swenshuai.xi MS_BOOL EOF_Flag = FALSE; //CL82399
6278*53ee8cc1Swenshuai.xi #else
6279*53ee8cc1Swenshuai.xi MS_S16 i;
6280*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p;
6281*53ee8cc1Swenshuai.xi MS_U16 row_block = 0;
6282*53ee8cc1Swenshuai.xi JPEG_QUANT_TYPE *q;
6283*53ee8cc1Swenshuai.xi #endif
6284*53ee8cc1Swenshuai.xi
6285*53ee8cc1Swenshuai.xi MS_U16 mcu_row, mcu_block;
6286*53ee8cc1Swenshuai.xi MS_U8 component_num, component_id;
6287*53ee8cc1Swenshuai.xi MS_U16 block_x_mcu[JPEG_MAXCOMPONENTS];
6288*53ee8cc1Swenshuai.xi
6289*53ee8cc1Swenshuai.xi JPEG_memset((void *)block_x_mcu, 0, JPEG_MAXCOMPONENTS * sizeof( MS_U16 ) );
6290*53ee8cc1Swenshuai.xi
6291*53ee8cc1Swenshuai.xi for ( mcu_row = 0; mcu_row < _u16Mcus_per_row; mcu_row++ )
6292*53ee8cc1Swenshuai.xi {
6293*53ee8cc1Swenshuai.xi MS_U16 block_x_mcu_ofs = 0, block_y_mcu_ofs = 0;
6294*53ee8cc1Swenshuai.xi
6295*53ee8cc1Swenshuai.xi for ( mcu_block = 0; mcu_block < _u8Blocks_per_mcu; mcu_block++ )
6296*53ee8cc1Swenshuai.xi {
6297*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *pAC;
6298*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *pDC;
6299*53ee8cc1Swenshuai.xi
6300*53ee8cc1Swenshuai.xi component_id = _u8Mcu_org[mcu_block];
6301*53ee8cc1Swenshuai.xi
6302*53ee8cc1Swenshuai.xi #ifdef CMODEL
6303*53ee8cc1Swenshuai.xi p = gps16Block_seg[row_block];
6304*53ee8cc1Swenshuai.xi q = _QuantTables[_u8Comp_quant[component_id]].s16Value;
6305*53ee8cc1Swenshuai.xi #endif
6306*53ee8cc1Swenshuai.xi
6307*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 );
6308*53ee8cc1Swenshuai.xi if(pAC == NULL)
6309*53ee8cc1Swenshuai.xi {
6310*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
6311*53ee8cc1Swenshuai.xi return FALSE;
6312*53ee8cc1Swenshuai.xi }
6313*53ee8cc1Swenshuai.xi
6314*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 );
6315*53ee8cc1Swenshuai.xi if(pDC == NULL)
6316*53ee8cc1Swenshuai.xi {
6317*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
6318*53ee8cc1Swenshuai.xi return FALSE;
6319*53ee8cc1Swenshuai.xi }
6320*53ee8cc1Swenshuai.xi p[0] = pDC[0];
6321*53ee8cc1Swenshuai.xi JPEG_memcpy((void *)&p[1], (void *)&pAC[1], 63 * sizeof( JPEG_BLOCK_TYPE ) );
6322*53ee8cc1Swenshuai.xi
6323*53ee8cc1Swenshuai.xi #ifdef CMODEL //cmodel do not support scale down feature.
6324*53ee8cc1Swenshuai.xi if(mcu_block==(_u8Blocks_per_mcu -1)&&mcu_row==(_u16Mcus_per_row - 1)&&(_u16Total_lines_left - gu8Max_mcu_y_size)==0)
6325*53ee8cc1Swenshuai.xi {
6326*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, TRUE, component_id, TRUE)) // means it is end of picture
6327*53ee8cc1Swenshuai.xi return FALSE;
6328*53ee8cc1Swenshuai.xi }
6329*53ee8cc1Swenshuai.xi else
6330*53ee8cc1Swenshuai.xi {
6331*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6332*53ee8cc1Swenshuai.xi return FALSE;
6333*53ee8cc1Swenshuai.xi }
6334*53ee8cc1Swenshuai.xi #else //CL82399
6335*53ee8cc1Swenshuai.xi if( _Progressive_ROI_flag == FALSE )
6336*53ee8cc1Swenshuai.xi {
6337*53ee8cc1Swenshuai.xi if((mcu_block == (_u8Blocks_per_mcu - 1))
6338*53ee8cc1Swenshuai.xi && (mcu_row == (_u16Mcus_per_row - 1))
6339*53ee8cc1Swenshuai.xi && (_u16Total_lines_left == gu8Max_mcu_y_size))
6340*53ee8cc1Swenshuai.xi {
6341*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EOF!!!!!ROI enable!!!\n");
6342*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, TRUE, component_id, TRUE)) // means it is end of picture
6343*53ee8cc1Swenshuai.xi return FALSE;
6344*53ee8cc1Swenshuai.xi }
6345*53ee8cc1Swenshuai.xi else
6346*53ee8cc1Swenshuai.xi {
6347*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6348*53ee8cc1Swenshuai.xi return FALSE;
6349*53ee8cc1Swenshuai.xi }
6350*53ee8cc1Swenshuai.xi }
6351*53ee8cc1Swenshuai.xi else
6352*53ee8cc1Swenshuai.xi {
6353*53ee8cc1Swenshuai.xi if( _u16Total_lines_left == gu8Max_mcu_y_size )//Last Line
6354*53ee8cc1Swenshuai.xi {
6355*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("_u16Total_lines_left ==%d,%d,%d \n", gu8Max_mcu_y_size, mcu_block, mcu_row);
6356*53ee8cc1Swenshuai.xi
6357*53ee8cc1Swenshuai.xi if((mcu_block == (_u8Blocks_per_mcu - 1))
6358*53ee8cc1Swenshuai.xi && ((mcu_row + 2) * gu8Max_mcu_x_size > ROI_width))//Last line last block within rang
6359*53ee8cc1Swenshuai.xi {
6360*53ee8cc1Swenshuai.xi if( EOF_Flag == FALSE )
6361*53ee8cc1Swenshuai.xi {
6362*53ee8cc1Swenshuai.xi EOF_Flag = TRUE;
6363*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EOF!!!!!No ROI!!!\n");
6364*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, TRUE, component_id, TRUE)) // means it is end of picture
6365*53ee8cc1Swenshuai.xi return FALSE;
6366*53ee8cc1Swenshuai.xi }
6367*53ee8cc1Swenshuai.xi }
6368*53ee8cc1Swenshuai.xi else
6369*53ee8cc1Swenshuai.xi {
6370*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6371*53ee8cc1Swenshuai.xi return FALSE;
6372*53ee8cc1Swenshuai.xi }
6373*53ee8cc1Swenshuai.xi }
6374*53ee8cc1Swenshuai.xi else
6375*53ee8cc1Swenshuai.xi {
6376*53ee8cc1Swenshuai.xi if((mcu_row + 1) * gu8Max_mcu_x_size > ROI_width)//ever line out rang block
6377*53ee8cc1Swenshuai.xi {
6378*53ee8cc1Swenshuai.xi //JPEG_do_RLE(p, FALSE, component_id, FALSE);
6379*53ee8cc1Swenshuai.xi }
6380*53ee8cc1Swenshuai.xi else
6381*53ee8cc1Swenshuai.xi {
6382*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6383*53ee8cc1Swenshuai.xi return FALSE;
6384*53ee8cc1Swenshuai.xi }
6385*53ee8cc1Swenshuai.xi }
6386*53ee8cc1Swenshuai.xi }
6387*53ee8cc1Swenshuai.xi #endif
6388*53ee8cc1Swenshuai.xi
6389*53ee8cc1Swenshuai.xi
6390*53ee8cc1Swenshuai.xi #ifdef CMODEL
6391*53ee8cc1Swenshuai.xi {
6392*53ee8cc1Swenshuai.xi for ( i = 63; i > 0; i-- )
6393*53ee8cc1Swenshuai.xi {
6394*53ee8cc1Swenshuai.xi if ( p[_u8ZAG[i]] )
6395*53ee8cc1Swenshuai.xi {
6396*53ee8cc1Swenshuai.xi break;
6397*53ee8cc1Swenshuai.xi }
6398*53ee8cc1Swenshuai.xi }
6399*53ee8cc1Swenshuai.xi
6400*53ee8cc1Swenshuai.xi //block_num[row_block++] = i + 1;
6401*53ee8cc1Swenshuai.xi
6402*53ee8cc1Swenshuai.xi for ( ; i >= 0; i-- )
6403*53ee8cc1Swenshuai.xi {
6404*53ee8cc1Swenshuai.xi if ( p[_u8ZAG[i]] )
6405*53ee8cc1Swenshuai.xi {
6406*53ee8cc1Swenshuai.xi p[_u8ZAG[i]] *= q[i];
6407*53ee8cc1Swenshuai.xi }
6408*53ee8cc1Swenshuai.xi }
6409*53ee8cc1Swenshuai.xi }
6410*53ee8cc1Swenshuai.xi
6411*53ee8cc1Swenshuai.xi row_block++;
6412*53ee8cc1Swenshuai.xi #endif
6413*53ee8cc1Swenshuai.xi
6414*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
6415*53ee8cc1Swenshuai.xi {
6416*53ee8cc1Swenshuai.xi block_x_mcu[component_id]++;
6417*53ee8cc1Swenshuai.xi }
6418*53ee8cc1Swenshuai.xi else
6419*53ee8cc1Swenshuai.xi {
6420*53ee8cc1Swenshuai.xi if ( ++block_x_mcu_ofs == _u8Comp_h_samp[component_id] )
6421*53ee8cc1Swenshuai.xi {
6422*53ee8cc1Swenshuai.xi block_x_mcu_ofs = 0;
6423*53ee8cc1Swenshuai.xi
6424*53ee8cc1Swenshuai.xi if ( ++block_y_mcu_ofs == _u8Comp_v_samp[component_id] )
6425*53ee8cc1Swenshuai.xi {
6426*53ee8cc1Swenshuai.xi block_y_mcu_ofs = 0;
6427*53ee8cc1Swenshuai.xi
6428*53ee8cc1Swenshuai.xi block_x_mcu[component_id] += _u8Comp_h_samp[component_id];
6429*53ee8cc1Swenshuai.xi }
6430*53ee8cc1Swenshuai.xi }
6431*53ee8cc1Swenshuai.xi }
6432*53ee8cc1Swenshuai.xi }
6433*53ee8cc1Swenshuai.xi }
6434*53ee8cc1Swenshuai.xi
6435*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
6436*53ee8cc1Swenshuai.xi {
6437*53ee8cc1Swenshuai.xi _u32Block_y_mcu[_u8Comp_list[0]]++;
6438*53ee8cc1Swenshuai.xi }
6439*53ee8cc1Swenshuai.xi else
6440*53ee8cc1Swenshuai.xi {
6441*53ee8cc1Swenshuai.xi for ( component_num = 0; component_num < _u8Comps_in_scan; component_num++ )
6442*53ee8cc1Swenshuai.xi {
6443*53ee8cc1Swenshuai.xi component_id = _u8Comp_list[component_num];
6444*53ee8cc1Swenshuai.xi
6445*53ee8cc1Swenshuai.xi _u32Block_y_mcu[component_id] += _u8Comp_v_samp[component_id];
6446*53ee8cc1Swenshuai.xi }
6447*53ee8cc1Swenshuai.xi }
6448*53ee8cc1Swenshuai.xi return TRUE;
6449*53ee8cc1Swenshuai.xi }
6450*53ee8cc1Swenshuai.xi #endif
6451*53ee8cc1Swenshuai.xi
6452*53ee8cc1Swenshuai.xi #ifndef CMODEL
6453*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6454*53ee8cc1Swenshuai.xi /******************************************************************************/
6455*53ee8cc1Swenshuai.xi ///Start JPEG decoding
6456*53ee8cc1Swenshuai.xi /******************************************************************************/
JPEG_StartDecode(void)6457*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_StartDecode(void)
6458*53ee8cc1Swenshuai.xi {
6459*53ee8cc1Swenshuai.xi MS_U16 pic_width, pic_height;
6460*53ee8cc1Swenshuai.xi MS_U8 Y_VSF = _u8Comp_v_samp[0];
6461*53ee8cc1Swenshuai.xi MS_U8 Y_HSF = _u8Comp_h_samp[0];
6462*53ee8cc1Swenshuai.xi MS_BOOL bUV_en;
6463*53ee8cc1Swenshuai.xi MS_U32 reg_value;
6464*53ee8cc1Swenshuai.xi MS_U8 i;
6465*53ee8cc1Swenshuai.xi MS_U8 com_num = 0;
6466*53ee8cc1Swenshuai.xi MS_U8 comp[JPEG_MAXCOMPONENTS];
6467*53ee8cc1Swenshuai.xi JPD_BufCfg structBuf;
6468*53ee8cc1Swenshuai.xi
6469*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6470*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
6471*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
6472*53ee8cc1Swenshuai.xi {
6473*53ee8cc1Swenshuai.xi return FALSE;
6474*53ee8cc1Swenshuai.xi }
6475*53ee8cc1Swenshuai.xi #endif
6476*53ee8cc1Swenshuai.xi
6477*53ee8cc1Swenshuai.xi #if ENABLE_JPEG_NO_SIZE_LOWER_BOUND
6478*53ee8cc1Swenshuai.xi MDrv_JPD_SetPicDimension(0xFF, 0xFF);
6479*53ee8cc1Swenshuai.xi #endif
6480*53ee8cc1Swenshuai.xi
6481*53ee8cc1Swenshuai.xi // reset JPD hardware
6482*53ee8cc1Swenshuai.xi //MDrv_JPD_Reset();
6483*53ee8cc1Swenshuai.xi MDrv_JPD_Rst();
6484*53ee8cc1Swenshuai.xi
6485*53ee8cc1Swenshuai.xi // Calculate how many valid quantization tables for components
6486*53ee8cc1Swenshuai.xi JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
6487*53ee8cc1Swenshuai.xi for(i = 0; i<_u8Comps_in_frame; i++)
6488*53ee8cc1Swenshuai.xi {
6489*53ee8cc1Swenshuai.xi comp[_u8Comp_quant[i]] = 1;
6490*53ee8cc1Swenshuai.xi }
6491*53ee8cc1Swenshuai.xi
6492*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
6493*53ee8cc1Swenshuai.xi {
6494*53ee8cc1Swenshuai.xi if(comp[i]==1)
6495*53ee8cc1Swenshuai.xi com_num++;
6496*53ee8cc1Swenshuai.xi }
6497*53ee8cc1Swenshuai.xi
6498*53ee8cc1Swenshuai.xi if(_u8Comps_in_frame>1)
6499*53ee8cc1Swenshuai.xi bUV_en = TRUE;
6500*53ee8cc1Swenshuai.xi else
6501*53ee8cc1Swenshuai.xi bUV_en = FALSE;
6502*53ee8cc1Swenshuai.xi
6503*53ee8cc1Swenshuai.xi //Get Aligned width & height
6504*53ee8cc1Swenshuai.xi JPEG_GetAlignedResolution(&pic_width, &pic_height);
6505*53ee8cc1Swenshuai.xi
6506*53ee8cc1Swenshuai.xi #if 1
6507*53ee8cc1Swenshuai.xi structBuf.bProgressive = _bProgressive_flag;
6508*53ee8cc1Swenshuai.xi structBuf.bThumbnailAccessMode = _bThumbnailAccessMode;
6509*53ee8cc1Swenshuai.xi structBuf.u32ThumbnailBufAddr = MS_VA2PA((MS_U32)INTERNAL_BUFFER_ADDR);
6510*53ee8cc1Swenshuai.xi structBuf.u32ThumbnailBufSize = JPEG_DEFAULT_EXIF_SIZE;
6511*53ee8cc1Swenshuai.xi structBuf.u32ThumbnailBufOffset = _u32ThumbnailOffset + JPEG_GetECS();
6512*53ee8cc1Swenshuai.xi structBuf.u32MRCBufAddr = MS_VA2PA((MS_U32)MRC_BUFFER_ADDR);
6513*53ee8cc1Swenshuai.xi structBuf.u32MRCBufSize = MRC_BUFFER_SIZE;
6514*53ee8cc1Swenshuai.xi structBuf.u32MRCBufOffset = JPEG_GetECS();
6515*53ee8cc1Swenshuai.xi structBuf.u32MWCBufAddr = MS_VA2PA((MS_U32)MWC_BUFFER_ADDR);
6516*53ee8cc1Swenshuai.xi //HW limitation:if we don't enable write-protect mode, set this value to zero.
6517*53ee8cc1Swenshuai.xi
6518*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_09_JPEGWriteProtectTest==FALSE)
6519*53ee8cc1Swenshuai.xi structBuf.u16MWCBufLineNum = 0;
6520*53ee8cc1Swenshuai.xi // structBuf.u16MWCBufLineNum = ((pic_height/_u8ScaleDownFactor + 8) < 0x07FF)?(pic_height/_u8ScaleDownFactor + 8):0x7FF;
6521*53ee8cc1Swenshuai.xi #else
6522*53ee8cc1Swenshuai.xi structBuf.u16MWCBufLineNum = 32;
6523*53ee8cc1Swenshuai.xi #endif
6524*53ee8cc1Swenshuai.xi
6525*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("bProgressive = %d, bThumbnailAccessMode = %d\n"
6526*53ee8cc1Swenshuai.xi , structBuf.bProgressive, structBuf.bThumbnailAccessMode);
6527*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("u32ThumbnailBufAddr = 0x%lX, u32ThumbnailBufSize = 0x%lX, u32ThumbnailBufOffset = 0x%lX\n"
6528*53ee8cc1Swenshuai.xi , structBuf.u32ThumbnailBufAddr, structBuf.u32ThumbnailBufSize, structBuf.u32ThumbnailBufOffset);
6529*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("u32MRCBufAddr = 0x%lX, u32MRCBufSize = 0x%lX, u32MRCBufOffset = 0x%lX\n"
6530*53ee8cc1Swenshuai.xi , structBuf.u32MRCBufAddr, structBuf.u32MRCBufSize, structBuf.u32MRCBufOffset);
6531*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("u32MWCBufAddr = 0x%lX, u16MWCBufLineNum = %d\n"
6532*53ee8cc1Swenshuai.xi , structBuf.u32MWCBufAddr, structBuf.u16MWCBufLineNum);
6533*53ee8cc1Swenshuai.xi
6534*53ee8cc1Swenshuai.xi u32DataOffset += JPEG_GetECS();
6535*53ee8cc1Swenshuai.xi
6536*53ee8cc1Swenshuai.xi MDrv_JPD_InitBuf(structBuf);
6537*53ee8cc1Swenshuai.xi
6538*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("MWCLineNum = %d, pic_height = %d, DwnScaleRatio = %d\n"
6539*53ee8cc1Swenshuai.xi // , structBuf.u16MWCBufLineNum, pic_height, _u8ScaleDownFactor);
6540*53ee8cc1Swenshuai.xi #else
6541*53ee8cc1Swenshuai.xi if(_bThumbnailAccessMode)
6542*53ee8cc1Swenshuai.xi {
6543*53ee8cc1Swenshuai.xi // Set MRC buffer for JPD
6544*53ee8cc1Swenshuai.xi MDrv_JPD_SetReadBuffer(INTERNAL_BUFFER_ADDR, JPEG_DEFAULT_EXIF_SIZE);
6545*53ee8cc1Swenshuai.xi // Set MRC start access byte address
6546*53ee8cc1Swenshuai.xi MDrv_JPD_SetMRCStartAddr(INTERNAL_BUFFER_ADDR + _u32ThumbnailOffset + JPEG_GetECS());
6547*53ee8cc1Swenshuai.xi }
6548*53ee8cc1Swenshuai.xi else
6549*53ee8cc1Swenshuai.xi {
6550*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6551*53ee8cc1Swenshuai.xi {
6552*53ee8cc1Swenshuai.xi // Set MRC buffer for JPD
6553*53ee8cc1Swenshuai.xi MDrv_JPD_SetReadBuffer(MRC_BUFFER_ADDR, MRC_BUFFER_SIZE);
6554*53ee8cc1Swenshuai.xi // Set MRC start access byte address
6555*53ee8cc1Swenshuai.xi MDrv_JPD_SetMRCStartAddr(MRC_BUFFER_ADDR);
6556*53ee8cc1Swenshuai.xi }
6557*53ee8cc1Swenshuai.xi else
6558*53ee8cc1Swenshuai.xi {
6559*53ee8cc1Swenshuai.xi // Set MRC buffer for JPD
6560*53ee8cc1Swenshuai.xi MDrv_JPD_SetReadBuffer(MRC_BUFFER_ADDR, MRC_BUFFER_SIZE);
6561*53ee8cc1Swenshuai.xi // Set MRC start access byte address
6562*53ee8cc1Swenshuai.xi MDrv_JPD_SetMRCStartAddr(MRC_BUFFER_ADDR + JPEG_GetECS());
6563*53ee8cc1Swenshuai.xi }
6564*53ee8cc1Swenshuai.xi }
6565*53ee8cc1Swenshuai.xi
6566*53ee8cc1Swenshuai.xi // Set MWC buffer for JPD
6567*53ee8cc1Swenshuai.xi MDrv_JPD_SetOutputFrameBuffer(MWC_BUFFER_ADDR);
6568*53ee8cc1Swenshuai.xi #endif
6569*53ee8cc1Swenshuai.xi
6570*53ee8cc1Swenshuai.xi // Set picture width and height
6571*53ee8cc1Swenshuai.xi #if (ENABLE_JPEG_NO_SIZE_LOWER_BOUND == 0)
6572*53ee8cc1Swenshuai.xi MDrv_JPD_SetPicDimension(pic_width, pic_height);
6573*53ee8cc1Swenshuai.xi #endif
6574*53ee8cc1Swenshuai.xi
6575*53ee8cc1Swenshuai.xi _u16NonAlignmentImage_x_size = pic_width;
6576*53ee8cc1Swenshuai.xi _u16NonAlignmentImage_y_size = _u16Image_y_size;
6577*53ee8cc1Swenshuai.xi
6578*53ee8cc1Swenshuai.xi _u16Image_x_size = pic_width/_u8ScaleDownFactor;
6579*53ee8cc1Swenshuai.xi _u16Image_y_size = pic_height/_u8ScaleDownFactor;
6580*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ScaleDownFactor = %d\n", _u8ScaleDownFactor);
6581*53ee8cc1Swenshuai.xi
6582*53ee8cc1Swenshuai.xi // In JPD, software VLD mode, we don't need to write huff & symbol tables
6583*53ee8cc1Swenshuai.xi if(_bProgressive_flag==FALSE)
6584*53ee8cc1Swenshuai.xi {
6585*53ee8cc1Swenshuai.xi //JPEG_write_Scwgif();
6586*53ee8cc1Swenshuai.xi JPEG_WriteGrpinf();
6587*53ee8cc1Swenshuai.xi //JPEG_write_symidx();
6588*53ee8cc1Swenshuai.xi JPEG_WriteSymidx();
6589*53ee8cc1Swenshuai.xi }
6590*53ee8cc1Swenshuai.xi
6591*53ee8cc1Swenshuai.xi //JPEG_write_Qtbl();
6592*53ee8cc1Swenshuai.xi JPEG_WriteIQTbl();
6593*53ee8cc1Swenshuai.xi
6594*53ee8cc1Swenshuai.xi Y_VSF -= 1;
6595*53ee8cc1Swenshuai.xi if ( Y_HSF == 4 )
6596*53ee8cc1Swenshuai.xi {
6597*53ee8cc1Swenshuai.xi Y_HSF = 3;
6598*53ee8cc1Swenshuai.xi }
6599*53ee8cc1Swenshuai.xi
6600*53ee8cc1Swenshuai.xi if(_u16Restart_interval)
6601*53ee8cc1Swenshuai.xi {
6602*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("RST found! Enable JPD_RST_EN! Restart_interval = %d\n", _u16Restart_interval);
6603*53ee8cc1Swenshuai.xi //MDrv_Write2Byte(BK_JPD_RSTINTV, _u16Restart_interval - 1);
6604*53ee8cc1Swenshuai.xi MDrv_JPD_SetRSTIntv(_u16Restart_interval - 1);
6605*53ee8cc1Swenshuai.xi reg_value = ( JPD_TBL_RDY | JPD_RST_EN | ((MS_U32) _u8DownScaleRatio) << 4 | ((MS_U32) bUV_en) << 3 | ( Y_VSF << 2 ) | Y_HSF );
6606*53ee8cc1Swenshuai.xi }
6607*53ee8cc1Swenshuai.xi else
6608*53ee8cc1Swenshuai.xi {
6609*53ee8cc1Swenshuai.xi reg_value = ( JPD_TBL_RDY | ((MS_U32) _u8DownScaleRatio) << 4 | ((MS_U32) bUV_en) << 3 | ( Y_VSF << 2 ) | Y_HSF );
6610*53ee8cc1Swenshuai.xi }
6611*53ee8cc1Swenshuai.xi
6612*53ee8cc1Swenshuai.xi // There're Q tables for U & V, respectively.
6613*53ee8cc1Swenshuai.xi if(com_num>2)
6614*53ee8cc1Swenshuai.xi {
6615*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("More than two Q tables! Enable JPD_SUVQ! comnum = %d\n", com_num);
6616*53ee8cc1Swenshuai.xi reg_value = reg_value | JPD_SUVQ;
6617*53ee8cc1Swenshuai.xi }
6618*53ee8cc1Swenshuai.xi
6619*53ee8cc1Swenshuai.xi /* Check the read pointer. If it is in HIGH buffer, we need
6620*53ee8cc1Swenshuai.xi to preload data to LOW buffer and then start decode.
6621*53ee8cc1Swenshuai.xi Progressive mode & thumbnail don't need to check it. */
6622*53ee8cc1Swenshuai.xi if((FALSE == _bProgressive_flag)
6623*53ee8cc1Swenshuai.xi && (FALSE == _bThumbnailAccessMode))
6624*53ee8cc1Swenshuai.xi {
6625*53ee8cc1Swenshuai.xi MS_U32 start_offset = JPEG_GetECS();
6626*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("start offset = 0x%lx\n", start_offset);
6627*53ee8cc1Swenshuai.xi if ( start_offset >= (MRC_BUFFER_SIZE/2) )
6628*53ee8cc1Swenshuai.xi {
6629*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ReadPtr is in HIGH, Load LOW!!\n");
6630*53ee8cc1Swenshuai.xi if(_pFillHdrFunc)
6631*53ee8cc1Swenshuai.xi {
6632*53ee8cc1Swenshuai.xi MS_S32 byte_read = _pFillHdrFunc((MS_PHYADDR)MS_VA2PA((MS_U32)_pu8In_buf), (MRC_BUFFER_SIZE/2));
6633*53ee8cc1Swenshuai.xi if(byte_read < 0)
6634*53ee8cc1Swenshuai.xi {
6635*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_STREAM_READ);
6636*53ee8cc1Swenshuai.xi return FALSE;
6637*53ee8cc1Swenshuai.xi }
6638*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_LOW;
6639*53ee8cc1Swenshuai.xi u32MRCheckCount = 0;
6640*53ee8cc1Swenshuai.xi }
6641*53ee8cc1Swenshuai.xi else
6642*53ee8cc1Swenshuai.xi {
6643*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_pFillHdrFunc is not registered!!, still need to start decode.\n");
6644*53ee8cc1Swenshuai.xi }
6645*53ee8cc1Swenshuai.xi }
6646*53ee8cc1Swenshuai.xi }
6647*53ee8cc1Swenshuai.xi
6648*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6649*53ee8cc1Swenshuai.xi reg_value = reg_value | JPD_SVLD;
6650*53ee8cc1Swenshuai.xi
6651*53ee8cc1Swenshuai.xi // Check if it needs to do ROI
6652*53ee8cc1Swenshuai.xi if(E_JPD_DOWNSCALE_ORG != _u8DownScaleRatio)
6653*53ee8cc1Swenshuai.xi {
6654*53ee8cc1Swenshuai.xi if(ROI_width != pic_width)
6655*53ee8cc1Swenshuai.xi {
6656*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ROI!! ROI_width = %d, ROI_height = %d\n", ROI_width, pic_height);
6657*53ee8cc1Swenshuai.xi MDrv_JPD_SetROI(0, 0, (ROI_width>>3), (pic_height>>3));
6658*53ee8cc1Swenshuai.xi reg_value = reg_value | JPD_ROI_EN;
6659*53ee8cc1Swenshuai.xi }
6660*53ee8cc1Swenshuai.xi _u16Image_x_size = ROI_width/_u8ScaleDownFactor;
6661*53ee8cc1Swenshuai.xi }
6662*53ee8cc1Swenshuai.xi
6663*53ee8cc1Swenshuai.xi //Enable ECO support
6664*53ee8cc1Swenshuai.xi {
6665*53ee8cc1Swenshuai.xi MS_U16 reg_val = 0;
6666*53ee8cc1Swenshuai.xi reg_val = JPD_RST_STUFF_BYTE_HANDLE;
6667*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==TRUE)
6668*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
6669*53ee8cc1Swenshuai.xi {
6670*53ee8cc1Swenshuai.xi reg_val = reg_val | JPD_3_HUFFMAN_TABLE_SUPPORT;
6671*53ee8cc1Swenshuai.xi }
6672*53ee8cc1Swenshuai.xi #endif
6673*53ee8cc1Swenshuai.xi MDrv_JPD_SetSpare(reg_val);
6674*53ee8cc1Swenshuai.xi }
6675*53ee8cc1Swenshuai.xi
6676*53ee8cc1Swenshuai.xi // mark low/high buffer valid
6677*53ee8cc1Swenshuai.xi //MDrv_Write2Byte( BK_JPD_MCONFIG, JPD_H_VLD |JPD_L_VLD);
6678*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config(JPD_H_VLD |JPD_L_VLD);
6679*53ee8cc1Swenshuai.xi
6680*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_18_miu_sel_128M==TRUE) \
6681*53ee8cc1Swenshuai.xi ||(ENABLE_TEST_18_miu_sel_64M==TRUE) \
6682*53ee8cc1Swenshuai.xi ||(ENABLE_TEST_18_miu_sel_32M==TRUE)
6683*53ee8cc1Swenshuai.xi // This is used for verification code in TEST_18_miu_sel
6684*53ee8cc1Swenshuai.xi // MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config()); // 0 1
6685*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_18_miu_sel_128M==TRUE)
6686*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config() | JPD_BIT(9)); // 0 1 0 1
6687*53ee8cc1Swenshuai.xi #elif (ENABLE_TEST_18_miu_sel_64M==TRUE)
6688*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config() | JPD_BIT(10)); // 0 1 0 1 0 1 0 1
6689*53ee8cc1Swenshuai.xi #else
6690*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
6691*53ee8cc1Swenshuai.xi #endif
6692*53ee8cc1Swenshuai.xi #endif
6693*53ee8cc1Swenshuai.xi
6694*53ee8cc1Swenshuai.xi // enable JPD decoding
6695*53ee8cc1Swenshuai.xi #if ENABLE_JPEG_NO_SIZE_LOWER_BOUND
6696*53ee8cc1Swenshuai.xi MDrv_JPD_SetPicDimension(pic_width, pic_height);
6697*53ee8cc1Swenshuai.xi #endif
6698*53ee8cc1Swenshuai.xi
6699*53ee8cc1Swenshuai.xi //MDrv_Write2Byte( BK_JPD_SCONFIG, reg_value | JPD_DEC_EN | MDrv_JPD_GetSWResetMask());
6700*53ee8cc1Swenshuai.xi //MDrv_JPD_Set_S_Config(reg_value | JPD_DEC_EN | MDrv_JPD_GetSWResetMask());
6701*53ee8cc1Swenshuai.xi //MDrv_JPD_Set_S_Config(reg_value | JPD_DEC_EN | JPD_SWRST);
6702*53ee8cc1Swenshuai.xi #if 1
6703*53ee8cc1Swenshuai.xi // decide if we need to set the JPD_PSAVE_EN register in hal layer
6704*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST | JPD_PSAVE_EN);
6705*53ee8cc1Swenshuai.xi #else
6706*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_16_JPEGEnablePsaveModeTest==FALSE)
6707*53ee8cc1Swenshuai.xi #if defined(CHIP_A3) || defined(CHIP_E3) || defined(CHIP_A5) || defined(CHIP_A5P) || defined(CHIP_A6) || defined(CHIP_A7)
6708*53ee8cc1Swenshuai.xi // For safety, enable the JPD_PSAVE_EN as default since A5 (HW already fixed this bug since A1 or earlier chip)
6709*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST | JPD_PSAVE_EN);
6710*53ee8cc1Swenshuai.xi #else
6711*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.
6712*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST);
6713*53ee8cc1Swenshuai.xi #endif
6714*53ee8cc1Swenshuai.xi #else
6715*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)
6716*53ee8cc1Swenshuai.xi //Enable power save mode on normal JPEG decoding.
6717*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST | JPD_PSAVE_EN);
6718*53ee8cc1Swenshuai.xi #else
6719*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST);
6720*53ee8cc1Swenshuai.xi #endif
6721*53ee8cc1Swenshuai.xi #endif
6722*53ee8cc1Swenshuai.xi #endif
6723*53ee8cc1Swenshuai.xi
6724*53ee8cc1Swenshuai.xi // protect test(only for unit test)
6725*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_09_JPEGWriteProtectTest==FALSE)
6726*53ee8cc1Swenshuai.xi //MDrv_JPD_SetWriteProtect(TRUE);
6727*53ee8cc1Swenshuai.xi #else
6728*53ee8cc1Swenshuai.xi #if(JPD_SUPPORT_AUTO_PROTECT==FALSE)
6729*53ee8cc1Swenshuai.xi MDrv_JPD_SetWriteProtect(TRUE);
6730*53ee8cc1Swenshuai.xi #endif
6731*53ee8cc1Swenshuai.xi #endif
6732*53ee8cc1Swenshuai.xi
6733*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_AUTO_PROTECT==TRUE)
6734*53ee8cc1Swenshuai.xi MDrv_JPD_SetAutoProtect(TRUE);
6735*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_22_AutoProtectFailTest == TRUE)
6736*53ee8cc1Swenshuai.xi MDrv_JPD_SetWPENEndAddr(MWC_BUFFER_ADDR+0x200-1);
6737*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Set Auto protect address =0x%lx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", MWC_BUFFER_ADDR+0x200);
6738*53ee8cc1Swenshuai.xi #else
6739*53ee8cc1Swenshuai.xi MDrv_JPD_SetWPENEndAddr(MWC_BUFFER_ADDR+MWC_BUFFER_SIZE-1);
6740*53ee8cc1Swenshuai.xi #endif
6741*53ee8cc1Swenshuai.xi #endif
6742*53ee8cc1Swenshuai.xi
6743*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(MDrv_JPD_Get_S_Config() | JPD_DEC_EN);
6744*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("After Setting SCONFIG, JPD START!!\n");
6745*53ee8cc1Swenshuai.xi //JPEG_GO;
6746*53ee8cc1Swenshuai.xi return TRUE;
6747*53ee8cc1Swenshuai.xi }
6748*53ee8cc1Swenshuai.xi #endif
6749*53ee8cc1Swenshuai.xi
6750*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
6751*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6752*53ee8cc1Swenshuai.xi /******************************************************************************/
6753*53ee8cc1Swenshuai.xi ///Start Progressive JPEG decode for JPD
6754*53ee8cc1Swenshuai.xi /******************************************************************************/
JPEG_Progressive_Decode(void)6755*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_Result JPEG_Progressive_Decode(void)
6756*53ee8cc1Swenshuai.xi {
6757*53ee8cc1Swenshuai.xi if(_bProgressive_flag==FALSE)
6758*53ee8cc1Swenshuai.xi return (E_JPEG_FAILED);
6759*53ee8cc1Swenshuai.xi
6760*53ee8cc1Swenshuai.xi if ( _u16Total_lines_left == 0 )
6761*53ee8cc1Swenshuai.xi {
6762*53ee8cc1Swenshuai.xi return ( E_JPEG_OKAY );
6763*53ee8cc1Swenshuai.xi }
6764*53ee8cc1Swenshuai.xi
6765*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
6766*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
6767*53ee8cc1Swenshuai.xi {
6768*53ee8cc1Swenshuai.xi return ( E_JPEG_FAILED );
6769*53ee8cc1Swenshuai.xi }
6770*53ee8cc1Swenshuai.xi #endif
6771*53ee8cc1Swenshuai.xi
6772*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("_u16Mcus_per_row is %d!\n",_u16Mcus_per_row);
6773*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("_u16Mcus_per_col is %d!\n",_u16Mcus_per_col);
6774*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("_u8Blocks_per_mcu is %d!\n",_u8Blocks_per_mcu);
6775*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("gu8Max_mcu_x_size is %d!\n",gu8Max_mcu_x_size);
6776*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("gu8Max_mcu_y_size is %d!\n",gu8Max_mcu_y_size);
6777*53ee8cc1Swenshuai.xi
6778*53ee8cc1Swenshuai.xi if( _u16Total_lines_left > 0 )
6779*53ee8cc1Swenshuai.xi {
6780*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:_u16Total_lines_left = %d\n", __FUNCTION__ , _u16Total_lines_left);
6781*53ee8cc1Swenshuai.xi if(!JPEG_load_next_row())
6782*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
6783*53ee8cc1Swenshuai.xi
6784*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
6785*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
6786*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
6787*53ee8cc1Swenshuai.xi {
6788*53ee8cc1Swenshuai.xi if(!msAPI_JPEG_transform_row()) //IDCT
6789*53ee8cc1Swenshuai.xi {
6790*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CMYK and RGB decode failed!!\n");
6791*53ee8cc1Swenshuai.xi return ( E_JPEG_FAILED );
6792*53ee8cc1Swenshuai.xi }
6793*53ee8cc1Swenshuai.xi }
6794*53ee8cc1Swenshuai.xi #endif
6795*53ee8cc1Swenshuai.xi
6796*53ee8cc1Swenshuai.xi _u16Total_lines_left -= gu8Max_mcu_y_size;
6797*53ee8cc1Swenshuai.xi }
6798*53ee8cc1Swenshuai.xi
6799*53ee8cc1Swenshuai.xi return (E_JPEG_DONE);
6800*53ee8cc1Swenshuai.xi }
6801*53ee8cc1Swenshuai.xi #endif
6802*53ee8cc1Swenshuai.xi
6803*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_GetAlignedResolution(MS_U16 * width,MS_U16 * height)6804*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_GetAlignedResolution(MS_U16 *width, MS_U16 *height)
6805*53ee8cc1Swenshuai.xi {
6806*53ee8cc1Swenshuai.xi MS_U8 mcu_width, mcu_height;
6807*53ee8cc1Swenshuai.xi MS_U8 Y_VSF = _u8Comp_v_samp[0];
6808*53ee8cc1Swenshuai.xi MS_U8 Y_HSF = _u8Comp_h_samp[0];
6809*53ee8cc1Swenshuai.xi
6810*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6811*53ee8cc1Swenshuai.xi
6812*53ee8cc1Swenshuai.xi *width = _u16OriginalImage_x_size;
6813*53ee8cc1Swenshuai.xi *height = _u16OriginalImage_y_size;
6814*53ee8cc1Swenshuai.xi
6815*53ee8cc1Swenshuai.xi mcu_width = _u16OriginalImage_x_size % (Y_HSF * 8);
6816*53ee8cc1Swenshuai.xi if (mcu_width)
6817*53ee8cc1Swenshuai.xi {
6818*53ee8cc1Swenshuai.xi *width += (Y_HSF * 8 - mcu_width);
6819*53ee8cc1Swenshuai.xi }
6820*53ee8cc1Swenshuai.xi
6821*53ee8cc1Swenshuai.xi mcu_height = _u16OriginalImage_y_size % (Y_VSF * 8);
6822*53ee8cc1Swenshuai.xi if (mcu_height)
6823*53ee8cc1Swenshuai.xi {
6824*53ee8cc1Swenshuai.xi *height += (Y_VSF * 8 - mcu_height);
6825*53ee8cc1Swenshuai.xi }
6826*53ee8cc1Swenshuai.xi
6827*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_u8Comp_v_samp = %d, _u8Comp_h_samp = %d\n", _u8Comp_v_samp[0], _u8Comp_h_samp[0]);
6828*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_u16OriginalImage_x_size = %d, _u16OriginalImage_y_size = %d\n", _u16OriginalImage_x_size, _u16OriginalImage_y_size);
6829*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("AlignWidth = %d, AlignHeight = %d\n", *width, *height);
6830*53ee8cc1Swenshuai.xi }
6831*53ee8cc1Swenshuai.xi
6832*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6833*53ee8cc1Swenshuai.xi // Global Functions
6834*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6835*53ee8cc1Swenshuai.xi #if 0
6836*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6837*53ee8cc1Swenshuai.xi /******************************************************************************/
6838*53ee8cc1Swenshuai.xi ///This will set MRC buffer address & size, MWC buffer address, and internal buffer
6839*53ee8cc1Swenshuai.xi ///address & size.
6840*53ee8cc1Swenshuai.xi ///@param *pInitParam \b The pointer of information for JPEG Buffer initialization
6841*53ee8cc1Swenshuai.xi /// structure {
6842*53ee8cc1Swenshuai.xi /// U32 u32MRCBufAddr, \b IN MRC buffer address
6843*53ee8cc1Swenshuai.xi /// U32 u32MRCBufSize, \b IN MRC buffer size
6844*53ee8cc1Swenshuai.xi /// U32 u32MWCBufAddr, \b IN MWC buffer address
6845*53ee8cc1Swenshuai.xi /// JPEG decompress data (YUV422)
6846*53ee8cc1Swenshuai.xi /// U32 u32InternalBufAddr, \b IN internal buffer address
6847*53ee8cc1Swenshuai.xi /// (exif:64K + memory pool)
6848*53ee8cc1Swenshuai.xi /// U32 u32InternalBufSize, \b IN internal buffer size
6849*53ee8cc1Swenshuai.xi /// BOOL bInitMem, \b IN initialize memory pool or not
6850*53ee8cc1Swenshuai.xi /// };
6851*53ee8cc1Swenshuai.xi ///@return TRUE or FALSE
6852*53ee8cc1Swenshuai.xi /******************************************************************************/
6853*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_SetInitParameter(JPEG_InitParam *pInitParam)
6854*53ee8cc1Swenshuai.xi {
6855*53ee8cc1Swenshuai.xi // the buffer size must be multiple of 4 bytes
6856*53ee8cc1Swenshuai.xi if((!pInitParam)
6857*53ee8cc1Swenshuai.xi || (pInitParam->u32MRCBufSize < MIN_READBUFFER_SIZE))
6858*53ee8cc1Swenshuai.xi {
6859*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_READBUFFER_TOOSMALL);
6860*53ee8cc1Swenshuai.xi return FALSE;
6861*53ee8cc1Swenshuai.xi }
6862*53ee8cc1Swenshuai.xi // the buffer size must be multiple of 8 bytes
6863*53ee8cc1Swenshuai.xi pInitParam->u32MRCBufSize = pInitParam->u32MRCBufSize & ~0x7;
6864*53ee8cc1Swenshuai.xi
6865*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR = pInitParam->u32MRCBufAddr | AEON_NON_CACHE_MASK;
6866*53ee8cc1Swenshuai.xi MWC_BUFFER_ADDR = pInitParam->u32MWCBufAddr | AEON_NON_CACHE_MASK;
6867*53ee8cc1Swenshuai.xi INTERNAL_BUFFER_ADDR = pInitParam->u32InternalBufAddr | AEON_NON_CACHE_MASK;
6868*53ee8cc1Swenshuai.xi MRC_BUFFER_SIZE = pInitParam->u32MRCBufSize;
6869*53ee8cc1Swenshuai.xi INTERNAL_BUFFER_SIZE = pInitParam->u32InternalBufSize;
6870*53ee8cc1Swenshuai.xi
6871*53ee8cc1Swenshuai.xi _pu8In_buf = (MS_U8 *) pInitParam->u32MRCBufAddr;
6872*53ee8cc1Swenshuai.xi
6873*53ee8cc1Swenshuai.xi if (pInitParam->bInitMem)
6874*53ee8cc1Swenshuai.xi {
6875*53ee8cc1Swenshuai.xi JPEG_MEMORY_init_mempool(((MS_U8 *)(pInitParam->u32InternalBufAddr + JPEG_DEFAULT_EXIF_SIZE))
6876*53ee8cc1Swenshuai.xi , (pInitParam->u32InternalBufSize - JPEG_DEFAULT_EXIF_SIZE));
6877*53ee8cc1Swenshuai.xi }
6878*53ee8cc1Swenshuai.xi
6879*53ee8cc1Swenshuai.xi return TRUE;
6880*53ee8cc1Swenshuai.xi }
6881*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6882*53ee8cc1Swenshuai.xi // Call get_error_code() after constructing to determine if the stream
6883*53ee8cc1Swenshuai.xi // was valid or not. You may call the get_width(), get_height(), etc.
6884*53ee8cc1Swenshuai.xi // methods after the constructor is called.
6885*53ee8cc1Swenshuai.xi // You may then either destruct the object, or begin decoding the image
6886*53ee8cc1Swenshuai.xi // by calling begin(), then decode().
6887*53ee8cc1Swenshuai.xi void MApi_JPEG_Constructor( PJPEG_FILE_FileSystem_t Pstream, MS_U8 decode_type)
6888*53ee8cc1Swenshuai.xi {
6889*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
6890*53ee8cc1Swenshuai.xi {
6891*53ee8cc1Swenshuai.xi return;
6892*53ee8cc1Swenshuai.xi }
6893*53ee8cc1Swenshuai.xi
6894*53ee8cc1Swenshuai.xi _u8DecodeType = decode_type;
6895*53ee8cc1Swenshuai.xi JPEG_init_thumbnail();
6896*53ee8cc1Swenshuai.xi JPEG_decode_init( Pstream);
6897*53ee8cc1Swenshuai.xi
6898*53ee8cc1Swenshuai.xi #ifdef CMODEL
6899*53ee8cc1Swenshuai.xi _bReady_flag = TRUE;
6900*53ee8cc1Swenshuai.xi #endif
6901*53ee8cc1Swenshuai.xi }
6902*53ee8cc1Swenshuai.xi #endif
6903*53ee8cc1Swenshuai.xi
6904*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
MApi_JPEG_Is_RGB_CMYK(void)6905*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL MApi_JPEG_Is_RGB_CMYK(void)
6906*53ee8cc1Swenshuai.xi {
6907*53ee8cc1Swenshuai.xi if (_u8Comps_in_frame == 3)
6908*53ee8cc1Swenshuai.xi {
6909*53ee8cc1Swenshuai.xi //support only U_H1V1 & V_H1V1
6910*53ee8cc1Swenshuai.xi if ((_u8Comp_h_samp[1] != 1 || _u8Comp_v_samp[1] != 1)
6911*53ee8cc1Swenshuai.xi || (_u8Comp_h_samp[2] != 1 || _u8Comp_v_samp[2] != 1))
6912*53ee8cc1Swenshuai.xi {
6913*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
6914*53ee8cc1Swenshuai.xi return FALSE;
6915*53ee8cc1Swenshuai.xi }
6916*53ee8cc1Swenshuai.xi
6917*53ee8cc1Swenshuai.xi if (_u8Comp_h_samp[0] == 1 && _u8Comp_v_samp[0] == 1)
6918*53ee8cc1Swenshuai.xi {
6919*53ee8cc1Swenshuai.xi if (_u8Comp_ident[0] == 82 || _u8Comp_ident[0] == 71 || _u8Comp_ident[0] == 66)
6920*53ee8cc1Swenshuai.xi return TRUE; // RGB
6921*53ee8cc1Swenshuai.xi }
6922*53ee8cc1Swenshuai.xi }
6923*53ee8cc1Swenshuai.xi else
6924*53ee8cc1Swenshuai.xi if (_u8Comps_in_frame == 4) //handle YCCK & CMYK case, must distinguish YCCK and CMYK later
6925*53ee8cc1Swenshuai.xi {
6926*53ee8cc1Swenshuai.xi if (_u8Comp_h_samp[0] == 1 && _u8Comp_v_samp[0] == 1)
6927*53ee8cc1Swenshuai.xi return TRUE; // CMYK
6928*53ee8cc1Swenshuai.xi }
6929*53ee8cc1Swenshuai.xi
6930*53ee8cc1Swenshuai.xi return FALSE;
6931*53ee8cc1Swenshuai.xi }
6932*53ee8cc1Swenshuai.xi #endif
6933*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6934*53ee8cc1Swenshuai.xi /********************************************************************/
6935*53ee8cc1Swenshuai.xi ///This function will\n
6936*53ee8cc1Swenshuai.xi ///1. set MRC buffer address & size, MWC buffer address, and internal buffer address & size.\n
6937*53ee8cc1Swenshuai.xi ///2. power on JPD\n
6938*53ee8cc1Swenshuai.xi ///3. reset thumbnail parameters\n
6939*53ee8cc1Swenshuai.xi ///4. set the stream and its size, the number of components, etc.\n
6940*53ee8cc1Swenshuai.xi ///Call MApi_JPEG_GetErrorCode() after it to determine if the stream was valid or not.\n
6941*53ee8cc1Swenshuai.xi ///@param -pInitParam \b IN : \n
6942*53ee8cc1Swenshuai.xi /// structure {\n
6943*53ee8cc1Swenshuai.xi /// MS_PHYADDR \b u32MRCBufAddr : MRC buffer address\n
6944*53ee8cc1Swenshuai.xi /// MS_U32 \b u32MRCBufSize : MRC buffer size\n
6945*53ee8cc1Swenshuai.xi /// MS_PHYADDR \b u32MWCBufAddr : MWC buffer address(JPEG decompress data (YUV422))\n
6946*53ee8cc1Swenshuai.xi /// MS_U32 \b u32MWCBufSize : MWC buffer size\n
6947*53ee8cc1Swenshuai.xi /// MS_PHYADDR \b u32InternalBufAddr : Internal buffer address(exif:64K + memory pool)\n
6948*53ee8cc1Swenshuai.xi /// MS_U32 \b u32InternalBufSize : Internal buffer size\n
6949*53ee8cc1Swenshuai.xi /// MS_U32 \b u32DecByteRead : how many byte read for JPEG decoder initialization\n
6950*53ee8cc1Swenshuai.xi /// MS_BOOL \b bEOF : has read to the end of file\n
6951*53ee8cc1Swenshuai.xi /// MS_U8 \b u8DecoderType : 3 types: JPEG main, thumbnail, or MJPEG\n
6952*53ee8cc1Swenshuai.xi /// MS_BOOL \b bInitMem : initialize memory pool or not\n
6953*53ee8cc1Swenshuai.xi /// JPEG_FillHdrFunc \b pFillHdrFunc : the function for fill header information\n
6954*53ee8cc1Swenshuai.xi /// };
6955*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result : JPEG init status
6956*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Success
6957*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Failed
6958*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_Init_OJPD(JPEG_InitParam * pInitParam)6959*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_Init_OJPD(JPEG_InitParam *pInitParam)
6960*53ee8cc1Swenshuai.xi {
6961*53ee8cc1Swenshuai.xi #if 0
6962*53ee8cc1Swenshuai.xi MApi_JPEG_SetDbgLevel(E_JPEG_DEBUG_ALL);
6963*53ee8cc1Swenshuai.xi #endif
6964*53ee8cc1Swenshuai.xi
6965*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
6966*53ee8cc1Swenshuai.xi //printf("init WDT and timer1....\n");
6967*53ee8cc1Swenshuai.xi MDrv_WDT_Init((WDT_DbgLv)E_WDT_DBGLV_ERR_ONLY);
6968*53ee8cc1Swenshuai.xi MDrv_TIMER_Count(E_TIMER_1, 1);
6969*53ee8cc1Swenshuai.xi #endif
6970*53ee8cc1Swenshuai.xi
6971*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
6972*53ee8cc1Swenshuai.xi static MS_U8 fileName2[]={'/','u','s','b','/','s','d','a','1','/','l','o', 'g', '0', '0', '0', '.', 'b', 'i', 'n',0};
6973*53ee8cc1Swenshuai.xi fileName2[15]++;
6974*53ee8cc1Swenshuai.xi if(fileName2[15] > '9')
6975*53ee8cc1Swenshuai.xi {
6976*53ee8cc1Swenshuai.xi fileName2[14]++;
6977*53ee8cc1Swenshuai.xi fileName2[15] = '0';
6978*53ee8cc1Swenshuai.xi }
6979*53ee8cc1Swenshuai.xi if(fileName2[14] > '9')
6980*53ee8cc1Swenshuai.xi {
6981*53ee8cc1Swenshuai.xi fileName2[13]++;
6982*53ee8cc1Swenshuai.xi fileName2[14] = '0';
6983*53ee8cc1Swenshuai.xi }
6984*53ee8cc1Swenshuai.xi
6985*53ee8cc1Swenshuai.xi if((logBinfp = fopen((char *)fileName2, "wb"))==NULL)
6986*53ee8cc1Swenshuai.xi {
6987*53ee8cc1Swenshuai.xi printf("Can't open /usb/sda1/log.bin\n");
6988*53ee8cc1Swenshuai.xi }
6989*53ee8cc1Swenshuai.xi else
6990*53ee8cc1Swenshuai.xi {
6991*53ee8cc1Swenshuai.xi printf("open /usb/sda1/log.bin success\n");
6992*53ee8cc1Swenshuai.xi }
6993*53ee8cc1Swenshuai.xi #endif
6994*53ee8cc1Swenshuai.xi
6995*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6996*53ee8cc1Swenshuai.xi
6997*53ee8cc1Swenshuai.xi // jpeg constructor
6998*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
6999*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
7000*53ee8cc1Swenshuai.xi {
7001*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7002*53ee8cc1Swenshuai.xi }
7003*53ee8cc1Swenshuai.xi #endif
7004*53ee8cc1Swenshuai.xi
7005*53ee8cc1Swenshuai.xi if(_bIsInit == TRUE)
7006*53ee8cc1Swenshuai.xi {
7007*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
7008*53ee8cc1Swenshuai.xi if(MApi_JPEG_IsMPOFormat()==FALSE)
7009*53ee8cc1Swenshuai.xi {
7010*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_RE_INIT);
7011*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7012*53ee8cc1Swenshuai.xi }
7013*53ee8cc1Swenshuai.xi #else
7014*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_RE_INIT);
7015*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7016*53ee8cc1Swenshuai.xi #endif
7017*53ee8cc1Swenshuai.xi }
7018*53ee8cc1Swenshuai.xi else
7019*53ee8cc1Swenshuai.xi {
7020*53ee8cc1Swenshuai.xi _bIsInit = TRUE;
7021*53ee8cc1Swenshuai.xi }
7022*53ee8cc1Swenshuai.xi
7023*53ee8cc1Swenshuai.xi if(!pInitParam)
7024*53ee8cc1Swenshuai.xi {
7025*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_DECODE_ERROR);
7026*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7027*53ee8cc1Swenshuai.xi }
7028*53ee8cc1Swenshuai.xi
7029*53ee8cc1Swenshuai.xi // if(pInitParam->u32MRCBufSize < MIN_READBUFFER_SIZE)
7030*53ee8cc1Swenshuai.xi if(pInitParam->u32MRCBufSize < JPEG_DEFAULT_EXIF_SIZE)
7031*53ee8cc1Swenshuai.xi {
7032*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_READBUFFER_TOOSMALL);
7033*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7034*53ee8cc1Swenshuai.xi }
7035*53ee8cc1Swenshuai.xi
7036*53ee8cc1Swenshuai.xi // the buffer size must be multiple of 8 bytes
7037*53ee8cc1Swenshuai.xi pInitParam->u32MRCBufSize = pInitParam->u32MRCBufSize & ~0x7;
7038*53ee8cc1Swenshuai.xi
7039*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32MRCBufAddr);// | AEON_NON_CACHE_MASK;
7040*53ee8cc1Swenshuai.xi MWC_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32MWCBufAddr);// | AEON_NON_CACHE_MASK;
7041*53ee8cc1Swenshuai.xi INTERNAL_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32InternalBufAddr);// | AEON_NON_CACHE_MASK;
7042*53ee8cc1Swenshuai.xi if (__bIsMjpeg)
7043*53ee8cc1Swenshuai.xi {
7044*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("MJPEG Read buffer address CONVERT : 0x%lx - 0x%lx + 0x%lx ",
7045*53ee8cc1Swenshuai.xi MS_VA2PA(MRC_BUFFER_ADDR), MS_VA2PA(__u32RealMjpegBase), MS_VA2PA(__u32TrickyMjpegBase));
7046*53ee8cc1Swenshuai.xi #if MJPEG_SW_PARSING_IN_MIU0
7047*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR -= __u32RealMjpegBase;
7048*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR += __u32TrickyMjpegBase;
7049*53ee8cc1Swenshuai.xi #endif
7050*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("= 0x%lx\n", MS_VA2PA(MRC_BUFFER_ADDR));
7051*53ee8cc1Swenshuai.xi }
7052*53ee8cc1Swenshuai.xi _pu8In_buf = (MS_U8 *)MRC_BUFFER_ADDR;//pInitParam->u32MRCBufAddr;
7053*53ee8cc1Swenshuai.xi
7054*53ee8cc1Swenshuai.xi MRC_BUFFER_SIZE = pInitParam->u32MRCBufSize;
7055*53ee8cc1Swenshuai.xi MWC_BUFFER_SIZE = pInitParam->u32MWCBufSize;
7056*53ee8cc1Swenshuai.xi INTERNAL_BUFFER_SIZE = pInitParam->u32InternalBufSize;
7057*53ee8cc1Swenshuai.xi
7058*53ee8cc1Swenshuai.xi
7059*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MRC_ADDR = 0x%lX, MRC_BUFFER_SIZE = 0x%lX\n", _u32ReadBufferAddr, _u32ReadBufferSize);
7060*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MWC_ADDR = 0x%lX, MWC_BUFFER_SIZE = 0x%lX\n", _u32WriteBufferAddr, _u32WriteBufferSize);
7061*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("INTERNAL_ADDR = 0x%lX, INTERNAL_BUFFER_SIZE = 0x%lX\n", _u32InternalBufferAddr, _u32InternalBufferSize);
7062*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("MRC_PA= 0x%lx\n", MS_VA2PA(MRC_BUFFER_ADDR));
7063*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("MWC_PA= 0x%lx\n", MS_VA2PA(MWC_BUFFER_ADDR));
7064*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("INTER_PA= 0x%lx\n", MS_VA2PA(INTERNAL_BUFFER_ADDR));
7065*53ee8cc1Swenshuai.xi
7066*53ee8cc1Swenshuai.xi _pFillHdrFunc = pInitParam->pFillHdrFunc;
7067*53ee8cc1Swenshuai.xi
7068*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7069*53ee8cc1Swenshuai.xi u8Out_buf = (MS_U8 *) MWC_BUFFER_ADDR;
7070*53ee8cc1Swenshuai.xi u32_Decode_Line = 0;
7071*53ee8cc1Swenshuai.xi #endif
7072*53ee8cc1Swenshuai.xi
7073*53ee8cc1Swenshuai.xi //JPEG_GO;
7074*53ee8cc1Swenshuai.xi
7075*53ee8cc1Swenshuai.xi // powner on JPD
7076*53ee8cc1Swenshuai.xi #ifndef CMODEL
7077*53ee8cc1Swenshuai.xi MDrv_JPD_PowerOn();
7078*53ee8cc1Swenshuai.xi #endif
7079*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MDrv_JPD_PowerOn OK!!\n");
7080*53ee8cc1Swenshuai.xi
7081*53ee8cc1Swenshuai.xi _u8DecodeType = pInitParam->u8DecodeType;
7082*53ee8cc1Swenshuai.xi
7083*53ee8cc1Swenshuai.xi _u32In_buf_left = pInitParam->u32DecByteRead;
7084*53ee8cc1Swenshuai.xi _bEOF_flag = pInitParam->bEOF;
7085*53ee8cc1Swenshuai.xi
7086*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@1, _pu8In_buf_ofs=0x%lx, _u32In_buf_left=0x%lx, _bEOF_flag=%d========\n",
7087*53ee8cc1Swenshuai.xi (MS_U32)_pu8In_buf_ofs, (MS_U32)_u32In_buf_left, _bEOF_flag);
7088*53ee8cc1Swenshuai.xi // Try to get more bytes.
7089*53ee8cc1Swenshuai.xi if(!JPEG_force_fill_read_buffer(_u32In_buf_left))
7090*53ee8cc1Swenshuai.xi {
7091*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_force_fill_read_buffer failed!!!\n");
7092*53ee8cc1Swenshuai.xi _u32In_buf_left = pInitParam->u32DecByteRead;
7093*53ee8cc1Swenshuai.xi }
7094*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@2, _pu8In_buf_ofs=0x%lx, _u32In_buf_left=0x%lx, _bEOF_flag=%d========\n",
7095*53ee8cc1Swenshuai.xi (MS_U32)_pu8In_buf_ofs, (MS_U32)_u32In_buf_left, _bEOF_flag);
7096*53ee8cc1Swenshuai.xi
7097*53ee8cc1Swenshuai.xi
7098*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
7099*53ee8cc1Swenshuai.xi if(_u32In_buf_MPO_left ==0xFFFFFFFFUL)
7100*53ee8cc1Swenshuai.xi {
7101*53ee8cc1Swenshuai.xi _pu8In_buf_MPO_ofs = (MS_U8*)_pu8In_buf;
7102*53ee8cc1Swenshuai.xi _u32In_buf_MPO_left = _u32In_buf_left;
7103*53ee8cc1Swenshuai.xi mpo_load_data = TRUE;
7104*53ee8cc1Swenshuai.xi bIsMPOFormat = FALSE;
7105*53ee8cc1Swenshuai.xi u32MPFOffset = 0;
7106*53ee8cc1Swenshuai.xi _u32App2MarkerOffset = 0;
7107*53ee8cc1Swenshuai.xi
7108*53ee8cc1Swenshuai.xi //Init MPO database
7109*53ee8cc1Swenshuai.xi JPEG_InitMPO();
7110*53ee8cc1Swenshuai.xi }
7111*53ee8cc1Swenshuai.xi #endif
7112*53ee8cc1Swenshuai.xi
7113*53ee8cc1Swenshuai.xi u32DataOffset = 0;
7114*53ee8cc1Swenshuai.xi u32SOFOffset = 0;
7115*53ee8cc1Swenshuai.xi
7116*53ee8cc1Swenshuai.xi JPEG_init_thumbnail();
7117*53ee8cc1Swenshuai.xi
7118*53ee8cc1Swenshuai.xi if (_u8DecodeType == E_JPEG_TYPE_MJPEG)
7119*53ee8cc1Swenshuai.xi {
7120*53ee8cc1Swenshuai.xi __bIsMjpeg = TRUE;
7121*53ee8cc1Swenshuai.xi #if MJPEG_SW_PARSING_IN_MIU0
7122*53ee8cc1Swenshuai.xi __u32RealMjpegBase = MRC_BUFFER_ADDR;
7123*53ee8cc1Swenshuai.xi __u32TrickyMjpegBase = INTERNAL_BUFFER_ADDR;
7124*53ee8cc1Swenshuai.xi #endif
7125*53ee8cc1Swenshuai.xi
7126*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
7127*53ee8cc1Swenshuai.xi }
7128*53ee8cc1Swenshuai.xi
7129*53ee8cc1Swenshuai.xi if(!JPEG_decode_init())
7130*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7131*53ee8cc1Swenshuai.xi
7132*53ee8cc1Swenshuai.xi if (bMHEG5)
7133*53ee8cc1Swenshuai.xi {
7134*53ee8cc1Swenshuai.xi if(_Error_code == E_JPEG_UNSUPPORTED_MARKER)
7135*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7136*53ee8cc1Swenshuai.xi }
7137*53ee8cc1Swenshuai.xi
7138*53ee8cc1Swenshuai.xi #ifndef CMODEL
7139*53ee8cc1Swenshuai.xi //init mempool for progressive decoding.
7140*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7141*53ee8cc1Swenshuai.xi if (pInitParam->bInitMem && (_bProgressive_flag || MApi_JPEG_Is_RGB_CMYK()))
7142*53ee8cc1Swenshuai.xi #else
7143*53ee8cc1Swenshuai.xi if (pInitParam->bInitMem && _bProgressive_flag)
7144*53ee8cc1Swenshuai.xi #endif
7145*53ee8cc1Swenshuai.xi #endif
7146*53ee8cc1Swenshuai.xi {
7147*53ee8cc1Swenshuai.xi if(!JPEG_MEMORY_init_mempool((void *)(INTERNAL_BUFFER_ADDR + JPEG_DEFAULT_EXIF_SIZE)
7148*53ee8cc1Swenshuai.xi , (INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE)))
7149*53ee8cc1Swenshuai.xi {
7150*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_MEMORY_init_mempool FAIL!!\n");
7151*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7152*53ee8cc1Swenshuai.xi }
7153*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_MEMORY_init_mempool OK!!\n");
7154*53ee8cc1Swenshuai.xi }
7155*53ee8cc1Swenshuai.xi
7156*53ee8cc1Swenshuai.xi //JPEG_GO;
7157*53ee8cc1Swenshuai.xi
7158*53ee8cc1Swenshuai.xi #ifdef CMODEL
7159*53ee8cc1Swenshuai.xi _bReady_flag = TRUE;
7160*53ee8cc1Swenshuai.xi #endif
7161*53ee8cc1Swenshuai.xi
7162*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
7163*53ee8cc1Swenshuai.xi }
7164*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7165*53ee8cc1Swenshuai.xi /********************************************************************/
7166*53ee8cc1Swenshuai.xi ///Decode JPEG header
7167*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result : JPEG header decode status
7168*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Success
7169*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Failed
7170*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_DecodeHdr_OJPD(void)7171*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_DecodeHdr_OJPD(void)
7172*53ee8cc1Swenshuai.xi {
7173*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7174*53ee8cc1Swenshuai.xi MS_U8 mcu_width, mcu_height;
7175*53ee8cc1Swenshuai.xi MS_U16 pic_width = _u16Image_x_size;
7176*53ee8cc1Swenshuai.xi MS_U16 pic_height = _u16Image_y_size;
7177*53ee8cc1Swenshuai.xi MS_U8 Y_VSF = _u8Comp_v_samp[0];
7178*53ee8cc1Swenshuai.xi MS_U8 Y_HSF = _u8Comp_h_samp[0];
7179*53ee8cc1Swenshuai.xi #endif
7180*53ee8cc1Swenshuai.xi
7181*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
7182*53ee8cc1Swenshuai.xi u32MeasureDecodeTime =MDrv_TIMER_GetUs(E_TIMER_1);
7183*53ee8cc1Swenshuai.xi u32MeasureDecodeTimeSW = 0;
7184*53ee8cc1Swenshuai.xi u32MeasureDecodeTimeHW = 0;
7185*53ee8cc1Swenshuai.xi #endif
7186*53ee8cc1Swenshuai.xi
7187*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7188*53ee8cc1Swenshuai.xi {
7189*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7190*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7191*53ee8cc1Swenshuai.xi }
7192*53ee8cc1Swenshuai.xi
7193*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7194*53ee8cc1Swenshuai.xi
7195*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
7196*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
7197*53ee8cc1Swenshuai.xi {
7198*53ee8cc1Swenshuai.xi return ( E_JPEG_FAILED );
7199*53ee8cc1Swenshuai.xi }
7200*53ee8cc1Swenshuai.xi #endif
7201*53ee8cc1Swenshuai.xi
7202*53ee8cc1Swenshuai.xi if(!JPEG_init_frame())
7203*53ee8cc1Swenshuai.xi {
7204*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
7205*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7206*53ee8cc1Swenshuai.xi }
7207*53ee8cc1Swenshuai.xi
7208*53ee8cc1Swenshuai.xi if ( _bProgressive_flag )
7209*53ee8cc1Swenshuai.xi {
7210*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
7211*53ee8cc1Swenshuai.xi if(!JPEG_init_progressive())
7212*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7213*53ee8cc1Swenshuai.xi #endif
7214*53ee8cc1Swenshuai.xi }
7215*53ee8cc1Swenshuai.xi else
7216*53ee8cc1Swenshuai.xi {
7217*53ee8cc1Swenshuai.xi if(!JPEG_init_sequential())
7218*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7219*53ee8cc1Swenshuai.xi }
7220*53ee8cc1Swenshuai.xi
7221*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7222*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
7223*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
7224*53ee8cc1Swenshuai.xi {
7225*53ee8cc1Swenshuai.xi if ( ( mcu_width = pic_width % ( Y_HSF * 8 ) ) )
7226*53ee8cc1Swenshuai.xi {
7227*53ee8cc1Swenshuai.xi pic_width += ( Y_HSF * 8 - mcu_width );
7228*53ee8cc1Swenshuai.xi }
7229*53ee8cc1Swenshuai.xi
7230*53ee8cc1Swenshuai.xi if ( ( mcu_height = pic_height% ( Y_VSF * 8 ) ) )
7231*53ee8cc1Swenshuai.xi {
7232*53ee8cc1Swenshuai.xi pic_height += ( Y_VSF * 8 - mcu_height );
7233*53ee8cc1Swenshuai.xi }
7234*53ee8cc1Swenshuai.xi
7235*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Y_HSF = %d and Y_VSF = %d\n",Y_HSF, Y_VSF);
7236*53ee8cc1Swenshuai.xi
7237*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mcu_width = %d and mcu_height = %d\n",mcu_width, mcu_height);
7238*53ee8cc1Swenshuai.xi
7239*53ee8cc1Swenshuai.xi _u16NonAlignmentImage_x_size = pic_width;
7240*53ee8cc1Swenshuai.xi _u16NonAlignmentImage_y_size = _u16Image_y_size;
7241*53ee8cc1Swenshuai.xi _u16Image_x_size = pic_width;
7242*53ee8cc1Swenshuai.xi _u16Image_y_size = pic_height;
7243*53ee8cc1Swenshuai.xi
7244*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Width = %d and Height = %d\n",JPEG_MAX_WIDTH, JPEG_MAX_HEIGHT);
7245*53ee8cc1Swenshuai.xi
7246*53ee8cc1Swenshuai.xi //Set the Scale down variable
7247*53ee8cc1Swenshuai.xi if(_u16Image_x_size > JPEG_MAX_WIDTH*4 || _u16Image_y_size>JPEG_MAX_HEIGHT*4)
7248*53ee8cc1Swenshuai.xi {
7249*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = E_JPD_DOWNSCALE_EIGHTH;
7250*53ee8cc1Swenshuai.xi _u16Image_x_size= (_u16Image_x_size/ 64)*64;
7251*53ee8cc1Swenshuai.xi _u16Image_x_size = _u16Image_x_size/ 8;
7252*53ee8cc1Swenshuai.xi _u16Image_y_size = _u16Image_y_size/ 8;
7253*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/8!!\n");
7254*53ee8cc1Swenshuai.xi }
7255*53ee8cc1Swenshuai.xi else if(_u16Image_x_size > JPEG_MAX_WIDTH*2 || _u16Image_y_size>JPEG_MAX_HEIGHT*2)
7256*53ee8cc1Swenshuai.xi {
7257*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = E_JPD_DOWNSCALE_FOURTH;
7258*53ee8cc1Swenshuai.xi _u16Image_x_size= (_u16Image_x_size/ 32)*32;
7259*53ee8cc1Swenshuai.xi _u16Image_x_size = _u16Image_x_size/ 4;
7260*53ee8cc1Swenshuai.xi _u16Image_y_size = _u16Image_y_size/ 4;
7261*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/4!!\n");
7262*53ee8cc1Swenshuai.xi }
7263*53ee8cc1Swenshuai.xi else if (_u16Image_x_size > JPEG_MAX_WIDTH || _u16Image_y_size>JPEG_MAX_HEIGHT)
7264*53ee8cc1Swenshuai.xi {
7265*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = E_JPD_DOWNSCALE_HALF;
7266*53ee8cc1Swenshuai.xi _u16Image_x_size= (_u16Image_x_size/ 16)*16;
7267*53ee8cc1Swenshuai.xi _u16Image_x_size = _u16Image_x_size/ 2;
7268*53ee8cc1Swenshuai.xi _u16Image_y_size = _u16Image_y_size/ 2;
7269*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/2!!\n");
7270*53ee8cc1Swenshuai.xi }
7271*53ee8cc1Swenshuai.xi else
7272*53ee8cc1Swenshuai.xi {
7273*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/1!!\n");
7274*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = E_JPD_DOWNSCALE_ORG;
7275*53ee8cc1Swenshuai.xi
7276*53ee8cc1Swenshuai.xi }
7277*53ee8cc1Swenshuai.xi
7278*53ee8cc1Swenshuai.xi _u16PaddingMcuNumber = (_u16Image_x_size << _u8ScaleDownFactor)/gu8Max_mcu_x_size;
7279*53ee8cc1Swenshuai.xi _u32Max_blocks_per_row = _u16PaddingMcuNumber* _u16Max_blocks_per_mcu;
7280*53ee8cc1Swenshuai.xi
7281*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale width : %d\n",_u16Image_x_size);
7282*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale height : %d\n",_u16Image_y_size);
7283*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale MCU : %d\n",_u16PaddingMcuNumber);
7284*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale MCU : %ld\n",_u32Max_blocks_per_row);
7285*53ee8cc1Swenshuai.xi }
7286*53ee8cc1Swenshuai.xi #endif
7287*53ee8cc1Swenshuai.xi
7288*53ee8cc1Swenshuai.xi if (__bIsMjpeg)
7289*53ee8cc1Swenshuai.xi {
7290*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("MJPEG Read buffer address RECOVER : 0x%lx - 0x%lx + 0x%lx ",
7291*53ee8cc1Swenshuai.xi MS_VA2PA(MRC_BUFFER_ADDR), MS_VA2PA(__u32TrickyMjpegBase), MS_VA2PA(__u32RealMjpegBase));
7292*53ee8cc1Swenshuai.xi #if MJPEG_SW_PARSING_IN_MIU0
7293*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR -= __u32TrickyMjpegBase;
7294*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR += __u32RealMjpegBase;
7295*53ee8cc1Swenshuai.xi #endif
7296*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("= 0x%lx\n", MS_VA2PA(MRC_BUFFER_ADDR));
7297*53ee8cc1Swenshuai.xi }
7298*53ee8cc1Swenshuai.xi
7299*53ee8cc1Swenshuai.xi return ( E_JPEG_OKAY );
7300*53ee8cc1Swenshuai.xi }
7301*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7302*53ee8cc1Swenshuai.xi /********************************************************************/
7303*53ee8cc1Swenshuai.xi ///Decode JPEG data (baseline & progressive)
7304*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result : JPEG decode status
7305*53ee8cc1Swenshuai.xi /// - E_JPEG_DONE : For progressive decoding one line done.
7306*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Success
7307*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Failed
7308*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_Decode_OJPD(void)7309*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_Decode_OJPD(void)
7310*53ee8cc1Swenshuai.xi {
7311*53ee8cc1Swenshuai.xi JPEG_Result retVal = E_JPEG_FAILED;
7312*53ee8cc1Swenshuai.xi
7313*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7314*53ee8cc1Swenshuai.xi {
7315*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7316*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7317*53ee8cc1Swenshuai.xi }
7318*53ee8cc1Swenshuai.xi
7319*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: _bProgressive_flag = %d\n", __FUNCTION__ , _bProgressive_flag);
7320*53ee8cc1Swenshuai.xi
7321*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
7322*53ee8cc1Swenshuai.xi {
7323*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
7324*53ee8cc1Swenshuai.xi retVal = JPEG_Progressive_Decode();
7325*53ee8cc1Swenshuai.xi #endif
7326*53ee8cc1Swenshuai.xi }
7327*53ee8cc1Swenshuai.xi else
7328*53ee8cc1Swenshuai.xi {
7329*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7330*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
7331*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
7332*53ee8cc1Swenshuai.xi {
7333*53ee8cc1Swenshuai.xi retVal = msAPI_JPEG_Baseline_Decode();
7334*53ee8cc1Swenshuai.xi return retVal;
7335*53ee8cc1Swenshuai.xi }
7336*53ee8cc1Swenshuai.xi #endif
7337*53ee8cc1Swenshuai.xi
7338*53ee8cc1Swenshuai.xi #ifndef CMODEL
7339*53ee8cc1Swenshuai.xi JPEG_StartDecode();
7340*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
7341*53ee8cc1Swenshuai.xi u32MeasureDecodeTimeSW = MDrv_TIMER_GetUs(E_TIMER_1)-u32MeasureDecodeTime;
7342*53ee8cc1Swenshuai.xi u32MeasureDecodeTime = MDrv_TIMER_GetUs(E_TIMER_1);
7343*53ee8cc1Swenshuai.xi #endif
7344*53ee8cc1Swenshuai.xi if(_Error_code == E_JPEG_NO_ERROR)
7345*53ee8cc1Swenshuai.xi retVal = E_JPEG_OKAY;
7346*53ee8cc1Swenshuai.xi else
7347*53ee8cc1Swenshuai.xi retVal = E_JPEG_FAILED;
7348*53ee8cc1Swenshuai.xi #endif
7349*53ee8cc1Swenshuai.xi }
7350*53ee8cc1Swenshuai.xi return retVal;
7351*53ee8cc1Swenshuai.xi }
7352*53ee8cc1Swenshuai.xi
7353*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
_PrintOutputMem(MS_U32 u32addr,MS_U32 u32Size)7354*53ee8cc1Swenshuai.xi static void _PrintOutputMem(MS_U32 u32addr, MS_U32 u32Size)
7355*53ee8cc1Swenshuai.xi {
7356*53ee8cc1Swenshuai.xi u32Size = ALIGN_16(u32Size);
7357*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};
7358*53ee8cc1Swenshuai.xi fileName2[10]=MApi_JPEG_GetWidth()/1000+'0';
7359*53ee8cc1Swenshuai.xi fileName2[11]=(MApi_JPEG_GetWidth()/100)%10+'0';
7360*53ee8cc1Swenshuai.xi fileName2[12]=(MApi_JPEG_GetWidth()/10)%10+'0';
7361*53ee8cc1Swenshuai.xi fileName2[13]=MApi_JPEG_GetWidth()%10+'0';
7362*53ee8cc1Swenshuai.xi fileName2[15]=MApi_JPEG_GetHeight()/1000+'0';
7363*53ee8cc1Swenshuai.xi fileName2[16]=(MApi_JPEG_GetHeight()/100)%10+'0';
7364*53ee8cc1Swenshuai.xi fileName2[17]=(MApi_JPEG_GetHeight()/10)%10+'0';
7365*53ee8cc1Swenshuai.xi fileName2[18]=MApi_JPEG_GetHeight()%10+'0';
7366*53ee8cc1Swenshuai.xi
7367*53ee8cc1Swenshuai.xi fileName2[22]++;
7368*53ee8cc1Swenshuai.xi if(fileName2[22] > '9')
7369*53ee8cc1Swenshuai.xi {
7370*53ee8cc1Swenshuai.xi fileName2[21]++;
7371*53ee8cc1Swenshuai.xi fileName2[22] = '0';
7372*53ee8cc1Swenshuai.xi }
7373*53ee8cc1Swenshuai.xi if(fileName2[21] > '9')
7374*53ee8cc1Swenshuai.xi {
7375*53ee8cc1Swenshuai.xi fileName2[20]++;
7376*53ee8cc1Swenshuai.xi fileName2[21] = '0';
7377*53ee8cc1Swenshuai.xi }
7378*53ee8cc1Swenshuai.xi
7379*53ee8cc1Swenshuai.xi FILE *outBinfp;
7380*53ee8cc1Swenshuai.xi if((outBinfp = fopen((char *)fileName2, "wb"))==NULL)
7381*53ee8cc1Swenshuai.xi {
7382*53ee8cc1Swenshuai.xi printf("Can't open output yuyv file\n");
7383*53ee8cc1Swenshuai.xi }
7384*53ee8cc1Swenshuai.xi else
7385*53ee8cc1Swenshuai.xi {
7386*53ee8cc1Swenshuai.xi printf("open output yuyv file success\n");
7387*53ee8cc1Swenshuai.xi }
7388*53ee8cc1Swenshuai.xi
7389*53ee8cc1Swenshuai.xi fwrite((void *)u32addr, 1, u32Size, outBinfp);
7390*53ee8cc1Swenshuai.xi fclose(outBinfp);
7391*53ee8cc1Swenshuai.xi
7392*53ee8cc1Swenshuai.xi }
7393*53ee8cc1Swenshuai.xi #endif
7394*53ee8cc1Swenshuai.xi
7395*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7396*53ee8cc1Swenshuai.xi /********************************************************************/
7397*53ee8cc1Swenshuai.xi /// Free all block of JPD. Complete destroy the decoder object.
7398*53ee8cc1Swenshuai.xi /// It could be called at any time.
7399*53ee8cc1Swenshuai.xi ///@return None
7400*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_Exit_OJPD(void)7401*53ee8cc1Swenshuai.xi void MApi_JPEG_Exit_OJPD(void)
7402*53ee8cc1Swenshuai.xi {
7403*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7404*53ee8cc1Swenshuai.xi {
7405*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7406*53ee8cc1Swenshuai.xi return;
7407*53ee8cc1Swenshuai.xi }
7408*53ee8cc1Swenshuai.xi else
7409*53ee8cc1Swenshuai.xi {
7410*53ee8cc1Swenshuai.xi _bIsInit = FALSE;
7411*53ee8cc1Swenshuai.xi }
7412*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7413*53ee8cc1Swenshuai.xi #ifndef CMODEL
7414*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MApi_JPEG_GetCurReadStatus : \nCurVidx = %d, CurRow = %d, CurCol = %d ",
7415*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurVidx(),
7416*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurRow(),
7417*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurCol());
7418*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%lx\n", MDrv_JPD_GetCurMRCAddr());
7419*53ee8cc1Swenshuai.xi
7420*53ee8cc1Swenshuai.xi MDrv_JPD_PowerOff();
7421*53ee8cc1Swenshuai.xi #endif
7422*53ee8cc1Swenshuai.xi JPEG_free_all_blocks();
7423*53ee8cc1Swenshuai.xi
7424*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7425*53ee8cc1Swenshuai.xi bEnableCMYK = TRUE;
7426*53ee8cc1Swenshuai.xi bEnableRGB = TRUE;
7427*53ee8cc1Swenshuai.xi #endif
7428*53ee8cc1Swenshuai.xi
7429*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
7430*53ee8cc1Swenshuai.xi _u32In_buf_MPO_left = 0xFFFFFFFFUL; // reset _u32In_buf_MPO_left to U32_MAX
7431*53ee8cc1Swenshuai.xi bIsMPOFormat = FALSE;
7432*53ee8cc1Swenshuai.xi #endif
7433*53ee8cc1Swenshuai.xi
7434*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
7435*53ee8cc1Swenshuai.xi fclose(logBinfp);
7436*53ee8cc1Swenshuai.xi logBinfp = NULL;
7437*53ee8cc1Swenshuai.xi #endif
7438*53ee8cc1Swenshuai.xi
7439*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: done!!\n", __FUNCTION__);
7440*53ee8cc1Swenshuai.xi return;
7441*53ee8cc1Swenshuai.xi }
7442*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7443*53ee8cc1Swenshuai.xi /********************************************************************/
7444*53ee8cc1Swenshuai.xi ///Get JPEG decoder error code
7445*53ee8cc1Swenshuai.xi ///@return JPEG decoder error code
7446*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetErrorCode_OJPD(void)7447*53ee8cc1Swenshuai.xi JPEG_ErrCode MApi_JPEG_GetErrorCode_OJPD(void)
7448*53ee8cc1Swenshuai.xi {
7449*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7450*53ee8cc1Swenshuai.xi {
7451*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7452*53ee8cc1Swenshuai.xi return E_JPEG_NOT_INIT;
7453*53ee8cc1Swenshuai.xi }
7454*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: ErrCode = %d\n", __FUNCTION__ , _Error_code);
7455*53ee8cc1Swenshuai.xi return _Error_code;
7456*53ee8cc1Swenshuai.xi }
7457*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7458*53ee8cc1Swenshuai.xi #if 0 //move to APP
7459*53ee8cc1Swenshuai.xi /********************************************************************/
7460*53ee8cc1Swenshuai.xi ///Preload buffer from JPEG content
7461*53ee8cc1Swenshuai.xi ///The calling order must be HIGH -> LOW -> HIGH -> LOW....
7462*53ee8cc1Swenshuai.xi ///or LOW -> HIGH -> LOW -> HIGH.
7463*53ee8cc1Swenshuai.xi ///Since the file offset is maintained out side, we assume it won't be out of order.
7464*53ee8cc1Swenshuai.xi ///@param u8Type \b IN indicate which parts of buffer wants to load
7465*53ee8cc1Swenshuai.xi ///@return TRUE or FALSE
7466*53ee8cc1Swenshuai.xi /********************************************************************/
7467*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_PreLoadBuffer(MS_U8 u8Type)
7468*53ee8cc1Swenshuai.xi {
7469*53ee8cc1Swenshuai.xi MS_S32 bytes_read;
7470*53ee8cc1Swenshuai.xi MS_U8 *pBuffer_addr, Position;
7471*53ee8cc1Swenshuai.xi MS_U32 buf_left = 0;
7472*53ee8cc1Swenshuai.xi
7473*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MApi_JPEG_PreLoadBuffer: type = %d\n", u8Type);
7474*53ee8cc1Swenshuai.xi #if 1
7475*53ee8cc1Swenshuai.xi if(MAPi_JPEG_ProcessEOF(u8Type))
7476*53ee8cc1Swenshuai.xi return TRUE;
7477*53ee8cc1Swenshuai.xi #else
7478*53ee8cc1Swenshuai.xi if ( _bEOF_flag )
7479*53ee8cc1Swenshuai.xi {
7480*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("end of file!!\n");
7481*53ee8cc1Swenshuai.xi MDrv_UART_PutChar('t'); // DO NOT MARK THIS, THIS FUNCTION MUST BE CALLED. OR THE JPD DECODE WILL FAIL for LARGE FILES
7482*53ee8cc1Swenshuai.xi if(u8Type==E_JPEG_BUFFER_HIGH)
7483*53ee8cc1Swenshuai.xi {
7484*53ee8cc1Swenshuai.xi // clear MRC high portion read complete event
7485*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE);
7486*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
7487*53ee8cc1Swenshuai.xi }
7488*53ee8cc1Swenshuai.xi else
7489*53ee8cc1Swenshuai.xi {
7490*53ee8cc1Swenshuai.xi // clear MRC low portion read complete event
7491*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBL_DONE);
7492*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
7493*53ee8cc1Swenshuai.xi }
7494*53ee8cc1Swenshuai.xi return TRUE;
7495*53ee8cc1Swenshuai.xi }
7496*53ee8cc1Swenshuai.xi #endif
7497*53ee8cc1Swenshuai.xi
7498*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
7499*53ee8cc1Swenshuai.xi {
7500*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ERROR\n");
7501*53ee8cc1Swenshuai.xi return ( FALSE );
7502*53ee8cc1Swenshuai.xi }
7503*53ee8cc1Swenshuai.xi
7504*53ee8cc1Swenshuai.xi if(u8Type==E_JPEG_BUFFER_HIGH)
7505*53ee8cc1Swenshuai.xi {
7506*53ee8cc1Swenshuai.xi pBuffer_addr = _pu8In_buf + (MRC_BUFFER_SIZE/2);
7507*53ee8cc1Swenshuai.xi Position = 1;
7508*53ee8cc1Swenshuai.xi }
7509*53ee8cc1Swenshuai.xi else
7510*53ee8cc1Swenshuai.xi {
7511*53ee8cc1Swenshuai.xi pBuffer_addr = _pu8In_buf;
7512*53ee8cc1Swenshuai.xi Position = 0;
7513*53ee8cc1Swenshuai.xi }
7514*53ee8cc1Swenshuai.xi
7515*53ee8cc1Swenshuai.xi #if 1
7516*53ee8cc1Swenshuai.xi {
7517*53ee8cc1Swenshuai.xi MS_BOOL EOF_flag = FALSE;
7518*53ee8cc1Swenshuai.xi do
7519*53ee8cc1Swenshuai.xi {
7520*53ee8cc1Swenshuai.xi bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MRC_BUFFER_SIZE/2 - buf_left, &EOF_flag, _pStream, Position );
7521*53ee8cc1Swenshuai.xi
7522*53ee8cc1Swenshuai.xi if ( bytes_read == -1 )
7523*53ee8cc1Swenshuai.xi {
7524*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_STREAM_READ );
7525*53ee8cc1Swenshuai.xi }
7526*53ee8cc1Swenshuai.xi
7527*53ee8cc1Swenshuai.xi buf_left += bytes_read;
7528*53ee8cc1Swenshuai.xi // _Total_Decoded_Size += bytes_read;
7529*53ee8cc1Swenshuai.xi } while(( buf_left < MRC_BUFFER_SIZE/2 ) && ( !EOF_flag ));
7530*53ee8cc1Swenshuai.xi MAPi_JPEG_FileReadInfo(buf_left, EOF_flag);
7531*53ee8cc1Swenshuai.xi }
7532*53ee8cc1Swenshuai.xi #else
7533*53ee8cc1Swenshuai.xi do
7534*53ee8cc1Swenshuai.xi {
7535*53ee8cc1Swenshuai.xi bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MRC_BUFFER_SIZE/2 - buf_left, &_bEOF_flag, _pStream, Position );
7536*53ee8cc1Swenshuai.xi
7537*53ee8cc1Swenshuai.xi if ( bytes_read == -1 )
7538*53ee8cc1Swenshuai.xi {
7539*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_STREAM_READ );
7540*53ee8cc1Swenshuai.xi }
7541*53ee8cc1Swenshuai.xi
7542*53ee8cc1Swenshuai.xi buf_left += bytes_read;
7543*53ee8cc1Swenshuai.xi //// _Total_Decoded_Size += bytes_read;
7544*53ee8cc1Swenshuai.xi } while(( buf_left < MRC_BUFFER_SIZE/2 ) && ( !_bEOF_flag ));
7545*53ee8cc1Swenshuai.xi #endif
7546*53ee8cc1Swenshuai.xi
7547*53ee8cc1Swenshuai.xi
7548*53ee8cc1Swenshuai.xi #if 1
7549*53ee8cc1Swenshuai.xi MApi_JPEG_SetMRBufferValid(u8Type);
7550*53ee8cc1Swenshuai.xi #else
7551*53ee8cc1Swenshuai.xi if(u8Type==E_JPEG_BUFFER_HIGH)
7552*53ee8cc1Swenshuai.xi {
7553*53ee8cc1Swenshuai.xi // clear MRC high portion read complete event
7554*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE);
7555*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
7556*53ee8cc1Swenshuai.xi // mark high portion valid
7557*53ee8cc1Swenshuai.xi //MDrv_Write2Byte( BK_JPD_MCONFIG, (MDrv_Read2Byte(BK_JPD_MCONFIG) & ~0x0003) | JPD_H_VLD);
7558*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_H_VLD);
7559*53ee8cc1Swenshuai.xi }
7560*53ee8cc1Swenshuai.xi else
7561*53ee8cc1Swenshuai.xi {
7562*53ee8cc1Swenshuai.xi // clear MRC low portion read complete event
7563*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBL_DONE);
7564*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
7565*53ee8cc1Swenshuai.xi // mark low portion valid
7566*53ee8cc1Swenshuai.xi //MDrv_Write2Byte( BK_JPD_MCONFIG, (MDrv_Read2Byte(BK_JPD_MCONFIG) & ~0x0003) | JPD_L_VLD);
7567*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_L_VLD);
7568*53ee8cc1Swenshuai.xi }
7569*53ee8cc1Swenshuai.xi #endif
7570*53ee8cc1Swenshuai.xi return TRUE;
7571*53ee8cc1Swenshuai.xi }
7572*53ee8cc1Swenshuai.xi #else // for APP reference
7573*53ee8cc1Swenshuai.xi #if 0
7574*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_PreLoadBuffer(MS_U8 u8MRBuffType, MS_U8* u8In_buf, MS_U32 MaxBufSize)
7575*53ee8cc1Swenshuai.xi {
7576*53ee8cc1Swenshuai.xi MS_S32 bytes_read;
7577*53ee8cc1Swenshuai.xi MS_U8 *pBuffer_addr, Position;
7578*53ee8cc1Swenshuai.xi MS_U32 buf_left = 0;
7579*53ee8cc1Swenshuai.xi MS_BOOL EOF_flag = FALSE;
7580*53ee8cc1Swenshuai.xi
7581*53ee8cc1Swenshuai.xi if(MAPi_JPEG_ProcessEOF(u8MRBuffType))
7582*53ee8cc1Swenshuai.xi return TRUE;
7583*53ee8cc1Swenshuai.xi
7584*53ee8cc1Swenshuai.xi if(MaxBufSize > (MRC_BUFFER_SIZE/2))
7585*53ee8cc1Swenshuai.xi {
7586*53ee8cc1Swenshuai.xi return FALSE;
7587*53ee8cc1Swenshuai.xi }
7588*53ee8cc1Swenshuai.xi
7589*53ee8cc1Swenshuai.xi if(u8MRBuffType==E_JPEG_BUFFER_HIGH)
7590*53ee8cc1Swenshuai.xi {
7591*53ee8cc1Swenshuai.xi pBuffer_addr = u8In_buf + (MRC_BUFFER_SIZE/2);
7592*53ee8cc1Swenshuai.xi Position = 1;
7593*53ee8cc1Swenshuai.xi }
7594*53ee8cc1Swenshuai.xi else
7595*53ee8cc1Swenshuai.xi {
7596*53ee8cc1Swenshuai.xi pBuffer_addr = u8In_buf;
7597*53ee8cc1Swenshuai.xi Position = 0;
7598*53ee8cc1Swenshuai.xi }
7599*53ee8cc1Swenshuai.xi
7600*53ee8cc1Swenshuai.xi do
7601*53ee8cc1Swenshuai.xi {
7602*53ee8cc1Swenshuai.xi // bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MRC_BUFFER_SIZE/2 - buf_left, &EOF_flag, _pStream, Position );
7603*53ee8cc1Swenshuai.xi bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MaxBufSize - buf_left, &EOF_flag, _pStream, Position );
7604*53ee8cc1Swenshuai.xi
7605*53ee8cc1Swenshuai.xi if ( bytes_read == -1 )
7606*53ee8cc1Swenshuai.xi {
7607*53ee8cc1Swenshuai.xi MApi_JPEG_SetErrCode( E_JPEG_STREAM_READ );
7608*53ee8cc1Swenshuai.xi return FALSE;
7609*53ee8cc1Swenshuai.xi }
7610*53ee8cc1Swenshuai.xi
7611*53ee8cc1Swenshuai.xi buf_left += bytes_read;
7612*53ee8cc1Swenshuai.xi // _Total_Decoded_Size += bytes_read;
7613*53ee8cc1Swenshuai.xi } while(( buf_left < MaxBufSize ) && ( !EOF_flag ));
7614*53ee8cc1Swenshuai.xi MAPi_JPEG_FileReadInfo(buf_left, EOF_flag);
7615*53ee8cc1Swenshuai.xi MApi_JPEG_SetMRBufferValid(u8MRBuffType);
7616*53ee8cc1Swenshuai.xi return TRUE;
7617*53ee8cc1Swenshuai.xi }
7618*53ee8cc1Swenshuai.xi #endif
7619*53ee8cc1Swenshuai.xi #endif
7620*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7621*53ee8cc1Swenshuai.xi /********************************************************************/
7622*53ee8cc1Swenshuai.xi ///Get JPD EVENT FLAG
7623*53ee8cc1Swenshuai.xi ///@return \b JPEG_Event : JPEG event flag
7624*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetJPDEventFlag_OJPD(void)7625*53ee8cc1Swenshuai.xi JPEG_Event MApi_JPEG_GetJPDEventFlag_OJPD(void)
7626*53ee8cc1Swenshuai.xi {
7627*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7628*53ee8cc1Swenshuai.xi {
7629*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7630*53ee8cc1Swenshuai.xi return E_JPEG_EVENT_DEC_ERROR_MASK;
7631*53ee8cc1Swenshuai.xi }
7632*53ee8cc1Swenshuai.xi
7633*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7634*53ee8cc1Swenshuai.xi // It's pure software decode
7635*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
7636*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
7637*53ee8cc1Swenshuai.xi {
7638*53ee8cc1Swenshuai.xi return E_JPEG_EVENT_DEC_DONE;
7639*53ee8cc1Swenshuai.xi }
7640*53ee8cc1Swenshuai.xi #endif
7641*53ee8cc1Swenshuai.xi
7642*53ee8cc1Swenshuai.xi #ifndef CMODEL
7643*53ee8cc1Swenshuai.xi {
7644*53ee8cc1Swenshuai.xi JPEG_Event reg_val = (JPEG_Event)MDrv_JPD_GetEventFlag();
7645*53ee8cc1Swenshuai.xi if(reg_val!=0)
7646*53ee8cc1Swenshuai.xi {
7647*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: reg_val = 0x%04X\n", __FUNCTION__ , reg_val);
7648*53ee8cc1Swenshuai.xi }
7649*53ee8cc1Swenshuai.xi if(E_JPEG_EVENT_DEC_DONE & reg_val)
7650*53ee8cc1Swenshuai.xi {
7651*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
7652*53ee8cc1Swenshuai.xi u32MeasureDecodeTimeHW = MDrv_TIMER_GetUs(E_TIMER_1)-u32MeasureDecodeTime;
7653*53ee8cc1Swenshuai.xi printf_red("[OJPD]SW decode header:[%ld]us, HW decode: [%ld]us\n", u32MeasureDecodeTimeSW, u32MeasureDecodeTimeHW);
7654*53ee8cc1Swenshuai.xi #endif
7655*53ee8cc1Swenshuai.xi if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API)
7656*53ee8cc1Swenshuai.xi {
7657*53ee8cc1Swenshuai.xi verJPD_CRC32_Init();
7658*53ee8cc1Swenshuai.xi verJPD_CRC32_Update((MS_U8 *)MWC_BUFFER_ADDR,
7659*53ee8cc1Swenshuai.xi (MS_U32)MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2);
7660*53ee8cc1Swenshuai.xi printf_red("[%dx%d], u32CRCResult=0x%lx\n",MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), verJPD_CRC32_GetResult());
7661*53ee8cc1Swenshuai.xi }
7662*53ee8cc1Swenshuai.xi
7663*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
7664*53ee8cc1Swenshuai.xi if(MApi_JPEG_GetWidth() <=JPEG_MAX_WIDTH
7665*53ee8cc1Swenshuai.xi && MApi_JPEG_GetHeight() <=JPEG_MAX_HEIGHT)
7666*53ee8cc1Swenshuai.xi {
7667*53ee8cc1Swenshuai.xi MS_U32 u32Size;
7668*53ee8cc1Swenshuai.xi u32Size = MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2;
7669*53ee8cc1Swenshuai.xi printf("[%dx%d], MWC_BUFFER_ADDR=0x%lx, size=0x%lx", MApi_JPEG_GetWidth(),
7670*53ee8cc1Swenshuai.xi MApi_JPEG_GetHeight(), MS_VA2PA(MWC_BUFFER_ADDR),u32Size);
7671*53ee8cc1Swenshuai.xi _PrintOutputMem(MWC_BUFFER_ADDR, u32Size);
7672*53ee8cc1Swenshuai.xi }
7673*53ee8cc1Swenshuai.xi #endif
7674*53ee8cc1Swenshuai.xi }
7675*53ee8cc1Swenshuai.xi return reg_val;
7676*53ee8cc1Swenshuai.xi }
7677*53ee8cc1Swenshuai.xi #else
7678*53ee8cc1Swenshuai.xi return E_JPEG_EVENT_DEC_DONE;
7679*53ee8cc1Swenshuai.xi #endif
7680*53ee8cc1Swenshuai.xi }
7681*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7682*53ee8cc1Swenshuai.xi /********************************************************************/
7683*53ee8cc1Swenshuai.xi ///Set JPD EVENT FLAG
7684*53ee8cc1Swenshuai.xi ///@param -eEvtVal \b IN : JPEG_Event
7685*53ee8cc1Swenshuai.xi ///@return None
7686*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SetJPDEventFlag_OJPD(JPEG_Event eEvtVal)7687*53ee8cc1Swenshuai.xi void MApi_JPEG_SetJPDEventFlag_OJPD(JPEG_Event eEvtVal)
7688*53ee8cc1Swenshuai.xi {
7689*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7690*53ee8cc1Swenshuai.xi {
7691*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7692*53ee8cc1Swenshuai.xi return;
7693*53ee8cc1Swenshuai.xi }
7694*53ee8cc1Swenshuai.xi
7695*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7696*53ee8cc1Swenshuai.xi // It's pure software decode
7697*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
7698*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
7699*53ee8cc1Swenshuai.xi {
7700*53ee8cc1Swenshuai.xi return;
7701*53ee8cc1Swenshuai.xi }
7702*53ee8cc1Swenshuai.xi #endif
7703*53ee8cc1Swenshuai.xi
7704*53ee8cc1Swenshuai.xi #ifndef CMODEL
7705*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag((MS_U16)eEvtVal);
7706*53ee8cc1Swenshuai.xi #endif
7707*53ee8cc1Swenshuai.xi return;
7708*53ee8cc1Swenshuai.xi }
7709*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7710*53ee8cc1Swenshuai.xi /********************************************************************/
7711*53ee8cc1Swenshuai.xi ///Reset JPD -- Reset must be called before trigger JPD\n
7712*53ee8cc1Swenshuai.xi ///This function always issue pause command and wait for both MRC & MWC\n
7713*53ee8cc1Swenshuai.xi ///becoming inactive, then reset JPD.\n
7714*53ee8cc1Swenshuai.xi ///\b NOTE: The pause function can be only used by Pluto/T1/T2... not include ERIS.
7715*53ee8cc1Swenshuai.xi ///@return None
7716*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_Rst_OJPD(void)7717*53ee8cc1Swenshuai.xi void MApi_JPEG_Rst_OJPD(void)
7718*53ee8cc1Swenshuai.xi {
7719*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7720*53ee8cc1Swenshuai.xi {
7721*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7722*53ee8cc1Swenshuai.xi return;
7723*53ee8cc1Swenshuai.xi }
7724*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7725*53ee8cc1Swenshuai.xi #ifndef CMODEL
7726*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MApi_JPEG_GetCurReadStatus : \nCurVidx = %d, CurRow = %d, CurCol = %d ",
7727*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurVidx(),
7728*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurRow(),
7729*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurCol());
7730*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%lx\n", MDrv_JPD_GetCurMRCAddr());
7731*53ee8cc1Swenshuai.xi
7732*53ee8cc1Swenshuai.xi MDrv_JPD_Rst();
7733*53ee8cc1Swenshuai.xi #endif
7734*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:done!!\n", __FUNCTION__);
7735*53ee8cc1Swenshuai.xi return;
7736*53ee8cc1Swenshuai.xi }
7737*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7738*53ee8cc1Swenshuai.xi /********************************************************************/
7739*53ee8cc1Swenshuai.xi ///Power On JPEG decoder
7740*53ee8cc1Swenshuai.xi ///@return None
7741*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_PowerOn_OJPD(void)7742*53ee8cc1Swenshuai.xi void MApi_JPEG_PowerOn_OJPD(void)
7743*53ee8cc1Swenshuai.xi {
7744*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7745*53ee8cc1Swenshuai.xi {
7746*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7747*53ee8cc1Swenshuai.xi return;
7748*53ee8cc1Swenshuai.xi }
7749*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7750*53ee8cc1Swenshuai.xi #ifndef CMODEL
7751*53ee8cc1Swenshuai.xi MDrv_JPD_PowerOn();
7752*53ee8cc1Swenshuai.xi #endif
7753*53ee8cc1Swenshuai.xi return;
7754*53ee8cc1Swenshuai.xi }
7755*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7756*53ee8cc1Swenshuai.xi /********************************************************************/
7757*53ee8cc1Swenshuai.xi ///Power Off JPEG decoder
7758*53ee8cc1Swenshuai.xi ///@return None
7759*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_PowerOff_OJPD(void)7760*53ee8cc1Swenshuai.xi void MApi_JPEG_PowerOff_OJPD(void)
7761*53ee8cc1Swenshuai.xi {
7762*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7763*53ee8cc1Swenshuai.xi {
7764*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7765*53ee8cc1Swenshuai.xi return;
7766*53ee8cc1Swenshuai.xi }
7767*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7768*53ee8cc1Swenshuai.xi #ifndef CMODEL
7769*53ee8cc1Swenshuai.xi MDrv_JPD_PowerOff();
7770*53ee8cc1Swenshuai.xi #endif
7771*53ee8cc1Swenshuai.xi return;
7772*53ee8cc1Swenshuai.xi }
7773*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7774*53ee8cc1Swenshuai.xi /********************************************************************/
7775*53ee8cc1Swenshuai.xi ///Get current vertical line index written to memory
7776*53ee8cc1Swenshuai.xi ///@return Current vertical line index written to memory
7777*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetCurVidx_OJPD(void)7778*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetCurVidx_OJPD(void) //new
7779*53ee8cc1Swenshuai.xi {
7780*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7781*53ee8cc1Swenshuai.xi {
7782*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7783*53ee8cc1Swenshuai.xi return 0;
7784*53ee8cc1Swenshuai.xi }
7785*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7786*53ee8cc1Swenshuai.xi #ifndef CMODEL
7787*53ee8cc1Swenshuai.xi return MDrv_JPD_GetCurVidx();
7788*53ee8cc1Swenshuai.xi #else
7789*53ee8cc1Swenshuai.xi return 0;
7790*53ee8cc1Swenshuai.xi #endif
7791*53ee8cc1Swenshuai.xi }
7792*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7793*53ee8cc1Swenshuai.xi /********************************************************************/
7794*53ee8cc1Swenshuai.xi ///Check current JPEG image is progressive or not
7795*53ee8cc1Swenshuai.xi ///@return TRUE / FALSE
7796*53ee8cc1Swenshuai.xi /// - TRUE : progressive
7797*53ee8cc1Swenshuai.xi /// - FALSE : baseline
7798*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_IsProgressive_OJPD(void)7799*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_IsProgressive_OJPD(void)
7800*53ee8cc1Swenshuai.xi {
7801*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7802*53ee8cc1Swenshuai.xi {
7803*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7804*53ee8cc1Swenshuai.xi return FALSE;
7805*53ee8cc1Swenshuai.xi }
7806*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _bProgressive_flag);
7807*53ee8cc1Swenshuai.xi return (_bProgressive_flag);
7808*53ee8cc1Swenshuai.xi }
7809*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7810*53ee8cc1Swenshuai.xi /********************************************************************/
7811*53ee8cc1Swenshuai.xi ///Check current JPEG image has thumbnail or not
7812*53ee8cc1Swenshuai.xi ///@return TRUE / FALSE
7813*53ee8cc1Swenshuai.xi /// - TRUE : thumbnail found
7814*53ee8cc1Swenshuai.xi /// - FALSE : no thumbnail
7815*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_ThumbnailFound_OJPD(void)7816*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_ThumbnailFound_OJPD(void)
7817*53ee8cc1Swenshuai.xi {
7818*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7819*53ee8cc1Swenshuai.xi {
7820*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7821*53ee8cc1Swenshuai.xi return FALSE;
7822*53ee8cc1Swenshuai.xi }
7823*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _bThumbnailFound);
7824*53ee8cc1Swenshuai.xi return (_bThumbnailFound);
7825*53ee8cc1Swenshuai.xi }
7826*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7827*53ee8cc1Swenshuai.xi /********************************************************************/
7828*53ee8cc1Swenshuai.xi ///The width may be the thumbnail or original image size, it based on decoding mode
7829*53ee8cc1Swenshuai.xi ///@return width
7830*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetWidth_OJPD(void)7831*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetWidth_OJPD(void)
7832*53ee8cc1Swenshuai.xi {
7833*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7834*53ee8cc1Swenshuai.xi {
7835*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7836*53ee8cc1Swenshuai.xi return 0;
7837*53ee8cc1Swenshuai.xi }
7838*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16Image_x_size);
7839*53ee8cc1Swenshuai.xi return (_u16Image_x_size);
7840*53ee8cc1Swenshuai.xi }
7841*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7842*53ee8cc1Swenshuai.xi /********************************************************************/
7843*53ee8cc1Swenshuai.xi ///The height may be the thumbnail or original image size, it based on decoding mode
7844*53ee8cc1Swenshuai.xi ///@return height
7845*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetHeight_OJPD(void)7846*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetHeight_OJPD(void)
7847*53ee8cc1Swenshuai.xi {
7848*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7849*53ee8cc1Swenshuai.xi {
7850*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7851*53ee8cc1Swenshuai.xi return 0;
7852*53ee8cc1Swenshuai.xi }
7853*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16Image_y_size);
7854*53ee8cc1Swenshuai.xi return (_u16Image_y_size);
7855*53ee8cc1Swenshuai.xi }
7856*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7857*53ee8cc1Swenshuai.xi /********************************************************************/
7858*53ee8cc1Swenshuai.xi ///Get the original width of this JPEG file after alignment
7859*53ee8cc1Swenshuai.xi ///@return original width
7860*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetOriginalWidth_OJPD(void)7861*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetOriginalWidth_OJPD(void)
7862*53ee8cc1Swenshuai.xi {
7863*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7864*53ee8cc1Swenshuai.xi {
7865*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7866*53ee8cc1Swenshuai.xi return 0;
7867*53ee8cc1Swenshuai.xi }
7868*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16OriginalImage_x_size);
7869*53ee8cc1Swenshuai.xi return (_u16OriginalImage_x_size);
7870*53ee8cc1Swenshuai.xi }
7871*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7872*53ee8cc1Swenshuai.xi /********************************************************************/
7873*53ee8cc1Swenshuai.xi ///Get the original height of this JPEG file after alignment
7874*53ee8cc1Swenshuai.xi ///@return original height
7875*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetOriginalHeight_OJPD(void)7876*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetOriginalHeight_OJPD(void)
7877*53ee8cc1Swenshuai.xi {
7878*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7879*53ee8cc1Swenshuai.xi {
7880*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7881*53ee8cc1Swenshuai.xi return 0;
7882*53ee8cc1Swenshuai.xi }
7883*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16OriginalImage_y_size);
7884*53ee8cc1Swenshuai.xi return (_u16OriginalImage_y_size);
7885*53ee8cc1Swenshuai.xi }
7886*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7887*53ee8cc1Swenshuai.xi /********************************************************************/
7888*53ee8cc1Swenshuai.xi ///Get the original width before alignment
7889*53ee8cc1Swenshuai.xi ///@return non-alignment width
7890*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetNonAlignmentWidth_OJPD(void)7891*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetNonAlignmentWidth_OJPD(void)
7892*53ee8cc1Swenshuai.xi {
7893*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7894*53ee8cc1Swenshuai.xi {
7895*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7896*53ee8cc1Swenshuai.xi return 0;
7897*53ee8cc1Swenshuai.xi }
7898*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16NonAlignmentImage_x_size);
7899*53ee8cc1Swenshuai.xi return (_u16NonAlignmentImage_x_size);
7900*53ee8cc1Swenshuai.xi }
7901*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7902*53ee8cc1Swenshuai.xi /********************************************************************/
7903*53ee8cc1Swenshuai.xi ///Get the original height before alignment
7904*53ee8cc1Swenshuai.xi ///@return non-alignment height
7905*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetNonAlignmentHeight_OJPD(void)7906*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetNonAlignmentHeight_OJPD(void)
7907*53ee8cc1Swenshuai.xi {
7908*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7909*53ee8cc1Swenshuai.xi {
7910*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7911*53ee8cc1Swenshuai.xi return 0;
7912*53ee8cc1Swenshuai.xi }
7913*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16NonAlignmentImage_y_size);
7914*53ee8cc1Swenshuai.xi return (_u16NonAlignmentImage_y_size);
7915*53ee8cc1Swenshuai.xi }
7916*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7917*53ee8cc1Swenshuai.xi /********************************************************************/
7918*53ee8cc1Swenshuai.xi ///Get the displayed pitch of JPEG image
7919*53ee8cc1Swenshuai.xi ///@return displayed pitch
7920*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetAlignedPitch_OJPD(void)7921*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedPitch_OJPD(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);
7929*53ee8cc1Swenshuai.xi return (_u16AlignedImagePitch);
7930*53ee8cc1Swenshuai.xi }
7931*53ee8cc1Swenshuai.xi
MApi_JPEG_GetAlignedPitch_H_OJPD(void)7932*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedPitch_H_OJPD(void)
7933*53ee8cc1Swenshuai.xi {
7934*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7935*53ee8cc1Swenshuai.xi {
7936*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7937*53ee8cc1Swenshuai.xi return 0;
7938*53ee8cc1Swenshuai.xi }
7939*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImagePitch_H);
7940*53ee8cc1Swenshuai.xi return (_u16AlignedImagePitch_H);
7941*53ee8cc1Swenshuai.xi }
7942*53ee8cc1Swenshuai.xi
7943*53ee8cc1Swenshuai.xi
7944*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7945*53ee8cc1Swenshuai.xi /********************************************************************/
7946*53ee8cc1Swenshuai.xi ///Get the displayed width of JPEG image
7947*53ee8cc1Swenshuai.xi ///@return displayed width
7948*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetAlignedWidth_OJPD(void)7949*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedWidth_OJPD(void)
7950*53ee8cc1Swenshuai.xi {
7951*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7952*53ee8cc1Swenshuai.xi {
7953*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7954*53ee8cc1Swenshuai.xi return 0;
7955*53ee8cc1Swenshuai.xi }
7956*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImageWidth);
7957*53ee8cc1Swenshuai.xi return (_u16AlignedImageWidth);
7958*53ee8cc1Swenshuai.xi }
7959*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7960*53ee8cc1Swenshuai.xi /********************************************************************/
7961*53ee8cc1Swenshuai.xi ///Get the displayed height of JPEG image
7962*53ee8cc1Swenshuai.xi ///@return displayed height
7963*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetAlignedHeight_OJPD(void)7964*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedHeight_OJPD(void)
7965*53ee8cc1Swenshuai.xi {
7966*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7967*53ee8cc1Swenshuai.xi {
7968*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7969*53ee8cc1Swenshuai.xi return 0;
7970*53ee8cc1Swenshuai.xi }
7971*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImageHeight);
7972*53ee8cc1Swenshuai.xi return (_u16AlignedImageHeight);
7973*53ee8cc1Swenshuai.xi }
7974*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7975*53ee8cc1Swenshuai.xi /********************************************************************/
7976*53ee8cc1Swenshuai.xi ///Get scale down factor\n
7977*53ee8cc1Swenshuai.xi ///Depending on the real picture width & height, it will automatically set scale down\n
7978*53ee8cc1Swenshuai.xi ///factor to meet maximum JPEG width & height allowed.
7979*53ee8cc1Swenshuai.xi ///@return scale down factor
7980*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetScaleDownFactor_OJPD(void)7981*53ee8cc1Swenshuai.xi MS_U8 MApi_JPEG_GetScaleDownFactor_OJPD(void)
7982*53ee8cc1Swenshuai.xi {
7983*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7984*53ee8cc1Swenshuai.xi {
7985*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7986*53ee8cc1Swenshuai.xi return 0;
7987*53ee8cc1Swenshuai.xi }
7988*53ee8cc1Swenshuai.xi
7989*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7990*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
7991*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
7992*53ee8cc1Swenshuai.xi {
7993*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u8ScaleDownFactor*2);
7994*53ee8cc1Swenshuai.xi return (_u8ScaleDownFactor*2);
7995*53ee8cc1Swenshuai.xi }
7996*53ee8cc1Swenshuai.xi #endif
7997*53ee8cc1Swenshuai.xi {
7998*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u8ScaleDownFactor);
7999*53ee8cc1Swenshuai.xi return (_u8ScaleDownFactor);
8000*53ee8cc1Swenshuai.xi }
8001*53ee8cc1Swenshuai.xi }
8002*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8003*53ee8cc1Swenshuai.xi /********************************************************************/
8004*53ee8cc1Swenshuai.xi /// Set Max decoding resolution
8005*53ee8cc1Swenshuai.xi ///@param -u16Width \b IN : indicate max decoding width
8006*53ee8cc1Swenshuai.xi ///@param -u16Height \b IN : indicate max decoding height
8007*53ee8cc1Swenshuai.xi ///@return None
8008*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SetMaxDecodeResolution_OJPD(MS_U16 u16Width,MS_U16 u16Height)8009*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMaxDecodeResolution_OJPD(MS_U16 u16Width, MS_U16 u16Height)
8010*53ee8cc1Swenshuai.xi {
8011*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: Width = %d, Height = %d\n", __FUNCTION__, u16Width, u16Height);
8012*53ee8cc1Swenshuai.xi JPEG_MAX_WIDTH = u16Width;
8013*53ee8cc1Swenshuai.xi JPEG_MAX_HEIGHT = u16Height;
8014*53ee8cc1Swenshuai.xi return;
8015*53ee8cc1Swenshuai.xi }
8016*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8017*53ee8cc1Swenshuai.xi /********************************************************************/
8018*53ee8cc1Swenshuai.xi /// Set Max decoding resolution of Progressive JPEG
8019*53ee8cc1Swenshuai.xi ///@param -u16ProWidth \b IN : indicate max decoding width
8020*53ee8cc1Swenshuai.xi ///@param -u16ProHeight \b IN : indicate max decoding height
8021*53ee8cc1Swenshuai.xi ///@return None
8022*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SetProMaxDecodeResolution_OJPD(MS_U16 u16ProWidth,MS_U16 u16ProHeight)8023*53ee8cc1Swenshuai.xi void MApi_JPEG_SetProMaxDecodeResolution_OJPD(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
8024*53ee8cc1Swenshuai.xi {
8025*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: ProWidth = %d, ProHeight = %d\n", __FUNCTION__, u16ProWidth, u16ProHeight);
8026*53ee8cc1Swenshuai.xi JPEG_PRO_MAX_WIDTH = u16ProWidth;
8027*53ee8cc1Swenshuai.xi JPEG_PRO_MAX_HEIGHT = u16ProHeight;
8028*53ee8cc1Swenshuai.xi return;
8029*53ee8cc1Swenshuai.xi }
8030*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8031*53ee8cc1Swenshuai.xi /********************************************************************/
8032*53ee8cc1Swenshuai.xi /// Valid the JPEG read buffer flag
8033*53ee8cc1Swenshuai.xi ///@param -u8MRBuffType \b IN : the type of JPEG read buffer
8034*53ee8cc1Swenshuai.xi ///@return None
8035*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SetMRBufferValid_OJPD(JPEG_BuffLoadType u8MRBuffType)8036*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMRBufferValid_OJPD(JPEG_BuffLoadType u8MRBuffType)
8037*53ee8cc1Swenshuai.xi {
8038*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8039*53ee8cc1Swenshuai.xi {
8040*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8041*53ee8cc1Swenshuai.xi return;
8042*53ee8cc1Swenshuai.xi }
8043*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: MRBuffType = %d\n", __FUNCTION__ , u8MRBuffType);
8044*53ee8cc1Swenshuai.xi #ifndef CMODEL
8045*53ee8cc1Swenshuai.xi switch(u8MRBuffType)
8046*53ee8cc1Swenshuai.xi {
8047*53ee8cc1Swenshuai.xi case E_JPEG_BUFFER_HIGH:
8048*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
8049*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_H_VLD);
8050*53ee8cc1Swenshuai.xi break;
8051*53ee8cc1Swenshuai.xi case E_JPEG_BUFFER_LOW:
8052*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
8053*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_L_VLD);
8054*53ee8cc1Swenshuai.xi break;
8055*53ee8cc1Swenshuai.xi default:
8056*53ee8cc1Swenshuai.xi break;
8057*53ee8cc1Swenshuai.xi }
8058*53ee8cc1Swenshuai.xi #endif
8059*53ee8cc1Swenshuai.xi return;
8060*53ee8cc1Swenshuai.xi }
8061*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8062*53ee8cc1Swenshuai.xi /********************************************************************/
8063*53ee8cc1Swenshuai.xi /// Set JPEG EOF flag and the total byte-read of JPEG file
8064*53ee8cc1Swenshuai.xi ///@param -u32DataRead \b IN : the amount of byte of file reading
8065*53ee8cc1Swenshuai.xi ///@param -bEOFflag \b IN : the EOF flag of file reading
8066*53ee8cc1Swenshuai.xi ///@return None
8067*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_UpdateReadInfo_OJPD(MS_U32 u32DataRead,MS_BOOL bEOFflag)8068*53ee8cc1Swenshuai.xi void MApi_JPEG_UpdateReadInfo_OJPD(MS_U32 u32DataRead, MS_BOOL bEOFflag)
8069*53ee8cc1Swenshuai.xi {
8070*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8071*53ee8cc1Swenshuai.xi {
8072*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8073*53ee8cc1Swenshuai.xi return;
8074*53ee8cc1Swenshuai.xi }
8075*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: DataRead = %ld, EOFflag = %d\n", __FUNCTION__ , u32DataRead, bEOFflag);
8076*53ee8cc1Swenshuai.xi //// _Total_Decoded_Size += data_read;
8077*53ee8cc1Swenshuai.xi _u32Total_bytes_read += u32DataRead;
8078*53ee8cc1Swenshuai.xi _bEOF_flag = bEOFflag;
8079*53ee8cc1Swenshuai.xi
8080*53ee8cc1Swenshuai.xi #ifndef CMODEL
8081*53ee8cc1Swenshuai.xi // Set buffer valid to avoid last data not decoded done
8082*53ee8cc1Swenshuai.xi if(bEOFflag)
8083*53ee8cc1Swenshuai.xi {
8084*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
8085*53ee8cc1Swenshuai.xi }
8086*53ee8cc1Swenshuai.xi #endif
8087*53ee8cc1Swenshuai.xi
8088*53ee8cc1Swenshuai.xi return;
8089*53ee8cc1Swenshuai.xi }
8090*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8091*53ee8cc1Swenshuai.xi /********************************************************************/
8092*53ee8cc1Swenshuai.xi /// Process JPEG read buffer flag when EOF.
8093*53ee8cc1Swenshuai.xi ///@param -u8MRBuffType \b IN : The type of JPEG read buffer
8094*53ee8cc1Swenshuai.xi ///@return None
8095*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_ProcessEOF_OJPD(JPEG_BuffLoadType u8MRBuffType)8096*53ee8cc1Swenshuai.xi void MApi_JPEG_ProcessEOF_OJPD(JPEG_BuffLoadType u8MRBuffType)
8097*53ee8cc1Swenshuai.xi {
8098*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8099*53ee8cc1Swenshuai.xi {
8100*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8101*53ee8cc1Swenshuai.xi return;
8102*53ee8cc1Swenshuai.xi }
8103*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: end of file!! MRBuffType = %d\n", __FUNCTION__ , u8MRBuffType);
8104*53ee8cc1Swenshuai.xi //// MDrv_UART_PutChar('t'); // DO NOT MARK THIS, THIS FUNCTION MUST BE CALLED. OR THE JPD DECODE WILL FAIL for LARGE FILES
8105*53ee8cc1Swenshuai.xi #ifndef CMODEL
8106*53ee8cc1Swenshuai.xi if(u8MRBuffType == E_JPEG_BUFFER_HIGH)
8107*53ee8cc1Swenshuai.xi {
8108*53ee8cc1Swenshuai.xi // clear MRC high portion read complete event
8109*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE);
8110*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
8111*53ee8cc1Swenshuai.xi }
8112*53ee8cc1Swenshuai.xi else
8113*53ee8cc1Swenshuai.xi {
8114*53ee8cc1Swenshuai.xi // clear MRC low portion read complete event
8115*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBL_DONE);
8116*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
8117*53ee8cc1Swenshuai.xi }
8118*53ee8cc1Swenshuai.xi
8119*53ee8cc1Swenshuai.xi // Set buffer valid to avoid last data not decoded done
8120*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
8121*53ee8cc1Swenshuai.xi #endif
8122*53ee8cc1Swenshuai.xi return;
8123*53ee8cc1Swenshuai.xi }
8124*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8125*53ee8cc1Swenshuai.xi /********************************************************************/
8126*53ee8cc1Swenshuai.xi /// Set JPEG Error Code if something error on upper layer.
8127*53ee8cc1Swenshuai.xi ///@param -ErrCode \b IN : The error type of JPEG decoder
8128*53ee8cc1Swenshuai.xi ///@return None
8129*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SetErrCode_OJPD(JPEG_ErrCode ErrCode)8130*53ee8cc1Swenshuai.xi void MApi_JPEG_SetErrCode_OJPD(JPEG_ErrCode ErrCode)
8131*53ee8cc1Swenshuai.xi {
8132*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s: ErrCode = %d\n", __FUNCTION__ , ErrCode);
8133*53ee8cc1Swenshuai.xi _Error_code = ErrCode;
8134*53ee8cc1Swenshuai.xi //// JPEG_free_all_blocks();
8135*53ee8cc1Swenshuai.xi return;
8136*53ee8cc1Swenshuai.xi }
8137*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8138*53ee8cc1Swenshuai.xi /********************************************************************/
8139*53ee8cc1Swenshuai.xi /// Set JPEG debug level.
8140*53ee8cc1Swenshuai.xi ///@param -u8DbgLevel \b IN : The JPEG debug level, refer to JPEG_DbgLevel.
8141*53ee8cc1Swenshuai.xi ///@return None
8142*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SetDbgLevel_OJPD(MS_U8 u8DbgLevel)8143*53ee8cc1Swenshuai.xi void MApi_JPEG_SetDbgLevel_OJPD(MS_U8 u8DbgLevel)
8144*53ee8cc1Swenshuai.xi {
8145*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: DbgLevel = 0x%04X\n", __FUNCTION__, u8DbgLevel);
8146*53ee8cc1Swenshuai.xi _u8JPEG_ApiDbgLevel = u8DbgLevel;
8147*53ee8cc1Swenshuai.xi #ifndef CMODEL
8148*53ee8cc1Swenshuai.xi MDrv_JPD_SetDbgLevel(u8DbgLevel);
8149*53ee8cc1Swenshuai.xi #endif
8150*53ee8cc1Swenshuai.xi return;
8151*53ee8cc1Swenshuai.xi }
8152*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8153*53ee8cc1Swenshuai.xi /********************************************************************/
8154*53ee8cc1Swenshuai.xi /// Get JPEG debug level.
8155*53ee8cc1Swenshuai.xi ///@return JPEG debug level, refer to JPEG_DbgLevel.
8156*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetDbgLevel_OJPD(void)8157*53ee8cc1Swenshuai.xi MS_U8 MApi_JPEG_GetDbgLevel_OJPD(void)
8158*53ee8cc1Swenshuai.xi {
8159*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: DbgLevel = 0x%04X\n", __FUNCTION__, _u8JPEG_ApiDbgLevel);
8160*53ee8cc1Swenshuai.xi return _u8JPEG_ApiDbgLevel;
8161*53ee8cc1Swenshuai.xi }
8162*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8163*53ee8cc1Swenshuai.xi /********************************************************************/
8164*53ee8cc1Swenshuai.xi /// Set MHEG5 Flag.
8165*53ee8cc1Swenshuai.xi ///@param -bEnable \b IN :
8166*53ee8cc1Swenshuai.xi ///@return None
8167*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SetMHEG5_OJPD(MS_BOOL bEnable)8168*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMHEG5_OJPD(MS_BOOL bEnable)
8169*53ee8cc1Swenshuai.xi {
8170*53ee8cc1Swenshuai.xi bMHEG5 = bEnable;
8171*53ee8cc1Swenshuai.xi }
8172*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8173*53ee8cc1Swenshuai.xi /********************************************************************/
8174*53ee8cc1Swenshuai.xi /// Get JPEG information
8175*53ee8cc1Swenshuai.xi ///@param -pJPEG_Info \b OUT : JPEG information\n
8176*53ee8cc1Swenshuai.xi /// structure {\n
8177*53ee8cc1Swenshuai.xi /// MS_U8* \b pu8DrvVer : JPEG DRV version\n
8178*53ee8cc1Swenshuai.xi /// MS_U8* \b pu8HalVer : JPEG HAL version\n
8179*53ee8cc1Swenshuai.xi /// MS_U8* \b pu8FwVer : JPEG FW version\n
8180*53ee8cc1Swenshuai.xi /// JPEG_DrvCap \b stDrvCap : JPEG driver capability\n
8181*53ee8cc1Swenshuai.xi /// };
8182*53ee8cc1Swenshuai.xi ///@return None
8183*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetInfo_OJPD(JPEG_Info * pJPEG_Info)8184*53ee8cc1Swenshuai.xi void MApi_JPEG_GetInfo_OJPD(JPEG_Info *pJPEG_Info)
8185*53ee8cc1Swenshuai.xi {
8186*53ee8cc1Swenshuai.xi #ifndef CMODEL
8187*53ee8cc1Swenshuai.xi JPD_Info DrvInfo;
8188*53ee8cc1Swenshuai.xi const MSIF_Version *DrvVer;
8189*53ee8cc1Swenshuai.xi MDrv_JPD_GetInfo(&DrvInfo);
8190*53ee8cc1Swenshuai.xi MDrv_JPD_GetLibVer(&DrvVer);
8191*53ee8cc1Swenshuai.xi pJPEG_Info->pu8DrvVer = DrvVer;
8192*53ee8cc1Swenshuai.xi pJPEG_Info->pu8HalVer = DrvInfo.pu8HalVer;
8193*53ee8cc1Swenshuai.xi pJPEG_Info->pu8FwVer = DrvInfo.pu8FwVer;
8194*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.bBaseline = DrvInfo.stCap.bBaseline;
8195*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.bProgressive = DrvInfo.stCap.bProgressive;
8196*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.bMJPEG = DrvInfo.stCap.bMJPEG;
8197*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxWidth = JPEG_MAX_WIDTH;
8198*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxHeight = JPEG_MAX_HEIGHT;
8199*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxProWidth = JPEG_PRO_MAX_WIDTH;
8200*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxProHeight = JPEG_PRO_MAX_HEIGHT;
8201*53ee8cc1Swenshuai.xi
8202*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPD %04x, %04x, %04x, %s\n",
8203*53ee8cc1Swenshuai.xi DrvVer->DDI.customer, DrvVer->DDI.model, DrvVer->DDI.chip, &(DrvVer->DDI.cpu));
8204*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("pu8HalVer = %s, pu8FwVer = %s\n", pJPEG_Info->pu8HalVer, pJPEG_Info->pu8FwVer);
8205*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: DrvCap_BL = %d, DrvCap_PRO = %d, DrvCap_MJPEG = %d\n", __FUNCTION__,
8206*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.bBaseline, pJPEG_Info->stDrvCap.bProgressive, pJPEG_Info->stDrvCap.bMJPEG);
8207*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: MaxWidth = %d, MaxHeight = %d\n", __FUNCTION__,
8208*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxWidth, pJPEG_Info->stDrvCap.u16MaxHeight);
8209*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: MaxProWidth = %d, MaxProHeight = %d\n", __FUNCTION__,
8210*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxProWidth, pJPEG_Info->stDrvCap.u16MaxProHeight);
8211*53ee8cc1Swenshuai.xi #endif
8212*53ee8cc1Swenshuai.xi return;
8213*53ee8cc1Swenshuai.xi }
8214*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8215*53ee8cc1Swenshuai.xi /********************************************************************/
8216*53ee8cc1Swenshuai.xi /// Get JPEG status.
8217*53ee8cc1Swenshuai.xi ///@param -pJPEG_Status \b OUT : JPEG status\n
8218*53ee8cc1Swenshuai.xi /// structure {\n
8219*53ee8cc1Swenshuai.xi /// MS_U32 \b u32CurMRCAddr : JPD current decode address\n
8220*53ee8cc1Swenshuai.xi /// MS_U16 \b u16CurVidx : JPD current decode vertical index\n
8221*53ee8cc1Swenshuai.xi /// MS_U16 \b u16CurRow : JPD current decode row\n
8222*53ee8cc1Swenshuai.xi /// MS_U16 \b u16CurCol : JPD current decode column\n
8223*53ee8cc1Swenshuai.xi /// MS_BOOL \b bDrvBusy : JPEG DRV busy status\n
8224*53ee8cc1Swenshuai.xi /// MS_BOOL \b bIsrEnable : JPD ISR status\n
8225*53ee8cc1Swenshuai.xi /// };
8226*53ee8cc1Swenshuai.xi ///@return None
8227*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetStatus_OJPD(JPEG_Status * pJPEG_Status)8228*53ee8cc1Swenshuai.xi void MApi_JPEG_GetStatus_OJPD(JPEG_Status *pJPEG_Status)
8229*53ee8cc1Swenshuai.xi {
8230*53ee8cc1Swenshuai.xi #ifndef CMODEL
8231*53ee8cc1Swenshuai.xi JPD_Status *pDrvStatus = MDrv_JPD_GetStatus();
8232*53ee8cc1Swenshuai.xi pJPEG_Status->u32CurMRCAddr = pDrvStatus->u32CurMRCAddr;
8233*53ee8cc1Swenshuai.xi pJPEG_Status->u16CurVidx = pDrvStatus->u16CurVidx;
8234*53ee8cc1Swenshuai.xi pJPEG_Status->u16CurRow = pDrvStatus->u16CurRow;
8235*53ee8cc1Swenshuai.xi pJPEG_Status->u16CurCol = pDrvStatus->u16CurCol;
8236*53ee8cc1Swenshuai.xi pJPEG_Status->bDrvBusy = pDrvStatus->bIsBusy;
8237*53ee8cc1Swenshuai.xi pJPEG_Status->bIsrEnable = pDrvStatus->bIsrEnable;
8238*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: Drv_busy = %d, Isr_status = %d\n", __FUNCTION__ , pJPEG_Status->bDrvBusy, pJPEG_Status->bIsrEnable);
8239*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: CurVidx = %d, CurRow = %d, CurCol = %d\n", __FUNCTION__ ,
8240*53ee8cc1Swenshuai.xi pJPEG_Status->u16CurVidx, pJPEG_Status->u16CurRow, pJPEG_Status->u16CurCol);
8241*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: CurMRCAddr = 0x%lx\n", __FUNCTION__ , pJPEG_Status->u32CurMRCAddr);
8242*53ee8cc1Swenshuai.xi #endif
8243*53ee8cc1Swenshuai.xi return;
8244*53ee8cc1Swenshuai.xi }
8245*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8246*53ee8cc1Swenshuai.xi /********************************************************************/
8247*53ee8cc1Swenshuai.xi /// Get JPEG Version.
8248*53ee8cc1Swenshuai.xi ///@param -ppVersion \b OUT : JPEG Version
8249*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8250*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Success
8251*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Failed
8252*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetLibVer_OJPD(const MSIF_Version ** ppVersion)8253*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetLibVer_OJPD(const MSIF_Version **ppVersion)
8254*53ee8cc1Swenshuai.xi {
8255*53ee8cc1Swenshuai.xi if (!ppVersion)
8256*53ee8cc1Swenshuai.xi {
8257*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8258*53ee8cc1Swenshuai.xi }
8259*53ee8cc1Swenshuai.xi *ppVersion = &_api_jpeg_version;
8260*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPEG %04x, %04x, %04x, %s\n", __FUNCTION__ ,
8261*53ee8cc1Swenshuai.xi _api_jpeg_version.DDI.customer, _api_jpeg_version.DDI.model, _api_jpeg_version.DDI.chip, &(_api_jpeg_version.DDI.cpu));
8262*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8263*53ee8cc1Swenshuai.xi }
8264*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8265*53ee8cc1Swenshuai.xi /********************************************************************/
8266*53ee8cc1Swenshuai.xi /// For H/W bug, some cases can not exit after decode done, Check
8267*53ee8cc1Swenshuai.xi /// Vidx to exit.
8268*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8269*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Vidx checking is successful.
8270*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Vidx checking is failed.
8271*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_HdlVidxChk_OJPD(void)8272*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_HdlVidxChk_OJPD(void)
8273*53ee8cc1Swenshuai.xi {
8274*53ee8cc1Swenshuai.xi #ifndef CMODEL
8275*53ee8cc1Swenshuai.xi MS_U16 cur_vidx = 0;
8276*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8277*53ee8cc1Swenshuai.xi {
8278*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8279*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8280*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8281*53ee8cc1Swenshuai.xi }
8282*53ee8cc1Swenshuai.xi
8283*53ee8cc1Swenshuai.xi if(FALSE == _JPD_IsDecoding)
8284*53ee8cc1Swenshuai.xi {
8285*53ee8cc1Swenshuai.xi _JPD_IsDecoding = TRUE;
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
8293*53ee8cc1Swenshuai.xi //For H/W bug, some cases can not exit after decode done. Check Vidx to exit.
8294*53ee8cc1Swenshuai.xi cur_vidx = MDrv_JPD_GetCurVidx();
8295*53ee8cc1Swenshuai.xi if(_JPD_PreVIdx != cur_vidx)
8296*53ee8cc1Swenshuai.xi {
8297*53ee8cc1Swenshuai.xi _JPD_PreVIdx = cur_vidx;
8298*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8299*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = MsOS_GetSystemTime();
8300*53ee8cc1Swenshuai.xi #else
8301*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = 0;
8302*53ee8cc1Swenshuai.xi #endif
8303*53ee8cc1Swenshuai.xi }
8304*53ee8cc1Swenshuai.xi else
8305*53ee8cc1Swenshuai.xi {
8306*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8307*53ee8cc1Swenshuai.xi if((MsOS_GetSystemTime() - _JPD_ReCheckTime) >= 1000)
8308*53ee8cc1Swenshuai.xi #else
8309*53ee8cc1Swenshuai.xi if(_JPD_ReCheckTime++ >= 10000)
8310*53ee8cc1Swenshuai.xi #endif
8311*53ee8cc1Swenshuai.xi {
8312*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8313*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Decode timeout...!!!!\n");
8314*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8315*53ee8cc1Swenshuai.xi }
8316*53ee8cc1Swenshuai.xi }
8317*53ee8cc1Swenshuai.xi #endif
8318*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8319*53ee8cc1Swenshuai.xi }
8320*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8321*53ee8cc1Swenshuai.xi /********************************************************************/
8322*53ee8cc1Swenshuai.xi /// Get Preload buffer information.
8323*53ee8cc1Swenshuai.xi ///@param -pBuffLoadType \b OUT : JPEG preload buffer type
8324*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8325*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8326*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8327*53ee8cc1Swenshuai.xi /// - E_JPEG_RETRY : we need to re-get preload buffer type
8328*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetBuffLoadType_OJPD(JPEG_BuffLoadType * pBuffLoadType)8329*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetBuffLoadType_OJPD(JPEG_BuffLoadType *pBuffLoadType)
8330*53ee8cc1Swenshuai.xi {
8331*53ee8cc1Swenshuai.xi #ifndef CMODEL
8332*53ee8cc1Swenshuai.xi MS_U16 reg_val = MDrv_JPD_GetEventFlag();
8333*53ee8cc1Swenshuai.xi
8334*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8335*53ee8cc1Swenshuai.xi {
8336*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8337*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8338*53ee8cc1Swenshuai.xi }
8339*53ee8cc1Swenshuai.xi
8340*53ee8cc1Swenshuai.xi if((E_JPD_EVENT_MRBL_DONE & reg_val)
8341*53ee8cc1Swenshuai.xi && (E_JPEG_BUFFER_LOW != u8PreLHFlag))
8342*53ee8cc1Swenshuai.xi {
8343*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : MRBuffer Load LOW!!!!\n", __FUNCTION__);
8344*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_LOW;
8345*53ee8cc1Swenshuai.xi u32MRCheckCount = 0;
8346*53ee8cc1Swenshuai.xi *pBuffLoadType = u8PreLHFlag;
8347*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8348*53ee8cc1Swenshuai.xi }
8349*53ee8cc1Swenshuai.xi else if((E_JPD_EVENT_MRBH_DONE & reg_val)
8350*53ee8cc1Swenshuai.xi && (E_JPEG_BUFFER_HIGH != u8PreLHFlag))
8351*53ee8cc1Swenshuai.xi {
8352*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : MRBuffer Load HIGH!!!!\n", __FUNCTION__);
8353*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_HIGH;
8354*53ee8cc1Swenshuai.xi u32MRCheckCount = 0;
8355*53ee8cc1Swenshuai.xi *pBuffLoadType = u8PreLHFlag;
8356*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8357*53ee8cc1Swenshuai.xi }
8358*53ee8cc1Swenshuai.xi else
8359*53ee8cc1Swenshuai.xi {
8360*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : MRBuffer Load NONE!!!!\n", __FUNCTION__);
8361*53ee8cc1Swenshuai.xi *pBuffLoadType = E_JPEG_BUFFER_NONE;
8362*53ee8cc1Swenshuai.xi u32MRCheckCount++;
8363*53ee8cc1Swenshuai.xi if(u32MRCheckCount >= 1000)
8364*53ee8cc1Swenshuai.xi {
8365*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Decoding time out!!\n");
8366*53ee8cc1Swenshuai.xi u32MRCheckCount = 0;
8367*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8368*53ee8cc1Swenshuai.xi }
8369*53ee8cc1Swenshuai.xi }
8370*53ee8cc1Swenshuai.xi return E_JPEG_RETRY;
8371*53ee8cc1Swenshuai.xi #else
8372*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8373*53ee8cc1Swenshuai.xi #endif
8374*53ee8cc1Swenshuai.xi }
8375*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8376*53ee8cc1Swenshuai.xi /********************************************************************/
8377*53ee8cc1Swenshuai.xi /// Enable JPD ISR and register callback function.
8378*53ee8cc1Swenshuai.xi ///@param -IsrCb \b IN : JPD ISR callback function
8379*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8380*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8381*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8382*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_EnableISR_OJPD(JPEG_IsrFuncCb IsrCb)8383*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_EnableISR_OJPD(JPEG_IsrFuncCb IsrCb)
8384*53ee8cc1Swenshuai.xi {
8385*53ee8cc1Swenshuai.xi #ifndef CMODEL
8386*53ee8cc1Swenshuai.xi if(TRUE == MDrv_JPD_EnableISR((JPD_IsrFuncCb)IsrCb))
8387*53ee8cc1Swenshuai.xi {
8388*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : Success!!!!\n", __FUNCTION__);
8389*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8390*53ee8cc1Swenshuai.xi }
8391*53ee8cc1Swenshuai.xi else
8392*53ee8cc1Swenshuai.xi {
8393*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : Fail!!!!\n", __FUNCTION__);
8394*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8395*53ee8cc1Swenshuai.xi }
8396*53ee8cc1Swenshuai.xi #else
8397*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8398*53ee8cc1Swenshuai.xi #endif
8399*53ee8cc1Swenshuai.xi }
8400*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8401*53ee8cc1Swenshuai.xi /********************************************************************/
8402*53ee8cc1Swenshuai.xi /// Disable JPD ISR and unregister callback function.
8403*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8404*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8405*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8406*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_DisableISR_OJPD(void)8407*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_DisableISR_OJPD(void)
8408*53ee8cc1Swenshuai.xi {
8409*53ee8cc1Swenshuai.xi #ifndef CMODEL
8410*53ee8cc1Swenshuai.xi if(TRUE == MDrv_JPD_DisableISR())
8411*53ee8cc1Swenshuai.xi {
8412*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : Success!!!!\n", __FUNCTION__);
8413*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8414*53ee8cc1Swenshuai.xi }
8415*53ee8cc1Swenshuai.xi else
8416*53ee8cc1Swenshuai.xi {
8417*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : Fail!!!!\n", __FUNCTION__);
8418*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8419*53ee8cc1Swenshuai.xi }
8420*53ee8cc1Swenshuai.xi #else
8421*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8422*53ee8cc1Swenshuai.xi #endif
8423*53ee8cc1Swenshuai.xi }
8424*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8425*53ee8cc1Swenshuai.xi /********************************************************************/
8426*53ee8cc1Swenshuai.xi /// JPEG wait done function, call it to check JPEG decoding status.
8427*53ee8cc1Swenshuai.xi ///@return \b JPEG_DecodeStatus
8428*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_DONE : JPEG decode done.
8429*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_FAILED : JPEG decode failed.
8430*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_MRBL_DONE : MRB low done, need to feed data.
8431*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_MRBH_DONE : MRB high done, need to feed data.
8432*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_DECODING : JPEG decoding
8433*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_WaitDone_OJPD(void)8434*53ee8cc1Swenshuai.xi JPEG_DecodeStatus MApi_JPEG_WaitDone_OJPD(void)
8435*53ee8cc1Swenshuai.xi {
8436*53ee8cc1Swenshuai.xi #ifndef CMODEL
8437*53ee8cc1Swenshuai.xi MS_U16 reg_val = E_JPD_EVENT_DEC_DONE;
8438*53ee8cc1Swenshuai.xi MS_U16 cur_vidx = 0;
8439*53ee8cc1Swenshuai.xi #endif
8440*53ee8cc1Swenshuai.xi
8441*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8442*53ee8cc1Swenshuai.xi {
8443*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s: JPD have not init!!\n", __FUNCTION__);
8444*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8445*53ee8cc1Swenshuai.xi return E_JPEG_DEC_FAILED;
8446*53ee8cc1Swenshuai.xi }
8447*53ee8cc1Swenshuai.xi
8448*53ee8cc1Swenshuai.xi #ifndef CMODEL
8449*53ee8cc1Swenshuai.xi if(FALSE == _JPD_IsDecoding)
8450*53ee8cc1Swenshuai.xi {
8451*53ee8cc1Swenshuai.xi _JPD_IsDecoding = TRUE;
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
8459*53ee8cc1Swenshuai.xi //For H/W bug, some cases can not exit after decode done. Check Vidx to exit.
8460*53ee8cc1Swenshuai.xi cur_vidx = MDrv_JPD_GetCurVidx();
8461*53ee8cc1Swenshuai.xi if(_JPD_PreVIdx != cur_vidx)
8462*53ee8cc1Swenshuai.xi {
8463*53ee8cc1Swenshuai.xi _JPD_PreVIdx = cur_vidx;
8464*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8465*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = MsOS_GetSystemTime();
8466*53ee8cc1Swenshuai.xi #else
8467*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = 0;
8468*53ee8cc1Swenshuai.xi #endif
8469*53ee8cc1Swenshuai.xi }
8470*53ee8cc1Swenshuai.xi else
8471*53ee8cc1Swenshuai.xi {
8472*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8473*53ee8cc1Swenshuai.xi if((MsOS_GetSystemTime() - _JPD_ReCheckTime) >= 1000)
8474*53ee8cc1Swenshuai.xi #else
8475*53ee8cc1Swenshuai.xi if(_JPD_ReCheckTime++ >= 10000)
8476*53ee8cc1Swenshuai.xi #endif
8477*53ee8cc1Swenshuai.xi {
8478*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s:Decode timeout.....!!!!\n", __FUNCTION__);
8479*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8480*53ee8cc1Swenshuai.xi return E_JPEG_DEC_FAILED;
8481*53ee8cc1Swenshuai.xi }
8482*53ee8cc1Swenshuai.xi else
8483*53ee8cc1Swenshuai.xi {
8484*53ee8cc1Swenshuai.xi return E_JPEG_DEC_DECODING;
8485*53ee8cc1Swenshuai.xi }
8486*53ee8cc1Swenshuai.xi }
8487*53ee8cc1Swenshuai.xi
8488*53ee8cc1Swenshuai.xi reg_val = MDrv_JPD_GetEventFlag();
8489*53ee8cc1Swenshuai.xi
8490*53ee8cc1Swenshuai.xi if(E_JPD_EVENT_DEC_DONE & reg_val)
8491*53ee8cc1Swenshuai.xi {
8492*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:Decode Done!!\n", __FUNCTION__);
8493*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
8494*53ee8cc1Swenshuai.xi u32MeasureDecodeTimeHW = MDrv_TIMER_GetUs(E_TIMER_1)-u32MeasureDecodeTime;
8495*53ee8cc1Swenshuai.xi printf_red("[OJPD]SW decode header:[%ld]us, HW decode: [%ld]us\n", u32MeasureDecodeTimeSW, u32MeasureDecodeTimeHW);
8496*53ee8cc1Swenshuai.xi #endif
8497*53ee8cc1Swenshuai.xi if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API)
8498*53ee8cc1Swenshuai.xi {
8499*53ee8cc1Swenshuai.xi verJPD_CRC32_Init();
8500*53ee8cc1Swenshuai.xi verJPD_CRC32_Update((MS_U8 *)MWC_BUFFER_ADDR,
8501*53ee8cc1Swenshuai.xi (MS_U32)MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2);
8502*53ee8cc1Swenshuai.xi printf_red("[%dx%d], u32CRCResult=0x%lx\n",MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), verJPD_CRC32_GetResult());
8503*53ee8cc1Swenshuai.xi }
8504*53ee8cc1Swenshuai.xi
8505*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
8506*53ee8cc1Swenshuai.xi if(MApi_JPEG_GetWidth() <=JPEG_MAX_WIDTH
8507*53ee8cc1Swenshuai.xi && MApi_JPEG_GetHeight() <=JPEG_MAX_HEIGHT)
8508*53ee8cc1Swenshuai.xi {
8509*53ee8cc1Swenshuai.xi MS_U32 u32Size;
8510*53ee8cc1Swenshuai.xi u32Size = MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2;
8511*53ee8cc1Swenshuai.xi printf("[%dx%d], MWC_BUFFER_ADDR=0x%lx, size=0x%lx", MApi_JPEG_GetWidth(),
8512*53ee8cc1Swenshuai.xi MApi_JPEG_GetHeight(), MS_VA2PA(MWC_BUFFER_ADDR),u32Size);
8513*53ee8cc1Swenshuai.xi _PrintOutputMem(MWC_BUFFER_ADDR, u32Size);
8514*53ee8cc1Swenshuai.xi }
8515*53ee8cc1Swenshuai.xi #endif
8516*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8517*53ee8cc1Swenshuai.xi return E_JPEG_DEC_DONE;
8518*53ee8cc1Swenshuai.xi }
8519*53ee8cc1Swenshuai.xi else if(E_JPD_EVENT_RST_ERROR & reg_val)
8520*53ee8cc1Swenshuai.xi {
8521*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s:RST Error!!\n", __FUNCTION__);
8522*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8523*53ee8cc1Swenshuai.xi return E_JPEG_DEC_RST_ERROR;
8524*53ee8cc1Swenshuai.xi }
8525*53ee8cc1Swenshuai.xi else if((E_JPD_EVENT_ECS_ERROR & reg_val)
8526*53ee8cc1Swenshuai.xi || (E_JPD_EVENT_IS_ERROR & reg_val))
8527*53ee8cc1Swenshuai.xi {
8528*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s:Bitstream Error, reg_val = 0x%02x!!\n", __FUNCTION__ , reg_val);
8529*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8530*53ee8cc1Swenshuai.xi return E_JPEG_DEC_BITSTREAM_ERROR;
8531*53ee8cc1Swenshuai.xi }
8532*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_AUTO_PROTECT==TRUE)
8533*53ee8cc1Swenshuai.xi else if(E_JPD_EVENT_MWB_FULL & reg_val)
8534*53ee8cc1Swenshuai.xi {
8535*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("[%s]MWB is full!!\n", __FUNCTION__);
8536*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8537*53ee8cc1Swenshuai.xi return E_JPEG_DEC_FAILED;
8538*53ee8cc1Swenshuai.xi }
8539*53ee8cc1Swenshuai.xi #endif
8540*53ee8cc1Swenshuai.xi else if((E_JPD_EVENT_MRBL_DONE & reg_val)
8541*53ee8cc1Swenshuai.xi && (E_JPEG_BUFFER_LOW != u8PreLHFlag))
8542*53ee8cc1Swenshuai.xi {
8543*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_LOW;
8544*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("[%s]MRBL done!!\n", __FUNCTION__);
8545*53ee8cc1Swenshuai.xi return E_JPEG_DEC_MRBL_DONE;
8546*53ee8cc1Swenshuai.xi }
8547*53ee8cc1Swenshuai.xi else if((E_JPD_EVENT_MRBH_DONE & reg_val)
8548*53ee8cc1Swenshuai.xi && (E_JPEG_BUFFER_HIGH != u8PreLHFlag))
8549*53ee8cc1Swenshuai.xi {
8550*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_HIGH;
8551*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("[%s]MRBH done!!\n", __FUNCTION__);
8552*53ee8cc1Swenshuai.xi return E_JPEG_DEC_MRBH_DONE;
8553*53ee8cc1Swenshuai.xi }
8554*53ee8cc1Swenshuai.xi #endif
8555*53ee8cc1Swenshuai.xi return E_JPEG_DEC_DECODING;
8556*53ee8cc1Swenshuai.xi }
8557*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8558*53ee8cc1Swenshuai.xi /********************************************************************/
8559*53ee8cc1Swenshuai.xi /// Get datetime info of JPEG EXIF
8560*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8561*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8562*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8563*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetEXIFDateTime_OJPD(JPEG_EXIF_DateTime * DateTime)8564*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFDateTime_OJPD(JPEG_EXIF_DateTime *DateTime)
8565*53ee8cc1Swenshuai.xi {
8566*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8567*53ee8cc1Swenshuai.xi {
8568*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8569*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8570*53ee8cc1Swenshuai.xi }
8571*53ee8cc1Swenshuai.xi
8572*53ee8cc1Swenshuai.xi DateTime->bHasDataTime = _stEXIF_DateTime.bHasDataTime;
8573*53ee8cc1Swenshuai.xi DateTime->u32Year = _stEXIF_DateTime.u32Year;
8574*53ee8cc1Swenshuai.xi DateTime->u32Month = _stEXIF_DateTime.u32Month;
8575*53ee8cc1Swenshuai.xi DateTime->u32Day = _stEXIF_DateTime.u32Day;
8576*53ee8cc1Swenshuai.xi DateTime->u32Hour = _stEXIF_DateTime.u32Hour;
8577*53ee8cc1Swenshuai.xi DateTime->u32Minute = _stEXIF_DateTime.u32Minute;
8578*53ee8cc1Swenshuai.xi DateTime->u32Second = _stEXIF_DateTime.u32Second;
8579*53ee8cc1Swenshuai.xi
8580*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime======= Exist = %d \n", _stEXIF_DateTime.bHasDataTime);
8581*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
8582*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
8583*53ee8cc1Swenshuai.xi
8584*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8585*53ee8cc1Swenshuai.xi }
8586*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8587*53ee8cc1Swenshuai.xi /********************************************************************/
8588*53ee8cc1Swenshuai.xi /// Get orientation info of JPEG EXIF
8589*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8590*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8591*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8592*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetEXIFOrientation_OJPD(JPEG_EXIF_Orientation * eOrientation)8593*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFOrientation_OJPD(JPEG_EXIF_Orientation *eOrientation)
8594*53ee8cc1Swenshuai.xi {
8595*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8596*53ee8cc1Swenshuai.xi {
8597*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8598*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8599*53ee8cc1Swenshuai.xi }
8600*53ee8cc1Swenshuai.xi *eOrientation = _eEXIF_Orientation;
8601*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", _eEXIF_Orientation);
8602*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8603*53ee8cc1Swenshuai.xi }
8604*53ee8cc1Swenshuai.xi
8605*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
MApi_JPEG_GetEXIFManufacturer_OJPD(MS_U8 * pu8Manufacturer,MS_U8 u8size)8606*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFManufacturer_OJPD(MS_U8 *pu8Manufacturer, MS_U8 u8size)
8607*53ee8cc1Swenshuai.xi {
8608*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8609*53ee8cc1Swenshuai.xi {
8610*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8611*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8612*53ee8cc1Swenshuai.xi }
8613*53ee8cc1Swenshuai.xi MS_U8 u8i=0;
8614*53ee8cc1Swenshuai.xi JPEG_memset((void*)(pu8Manufacturer), 0, u8size);
8615*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Manufacturer =");
8616*53ee8cc1Swenshuai.xi while(_u8EXIF_Manufacturer[u8i] && u8i<JPEG_MANUFACTURER_SIZE)
8617*53ee8cc1Swenshuai.xi {
8618*53ee8cc1Swenshuai.xi *(pu8Manufacturer+u8i) =_u8EXIF_Manufacturer[u8i];
8619*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%c", *(pu8Manufacturer+u8i));
8620*53ee8cc1Swenshuai.xi u8i++;
8621*53ee8cc1Swenshuai.xi if(u8i>=u8size)
8622*53ee8cc1Swenshuai.xi {
8623*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s: NOT enough space!!\n", __FUNCTION__);
8624*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8625*53ee8cc1Swenshuai.xi }
8626*53ee8cc1Swenshuai.xi }
8627*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("\n");
8628*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("JPEG EXIF Manufacturer = %02x %02x %02x %02x %02x %02x %02x %02x\n",
8629*53ee8cc1Swenshuai.xi // *pu8Manufacturer, *(pu8Manufacturer+1), *(pu8Manufacturer+2), *(pu8Manufacturer+3),
8630*53ee8cc1Swenshuai.xi // *(pu8Manufacturer+4),*(pu8Manufacturer+5),*(pu8Manufacturer+6),*(pu8Manufacturer+7));
8631*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8632*53ee8cc1Swenshuai.xi }
8633*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFModel_OJPD(MS_U8 * pu8Model,MS_U8 u8size)8634*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFModel_OJPD(MS_U8 *pu8Model, MS_U8 u8size)
8635*53ee8cc1Swenshuai.xi {
8636*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8637*53ee8cc1Swenshuai.xi {
8638*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8639*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8640*53ee8cc1Swenshuai.xi }
8641*53ee8cc1Swenshuai.xi MS_U8 u8i=0;
8642*53ee8cc1Swenshuai.xi JPEG_memset((void*)(pu8Model), 0, u8size);
8643*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Model =");
8644*53ee8cc1Swenshuai.xi while(_u8EXIF_Model[u8i] && u8i<JPEG_MODEL_SIZE)
8645*53ee8cc1Swenshuai.xi {
8646*53ee8cc1Swenshuai.xi *(pu8Model+u8i) =_u8EXIF_Model[u8i];
8647*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%c", *(pu8Model+u8i));
8648*53ee8cc1Swenshuai.xi u8i++;
8649*53ee8cc1Swenshuai.xi if(u8i>=u8size)
8650*53ee8cc1Swenshuai.xi {
8651*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s: NOT enough space!!\n", __FUNCTION__);
8652*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8653*53ee8cc1Swenshuai.xi }
8654*53ee8cc1Swenshuai.xi }
8655*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("\n");
8656*53ee8cc1Swenshuai.xi
8657*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("JPEG EXIF Model = %02x %02x %02x %02x %02x %02x %02x %02x\n",
8658*53ee8cc1Swenshuai.xi // *pu8Model, *(pu8Model+1), *(pu8Model+2), *(pu8Model+3),
8659*53ee8cc1Swenshuai.xi // *(pu8Model+4),*(pu8Model+5),*(pu8Model+6),*(pu8Model+7));
8660*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8661*53ee8cc1Swenshuai.xi }
8662*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFFlash_OJPD(MS_U16 * pu16Flash)8663*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFFlash_OJPD(MS_U16 *pu16Flash)
8664*53ee8cc1Swenshuai.xi {
8665*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8666*53ee8cc1Swenshuai.xi {
8667*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8668*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8669*53ee8cc1Swenshuai.xi }
8670*53ee8cc1Swenshuai.xi *pu16Flash = _u16EXIF_Flash;
8671*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Flash = %d \n", *pu16Flash);
8672*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8673*53ee8cc1Swenshuai.xi }
8674*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFISOSpeedRatings_OJPD(MS_U32 * pu32ISOSpeedRatings)8675*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFISOSpeedRatings_OJPD(MS_U32 *pu32ISOSpeedRatings)
8676*53ee8cc1Swenshuai.xi {
8677*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8678*53ee8cc1Swenshuai.xi {
8679*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8680*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8681*53ee8cc1Swenshuai.xi }
8682*53ee8cc1Swenshuai.xi *pu32ISOSpeedRatings = _u32EXIF_ISOSpeedRatings;
8683*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF ISO = %ld \n", *pu32ISOSpeedRatings);
8684*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8685*53ee8cc1Swenshuai.xi }
8686*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFShutterSpeedValue_OJPD(JPEG_RATIONAL * pShutterSpeedValue)8687*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFShutterSpeedValue_OJPD(JPEG_RATIONAL *pShutterSpeedValue)
8688*53ee8cc1Swenshuai.xi {
8689*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8690*53ee8cc1Swenshuai.xi {
8691*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8692*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8693*53ee8cc1Swenshuai.xi }
8694*53ee8cc1Swenshuai.xi pShutterSpeedValue->numerator = _stEXIF_ShutterSpeedValue.numerator;
8695*53ee8cc1Swenshuai.xi pShutterSpeedValue->denominator= _stEXIF_ShutterSpeedValue.denominator;
8696*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ShutterSpeedValue numerator=%ld, denominator=%ld\n", pShutterSpeedValue->numerator, pShutterSpeedValue->denominator);
8697*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8698*53ee8cc1Swenshuai.xi }
8699*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFApertureValue_OJPD(JPEG_RATIONAL * pApertureValue)8700*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFApertureValue_OJPD(JPEG_RATIONAL *pApertureValue)
8701*53ee8cc1Swenshuai.xi {
8702*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8703*53ee8cc1Swenshuai.xi {
8704*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8705*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8706*53ee8cc1Swenshuai.xi }
8707*53ee8cc1Swenshuai.xi pApertureValue->s_numerator = _stEXIF_ApertureValue.s_numerator;
8708*53ee8cc1Swenshuai.xi pApertureValue->s_denominator= _stEXIF_ApertureValue.s_denominator;
8709*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ApertureValue numerator=%ld, denominator=%ld\n", pApertureValue->s_numerator, pApertureValue->s_denominator);
8710*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8711*53ee8cc1Swenshuai.xi }
8712*53ee8cc1Swenshuai.xi
8713*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFExposureBiasValue_OJPD(JPEG_RATIONAL * pExposureBiasValue)8714*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFExposureBiasValue_OJPD(JPEG_RATIONAL *pExposureBiasValue)
8715*53ee8cc1Swenshuai.xi {
8716*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8717*53ee8cc1Swenshuai.xi {
8718*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8719*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8720*53ee8cc1Swenshuai.xi }
8721*53ee8cc1Swenshuai.xi pExposureBiasValue->numerator = _stEXIF_ExposureBiasValue.numerator;
8722*53ee8cc1Swenshuai.xi pExposureBiasValue->denominator= _stEXIF_ExposureBiasValue.denominator;
8723*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureBiasValue numerator=%ld, denominator=%ld\n", pExposureBiasValue->numerator, pExposureBiasValue->denominator);
8724*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8725*53ee8cc1Swenshuai.xi }
8726*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFFocalLength_OJPD(JPEG_RATIONAL * pFocalLength)8727*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFFocalLength_OJPD(JPEG_RATIONAL *pFocalLength)
8728*53ee8cc1Swenshuai.xi {
8729*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8730*53ee8cc1Swenshuai.xi {
8731*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8732*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8733*53ee8cc1Swenshuai.xi }
8734*53ee8cc1Swenshuai.xi pFocalLength->s_numerator = _stEXIF_FocalLength.s_numerator;
8735*53ee8cc1Swenshuai.xi pFocalLength->s_denominator= _stEXIF_FocalLength.s_denominator;
8736*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FocalLength numerator=%ld, denominator=%ld\n", pFocalLength->s_numerator, pFocalLength->s_denominator);
8737*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8738*53ee8cc1Swenshuai.xi }
8739*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFImageWidth_OJPD(MS_U32 * pu32ImageWidth)8740*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFImageWidth_OJPD(MS_U32 *pu32ImageWidth)
8741*53ee8cc1Swenshuai.xi {
8742*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8743*53ee8cc1Swenshuai.xi {
8744*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8745*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8746*53ee8cc1Swenshuai.xi }
8747*53ee8cc1Swenshuai.xi *pu32ImageWidth = _u32EXIF_ImageWidth;
8748*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Image Width = %ld \n", *pu32ImageWidth);
8749*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8750*53ee8cc1Swenshuai.xi }
8751*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFImageHeight_OJPD(MS_U32 * pu32ImageHeight)8752*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFImageHeight_OJPD(MS_U32 *pu32ImageHeight)
8753*53ee8cc1Swenshuai.xi {
8754*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8755*53ee8cc1Swenshuai.xi {
8756*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8757*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8758*53ee8cc1Swenshuai.xi }
8759*53ee8cc1Swenshuai.xi *pu32ImageHeight = _u32EXIF_ImageHeight;
8760*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Image Height = %ld \n", *pu32ImageHeight);
8761*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8762*53ee8cc1Swenshuai.xi }
MApi_JPEG_GetEXIFExposureTime_OJPD(JPEG_RATIONAL * pExposureTime)8763*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFExposureTime_OJPD(JPEG_RATIONAL *pExposureTime)
8764*53ee8cc1Swenshuai.xi {
8765*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8766*53ee8cc1Swenshuai.xi {
8767*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8768*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8769*53ee8cc1Swenshuai.xi }
8770*53ee8cc1Swenshuai.xi pExposureTime->s_numerator = _stEXIF_ExposureTime.s_numerator;
8771*53ee8cc1Swenshuai.xi pExposureTime->s_denominator= _stEXIF_ExposureTime.s_denominator;
8772*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureTime numerator=%ld, denominator=%ld\n", pExposureTime->s_numerator, pExposureTime->s_denominator);
8773*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8774*53ee8cc1Swenshuai.xi }
8775*53ee8cc1Swenshuai.xi
8776*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFFNumber_OJPD(JPEG_RATIONAL * pFNumber)8777*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFFNumber_OJPD(JPEG_RATIONAL *pFNumber)
8778*53ee8cc1Swenshuai.xi {
8779*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8780*53ee8cc1Swenshuai.xi {
8781*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8782*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8783*53ee8cc1Swenshuai.xi }
8784*53ee8cc1Swenshuai.xi pFNumber->s_numerator = _stEXIF_FNumber.s_numerator;
8785*53ee8cc1Swenshuai.xi pFNumber->s_denominator= _stEXIF_FNumber.s_denominator;
8786*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FNumber numerator=%ld, denominator=%ld\n", pFNumber->s_numerator, pFNumber->s_denominator);
8787*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8788*53ee8cc1Swenshuai.xi }
8789*53ee8cc1Swenshuai.xi #endif
8790*53ee8cc1Swenshuai.xi
8791*53ee8cc1Swenshuai.xi
MApi_JPEG_GetControl_OJPD(EN_JPEG_GET_CTRL_ID eGetID,MS_U32 * param,MS_U32 u32size)8792*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetControl_OJPD(EN_JPEG_GET_CTRL_ID eGetID, MS_U32 *param, MS_U32 u32size)
8793*53ee8cc1Swenshuai.xi {
8794*53ee8cc1Swenshuai.xi JPEG_Result eResult = E_JPEG_OKAY;
8795*53ee8cc1Swenshuai.xi
8796*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8797*53ee8cc1Swenshuai.xi {
8798*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8799*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8800*53ee8cc1Swenshuai.xi }
8801*53ee8cc1Swenshuai.xi
8802*53ee8cc1Swenshuai.xi switch(eGetID)
8803*53ee8cc1Swenshuai.xi {
8804*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_MANUFACTURER:
8805*53ee8cc1Swenshuai.xi eResult = MApi_JPEG_GetEXIFManufacturer((MS_U8 *)param, u32size*4);
8806*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Manufacturer = %c%c%c%c%c%c%c%c%c%c%c%c\n",
8807*53ee8cc1Swenshuai.xi *((MS_U8 *)param), *((MS_U8 *)param+1), *((MS_U8 *)param+2), *((MS_U8 *)param+3),
8808*53ee8cc1Swenshuai.xi *((MS_U8 *)param+4),*((MS_U8 *)param+5),*((MS_U8 *)param+6),*((MS_U8 *)param+7),
8809*53ee8cc1Swenshuai.xi *((MS_U8 *)param+8),*((MS_U8 *)param+9),*((MS_U8 *)param+10),*((MS_U8 *)param+11)
8810*53ee8cc1Swenshuai.xi );
8811*53ee8cc1Swenshuai.xi break;
8812*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_MODEL:
8813*53ee8cc1Swenshuai.xi eResult = MApi_JPEG_GetEXIFModel((MS_U8 *)param, u32size*4);
8814*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Model = %c%c%c%c%c%c%c%c%c%c%c%c\n",
8815*53ee8cc1Swenshuai.xi *((MS_U8 *)param), *((MS_U8 *)param+1), *((MS_U8 *)param+2), *((MS_U8 *)param+3),
8816*53ee8cc1Swenshuai.xi *((MS_U8 *)param+4),*((MS_U8 *)param+5),*((MS_U8 *)param+6),*((MS_U8 *)param+7),
8817*53ee8cc1Swenshuai.xi *((MS_U8 *)param+8),*((MS_U8 *)param+9),*((MS_U8 *)param+10),*((MS_U8 *)param+11)
8818*53ee8cc1Swenshuai.xi );
8819*53ee8cc1Swenshuai.xi break;
8820*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_FLASH:
8821*53ee8cc1Swenshuai.xi *param = (MS_U32)_u16EXIF_Flash;
8822*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Flash = %ld \n", *param);
8823*53ee8cc1Swenshuai.xi break;
8824*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_ISO_SPEED_RATINGS:
8825*53ee8cc1Swenshuai.xi *param = _u32EXIF_ISOSpeedRatings;
8826*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF ISO = %ld \n", *param);
8827*53ee8cc1Swenshuai.xi break;
8828*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_SHUTTER_SPEED_VALUE:
8829*53ee8cc1Swenshuai.xi if(u32size<2)
8830*53ee8cc1Swenshuai.xi {
8831*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8832*53ee8cc1Swenshuai.xi }
8833*53ee8cc1Swenshuai.xi *param = _stEXIF_ShutterSpeedValue.numerator;
8834*53ee8cc1Swenshuai.xi *(param+1) = _stEXIF_ShutterSpeedValue.denominator;
8835*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@ShutterSpeedValue numerator=%ld, denominator=%ld\n", *param, *(param+1));
8836*53ee8cc1Swenshuai.xi break;
8837*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_APERTURE_VALUE:
8838*53ee8cc1Swenshuai.xi if(u32size<2)
8839*53ee8cc1Swenshuai.xi {
8840*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8841*53ee8cc1Swenshuai.xi }
8842*53ee8cc1Swenshuai.xi *param = (MS_U32)_stEXIF_ApertureValue.s_numerator;
8843*53ee8cc1Swenshuai.xi *(param+1) = (MS_U32)_stEXIF_ApertureValue.s_denominator;
8844*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@ApertureValue numerator=%ld, denominator=%ld\n", *param, *(param+1));
8845*53ee8cc1Swenshuai.xi break;
8846*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_EXPOSURE_BIAS_VALUE:
8847*53ee8cc1Swenshuai.xi if(u32size<2)
8848*53ee8cc1Swenshuai.xi {
8849*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8850*53ee8cc1Swenshuai.xi }
8851*53ee8cc1Swenshuai.xi *param = _stEXIF_ExposureBiasValue.numerator;
8852*53ee8cc1Swenshuai.xi *(param+1) = _stEXIF_ExposureBiasValue.denominator;
8853*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@ExposureBiasValue numerator=%ld, denominator=%ld\n", *param, *(param+1));
8854*53ee8cc1Swenshuai.xi break;
8855*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_FOCAL_LENGTH:
8856*53ee8cc1Swenshuai.xi if(u32size<2)
8857*53ee8cc1Swenshuai.xi {
8858*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8859*53ee8cc1Swenshuai.xi }
8860*53ee8cc1Swenshuai.xi *param = (MS_U32)_stEXIF_FocalLength.s_numerator;
8861*53ee8cc1Swenshuai.xi *(param+1) = (MS_U32)_stEXIF_FocalLength.s_denominator;
8862*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@FocalLength numerator=%ld, denominator=%ld\n", *param, *(param+1));
8863*53ee8cc1Swenshuai.xi break;
8864*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_IMAGE_WIDTH:
8865*53ee8cc1Swenshuai.xi *param = _u32EXIF_ImageWidth;
8866*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Image Width = %ld \n", *param);
8867*53ee8cc1Swenshuai.xi break;
8868*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_IMAGE_HEIGHT:
8869*53ee8cc1Swenshuai.xi *param = _u32EXIF_ImageHeight;
8870*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Image Height = %ld \n", *param);
8871*53ee8cc1Swenshuai.xi break;
8872*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_EXPOSURE_TIME:
8873*53ee8cc1Swenshuai.xi if(u32size<2)
8874*53ee8cc1Swenshuai.xi {
8875*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8876*53ee8cc1Swenshuai.xi }
8877*53ee8cc1Swenshuai.xi *param = (MS_U32)_stEXIF_ExposureTime.s_numerator;
8878*53ee8cc1Swenshuai.xi *(param+1) = (MS_U32)_stEXIF_ExposureTime.s_denominator;
8879*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@ExposureTime numerator=%ld, denominator=%ld\n", *param, *(param+1));
8880*53ee8cc1Swenshuai.xi break;
8881*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_F_NUMBER:
8882*53ee8cc1Swenshuai.xi if(u32size<2)
8883*53ee8cc1Swenshuai.xi {
8884*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8885*53ee8cc1Swenshuai.xi }
8886*53ee8cc1Swenshuai.xi *param = (MS_U32)_stEXIF_FNumber.s_numerator;
8887*53ee8cc1Swenshuai.xi *(param+1) = (MS_U32)_stEXIF_FNumber.s_denominator;
8888*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@FNumber numerator=%ld, denominator=%ld\n", *param, *(param+1));
8889*53ee8cc1Swenshuai.xi break;
8890*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_EXPOSURE_PROGRAM:
8891*53ee8cc1Swenshuai.xi *param = (MS_U32)_u16EXIF_Exposureprogram;
8892*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Exposure Program = %ld \n", *param);
8893*53ee8cc1Swenshuai.xi break;
8894*53ee8cc1Swenshuai.xi case E_JPEG_GET_Y_SAMPLING_FACTOR_HORIZONTAL:
8895*53ee8cc1Swenshuai.xi *param = (MS_U32)_u8Comp_h_samp[0];
8896*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG Horizontal sampling factor(Y) = %ld \n", *param);
8897*53ee8cc1Swenshuai.xi break;
8898*53ee8cc1Swenshuai.xi case E_JPEG_GET_Y_SAMPLING_FACTOR_VERTICAL:
8899*53ee8cc1Swenshuai.xi *param = (MS_U32)_u8Comp_v_samp[0];
8900*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG Vertical sampling factor(Y) = %ld \n", *param);
8901*53ee8cc1Swenshuai.xi break;
8902*53ee8cc1Swenshuai.xi case E_JPEG_GET_COMPONENTS_NUM:
8903*53ee8cc1Swenshuai.xi *param = (MS_U32)_u8Comps_in_frame;
8904*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG componemts num = %ld \n", *param);
8905*53ee8cc1Swenshuai.xi break;
8906*53ee8cc1Swenshuai.xi case E_JPEG_GET_IS_PROGRESSIVE:
8907*53ee8cc1Swenshuai.xi *param = (MS_U32)_bProgressive_flag;
8908*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG is progressive = %ld \n", *param);
8909*53ee8cc1Swenshuai.xi break;
8910*53ee8cc1Swenshuai.xi default:
8911*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8912*53ee8cc1Swenshuai.xi break;
8913*53ee8cc1Swenshuai.xi }
8914*53ee8cc1Swenshuai.xi return eResult;
8915*53ee8cc1Swenshuai.xi }
8916*53ee8cc1Swenshuai.xi
8917*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////
8918*53ee8cc1Swenshuai.xi /// current unused function, maybe removed in new MDDI
8919*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////
8920*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI
8921*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8922*53ee8cc1Swenshuai.xi void msAPI_MJPEG_Parse_SOF(void)
8923*53ee8cc1Swenshuai.xi {
8924*53ee8cc1Swenshuai.xi JPEG_locate_sof_marker();
8925*53ee8cc1Swenshuai.xi }
8926*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8927*53ee8cc1Swenshuai.xi void msAPI_MJPEG_constructor( PJPEG_FILE_FileSystem_t Pstream, MS_U8 decode_type)
8928*53ee8cc1Swenshuai.xi {
8929*53ee8cc1Swenshuai.xi _u8DecodeType = decode_type;
8930*53ee8cc1Swenshuai.xi JPEG_init_thumbnail();
8931*53ee8cc1Swenshuai.xi msAPI_MJPEG_decode_init( Pstream);
8932*53ee8cc1Swenshuai.xi }
8933*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8934*53ee8cc1Swenshuai.xi //Set Total pics in the file
8935*53ee8cc1Swenshuai.xi void msAPI_MJPEG_SetTotal_Pics(MS_U32 *DecodeTime)
8936*53ee8cc1Swenshuai.xi {
8937*53ee8cc1Swenshuai.xi *DecodeTime = NumPics;
8938*53ee8cc1Swenshuai.xi }
8939*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8940*53ee8cc1Swenshuai.xi MS_S16 msAPI_JPEG_Check_End_Flag( void )
8941*53ee8cc1Swenshuai.xi {
8942*53ee8cc1Swenshuai.xi return ( _bEOF_flag );
8943*53ee8cc1Swenshuai.xi }
8944*53ee8cc1Swenshuai.xi
8945*53ee8cc1Swenshuai.xi #ifndef CMODEL
8946*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8947*53ee8cc1Swenshuai.xi /******************************************************************************/
8948*53ee8cc1Swenshuai.xi ///Set downscale ratio
8949*53ee8cc1Swenshuai.xi ///@param ratio \b OUT scale ratio
8950*53ee8cc1Swenshuai.xi /******************************************************************************/
8951*53ee8cc1Swenshuai.xi void msAPI_JPEG_SetDownScaleRatio(JPEG_DownScaleRatio ratio)
8952*53ee8cc1Swenshuai.xi {
8953*53ee8cc1Swenshuai.xi switch(ratio)
8954*53ee8cc1Swenshuai.xi {
8955*53ee8cc1Swenshuai.xi case E_RATIO_HALF:
8956*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_HALF;
8957*53ee8cc1Swenshuai.xi break;
8958*53ee8cc1Swenshuai.xi case E_RATIO_FOURTH:
8959*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_FOURTH;
8960*53ee8cc1Swenshuai.xi break;
8961*53ee8cc1Swenshuai.xi case E_RATIO_EIGHTH:
8962*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_EIGHTH;
8963*53ee8cc1Swenshuai.xi break;
8964*53ee8cc1Swenshuai.xi default:
8965*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
8966*53ee8cc1Swenshuai.xi break;
8967*53ee8cc1Swenshuai.xi }
8968*53ee8cc1Swenshuai.xi }
8969*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8970*53ee8cc1Swenshuai.xi void msAPI_JPEG_GetOutputDimension(MS_U16 *width, MS_U16 *height)
8971*53ee8cc1Swenshuai.xi {
8972*53ee8cc1Swenshuai.xi MS_U8 mcu_width, mcu_height;
8973*53ee8cc1Swenshuai.xi MS_U16 pic_width = _u16Image_x_size;
8974*53ee8cc1Swenshuai.xi MS_U16 pic_height = _u16Image_y_size;
8975*53ee8cc1Swenshuai.xi MS_U8 Y_VSF = _u8Comp_v_samp[0];
8976*53ee8cc1Swenshuai.xi MS_U8 Y_HSF = _u8Comp_h_samp[0];
8977*53ee8cc1Swenshuai.xi MS_U16 ROI_width;
8978*53ee8cc1Swenshuai.xi
8979*53ee8cc1Swenshuai.xi if ( ( mcu_width = pic_width % ( Y_HSF * 8 ) ) )
8980*53ee8cc1Swenshuai.xi {
8981*53ee8cc1Swenshuai.xi pic_width += ( Y_HSF * 8 - mcu_width );
8982*53ee8cc1Swenshuai.xi }
8983*53ee8cc1Swenshuai.xi
8984*53ee8cc1Swenshuai.xi if ( ( mcu_height = pic_height% ( Y_VSF * 8 ) ) )
8985*53ee8cc1Swenshuai.xi {
8986*53ee8cc1Swenshuai.xi pic_height += ( Y_VSF * 8 - mcu_height );
8987*53ee8cc1Swenshuai.xi }
8988*53ee8cc1Swenshuai.xi
8989*53ee8cc1Swenshuai.xi ROI_width = pic_width;
8990*53ee8cc1Swenshuai.xi
8991*53ee8cc1Swenshuai.xi if(_u8DownScaleRatio==E_JPD_DOWNSCALE_FOURTH||_u8DownScaleRatio==E_JPD_DOWNSCALE_EIGHTH)
8992*53ee8cc1Swenshuai.xi {
8993*53ee8cc1Swenshuai.xi MS_U16 ROI_width;
8994*53ee8cc1Swenshuai.xi
8995*53ee8cc1Swenshuai.xi if(_u8DownScaleRatio==E_JPD_DOWNSCALE_FOURTH)
8996*53ee8cc1Swenshuai.xi {
8997*53ee8cc1Swenshuai.xi // width must be multiple of 32
8998*53ee8cc1Swenshuai.xi ROI_width = (pic_width/32)*32;
8999*53ee8cc1Swenshuai.xi }
9000*53ee8cc1Swenshuai.xi else if(_u8DownScaleRatio==E_JPD_DOWNSCALE_EIGHTH)
9001*53ee8cc1Swenshuai.xi {
9002*53ee8cc1Swenshuai.xi // width must be multiple of 64
9003*53ee8cc1Swenshuai.xi ROI_width = (pic_width/64)*64;
9004*53ee8cc1Swenshuai.xi }
9005*53ee8cc1Swenshuai.xi }
9006*53ee8cc1Swenshuai.xi
9007*53ee8cc1Swenshuai.xi switch(_u8DownScaleRatio)
9008*53ee8cc1Swenshuai.xi {
9009*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_HALF:
9010*53ee8cc1Swenshuai.xi *width = ROI_width/2;
9011*53ee8cc1Swenshuai.xi break;
9012*53ee8cc1Swenshuai.xi
9013*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_FOURTH:
9014*53ee8cc1Swenshuai.xi *width = ROI_width/4;
9015*53ee8cc1Swenshuai.xi break;
9016*53ee8cc1Swenshuai.xi
9017*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_EIGHTH:
9018*53ee8cc1Swenshuai.xi *width = ROI_width/8;
9019*53ee8cc1Swenshuai.xi break;
9020*53ee8cc1Swenshuai.xi
9021*53ee8cc1Swenshuai.xi default:
9022*53ee8cc1Swenshuai.xi *width = ROI_width;
9023*53ee8cc1Swenshuai.xi break;
9024*53ee8cc1Swenshuai.xi }
9025*53ee8cc1Swenshuai.xi
9026*53ee8cc1Swenshuai.xi *height = pic_height;
9027*53ee8cc1Swenshuai.xi }
9028*53ee8cc1Swenshuai.xi #endif
9029*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9030*53ee8cc1Swenshuai.xi MS_BOOL msAPI_MJPEG_SetInitParameter(MS_U32 u32RBufAddr, MS_U32 u32RBufSize, MS_U32 u32WBufAddr, MS_U32 u32IBufAddr, MS_U32 u32IBufSize)
9031*53ee8cc1Swenshuai.xi {
9032*53ee8cc1Swenshuai.xi // the buffer size must be multiple of 4 bytes
9033*53ee8cc1Swenshuai.xi //if((u32RBufSize%4)!=0)
9034*53ee8cc1Swenshuai.xi // return FALSE;
9035*53ee8cc1Swenshuai.xi MS_U32 WBuffer = _u16Image_x_size*_u16Image_y_size*2;
9036*53ee8cc1Swenshuai.xi #ifdef CMODEL
9037*53ee8cc1Swenshuai.xi _bReady_flag = FALSE;
9038*53ee8cc1Swenshuai.xi #endif
9039*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR = _u32ReadBufferAddr + u32RBufAddr;
9040*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MRC_BUFFER_ADDR = %08lx\n",MRC_BUFFER_ADDR);
9041*53ee8cc1Swenshuai.xi //MRC_BUFFER_SIZE = _pu8In_buf + u32RBufSize;
9042*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("_u32WriteBufferAddr = %08X\n",_u32WriteBufferAddr);
9043*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("WBuffer = %08X\n",WBuffer);
9044*53ee8cc1Swenshuai.xi MWC_BUFFER_ADDR = _u32WriteBufferAddr + WBuffer;
9045*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MWC_BUFFER_ADDR = %08lx\n",MWC_BUFFER_ADDR);
9046*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("MWC_BUFFER_ADDR = %08X\n",MWC_BUFFER_ADDR);
9047*53ee8cc1Swenshuai.xi //INTERNAL_BUFFER_ADDR = u32IBufAddr;
9048*53ee8cc1Swenshuai.xi //INTERNAL_BUFFER_SIZE = u32IBufSize;
9049*53ee8cc1Swenshuai.xi //_u32In_buf_left = 0;
9050*53ee8cc1Swenshuai.xi _pu8In_buf = (MS_U8 *) (_u32ReadBufferAddr);
9051*53ee8cc1Swenshuai.xi _u32Total_bytes_read -= u32RBufAddr;
9052*53ee8cc1Swenshuai.xi //JPEG_MEMORY_init_mempool(((MS_U8 *) (u32IBufAddr + JPEG_DEFAULT_EXIF_SIZE)), u32IBufSize - JPEG_DEFAULT_EXIF_SIZE);
9053*53ee8cc1Swenshuai.xi //JPEG_locate_sof_marker();
9054*53ee8cc1Swenshuai.xi
9055*53ee8cc1Swenshuai.xi return TRUE;
9056*53ee8cc1Swenshuai.xi }
9057*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9058*53ee8cc1Swenshuai.xi MS_BOOL msAPI_MJPEG_ReSetMWC(MS_U32 u32RBufAddr, MS_U32 u32RBufSize, MS_U32 u32WBufAddr, MS_U32 u32IBufAddr, MS_U32 u32IBufSize)
9059*53ee8cc1Swenshuai.xi {
9060*53ee8cc1Swenshuai.xi
9061*53ee8cc1Swenshuai.xi _u32WriteBufferAddr = u32WBufAddr;
9062*53ee8cc1Swenshuai.xi
9063*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MWC_BUFFER_ADDR = %08lx\n",MWC_BUFFER_ADDR);
9064*53ee8cc1Swenshuai.xi
9065*53ee8cc1Swenshuai.xi return TRUE;
9066*53ee8cc1Swenshuai.xi }
9067*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9068*53ee8cc1Swenshuai.xi void msAPI_JPEG_SetErrorCode(MS_U16 u16Code)
9069*53ee8cc1Swenshuai.xi {
9070*53ee8cc1Swenshuai.xi _Error_code = u16Code;
9071*53ee8cc1Swenshuai.xi }
9072*53ee8cc1Swenshuai.xi #if 0
9073*53ee8cc1Swenshuai.xi #ifdef CMODEL
9074*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9075*53ee8cc1Swenshuai.xi // If you wish to decompress the image, call this method after constructing
9076*53ee8cc1Swenshuai.xi // the object. If E_JPEG_OKAY is returned you may then call decode() to
9077*53ee8cc1Swenshuai.xi // fetch the scan lines.
9078*53ee8cc1Swenshuai.xi JPEG_Result msAPI_JPEG_begin( void )
9079*53ee8cc1Swenshuai.xi {
9080*53ee8cc1Swenshuai.xi if ( _bReady_flag )
9081*53ee8cc1Swenshuai.xi {
9082*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Flag!!!!\n");
9083*53ee8cc1Swenshuai.xi return ( E_JPEG_OKAY );
9084*53ee8cc1Swenshuai.xi }
9085*53ee8cc1Swenshuai.xi
9086*53ee8cc1Swenshuai.xi if ( _Error_code )
9087*53ee8cc1Swenshuai.xi {
9088*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Error!!!!\n");
9089*53ee8cc1Swenshuai.xi return ( E_JPEG_FAILED );
9090*53ee8cc1Swenshuai.xi }
9091*53ee8cc1Swenshuai.xi JPEG_locate_sof_marker();
9092*53ee8cc1Swenshuai.xi
9093*53ee8cc1Swenshuai.xi //JPEG_decode_start();
9094*53ee8cc1Swenshuai.xi
9095*53ee8cc1Swenshuai.xi _bReady_flag = TRUE;
9096*53ee8cc1Swenshuai.xi
9097*53ee8cc1Swenshuai.xi return ( E_JPEG_OKAY );
9098*53ee8cc1Swenshuai.xi }
9099*53ee8cc1Swenshuai.xi #endif
9100*53ee8cc1Swenshuai.xi #endif
9101*53ee8cc1Swenshuai.xi #endif // not implement for new MDDI
9102*53ee8cc1Swenshuai.xi
9103*53ee8cc1Swenshuai.xi
9104*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
9105*53ee8cc1Swenshuai.xi // Decodes and dequantizes the next row of coefficients.
msAPI_JPEG_decode_next_row(void)9106*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_decode_next_row( void )
9107*53ee8cc1Swenshuai.xi {
9108*53ee8cc1Swenshuai.xi MS_U16 row_block = 0;
9109*53ee8cc1Swenshuai.xi MS_U16 mcu_row, mcu_block, k;
9110*53ee8cc1Swenshuai.xi
9111*53ee8cc1Swenshuai.xi // Clearing the entire row block buffer can take a lot of time!
9112*53ee8cc1Swenshuai.xi // Instead of clearing the entire buffer each row, keep track
9113*53ee8cc1Swenshuai.xi // of the number of nonzero entries written to each block and do
9114*53ee8cc1Swenshuai.xi // selective clears.
9115*53ee8cc1Swenshuai.xi //memset(_ps16Block_seg[0], 0, _u16Mcus_per_row * _u8Blocks_per_mcu * 64 * sizeof(BLOCK_TYPE));
9116*53ee8cc1Swenshuai.xi
9117*53ee8cc1Swenshuai.xi for ( mcu_row = 0; mcu_row < _u16Mcus_per_row; mcu_row++ )
9118*53ee8cc1Swenshuai.xi {
9119*53ee8cc1Swenshuai.xi if ( ( _u16Restart_interval ) && ( _u16Restarts_left == 0 ) )
9120*53ee8cc1Swenshuai.xi {
9121*53ee8cc1Swenshuai.xi if(!JPEG_process_restart())
9122*53ee8cc1Swenshuai.xi return FALSE;
9123*53ee8cc1Swenshuai.xi }
9124*53ee8cc1Swenshuai.xi
9125*53ee8cc1Swenshuai.xi for ( mcu_block = 0; mcu_block < _u8Blocks_per_mcu; mcu_block++ )
9126*53ee8cc1Swenshuai.xi {
9127*53ee8cc1Swenshuai.xi MS_U8 component_id = _u8Mcu_org[mcu_block];
9128*53ee8cc1Swenshuai.xi MS_U8 prev_num_set;
9129*53ee8cc1Swenshuai.xi JPEG_HuffTbl *Ph;
9130*53ee8cc1Swenshuai.xi
9131*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p = _ps16Block_seg[row_block];
9132*53ee8cc1Swenshuai.xi JPEG_QUANT_TYPE *q = _QuantTables[_u8Comp_quant[component_id]].s16Value;
9133*53ee8cc1Swenshuai.xi MS_S32 r, s;
9134*53ee8cc1Swenshuai.xi
9135*53ee8cc1Swenshuai.xi if ( ( s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_dc_tab[component_id]] ) ) != 0 )
9136*53ee8cc1Swenshuai.xi {
9137*53ee8cc1Swenshuai.xi r = JPEG_get_bits_2( s );
9138*53ee8cc1Swenshuai.xi s = HUFF_EXTEND( r, s );
9139*53ee8cc1Swenshuai.xi }
9140*53ee8cc1Swenshuai.xi
9141*53ee8cc1Swenshuai.xi //printf("r : %d s : %d\n",s,r);
9142*53ee8cc1Swenshuai.xi
9143*53ee8cc1Swenshuai.xi _u32Last_dc_val[component_id] = ( s += _u32Last_dc_val[component_id] );
9144*53ee8cc1Swenshuai.xi
9145*53ee8cc1Swenshuai.xi p[0] = s * q[0];
9146*53ee8cc1Swenshuai.xi
9147*53ee8cc1Swenshuai.xi prev_num_set = _u8Block_max_zag_set[row_block];
9148*53ee8cc1Swenshuai.xi
9149*53ee8cc1Swenshuai.xi Ph = &_Huff_tbls[_u8Comp_ac_tab[component_id]];
9150*53ee8cc1Swenshuai.xi
9151*53ee8cc1Swenshuai.xi for ( k = 1; k < 64; k++ )
9152*53ee8cc1Swenshuai.xi {
9153*53ee8cc1Swenshuai.xi s = JPEG_huff_decode( Ph );
9154*53ee8cc1Swenshuai.xi
9155*53ee8cc1Swenshuai.xi //printf("Decode s :%d\n",s);
9156*53ee8cc1Swenshuai.xi
9157*53ee8cc1Swenshuai.xi r = s >> 4;
9158*53ee8cc1Swenshuai.xi s &= 15;
9159*53ee8cc1Swenshuai.xi
9160*53ee8cc1Swenshuai.xi if ( s )
9161*53ee8cc1Swenshuai.xi {
9162*53ee8cc1Swenshuai.xi if ( r )
9163*53ee8cc1Swenshuai.xi {
9164*53ee8cc1Swenshuai.xi if ( ( k + r ) > 63 )
9165*53ee8cc1Swenshuai.xi {
9166*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
9167*53ee8cc1Swenshuai.xi return FALSE;
9168*53ee8cc1Swenshuai.xi }
9169*53ee8cc1Swenshuai.xi
9170*53ee8cc1Swenshuai.xi if ( k < prev_num_set )
9171*53ee8cc1Swenshuai.xi {
9172*53ee8cc1Swenshuai.xi MS_U32 n = MIN( r, prev_num_set - k );
9173*53ee8cc1Swenshuai.xi MS_U16 kt = k;
9174*53ee8cc1Swenshuai.xi while ( n-- )
9175*53ee8cc1Swenshuai.xi {
9176*53ee8cc1Swenshuai.xi p[_u8ZAG[kt++]] = 0;
9177*53ee8cc1Swenshuai.xi }
9178*53ee8cc1Swenshuai.xi }
9179*53ee8cc1Swenshuai.xi
9180*53ee8cc1Swenshuai.xi k += r;
9181*53ee8cc1Swenshuai.xi }
9182*53ee8cc1Swenshuai.xi
9183*53ee8cc1Swenshuai.xi r = JPEG_get_bits_2( s );
9184*53ee8cc1Swenshuai.xi s = HUFF_EXTEND( r, s );
9185*53ee8cc1Swenshuai.xi
9186*53ee8cc1Swenshuai.xi //assert(k < 64);
9187*53ee8cc1Swenshuai.xi
9188*53ee8cc1Swenshuai.xi p[_u8ZAG[k]] = s * q[k];
9189*53ee8cc1Swenshuai.xi }
9190*53ee8cc1Swenshuai.xi else
9191*53ee8cc1Swenshuai.xi {
9192*53ee8cc1Swenshuai.xi if ( r == 15 )
9193*53ee8cc1Swenshuai.xi {
9194*53ee8cc1Swenshuai.xi if ( ( k + 15 ) > 63 )
9195*53ee8cc1Swenshuai.xi {
9196*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
9197*53ee8cc1Swenshuai.xi return FALSE;
9198*53ee8cc1Swenshuai.xi }
9199*53ee8cc1Swenshuai.xi
9200*53ee8cc1Swenshuai.xi if ( k < prev_num_set )
9201*53ee8cc1Swenshuai.xi {
9202*53ee8cc1Swenshuai.xi MS_U16 n = MIN( 16, prev_num_set - k ); //bugfix Dec. 19, 2001 - was 15!
9203*53ee8cc1Swenshuai.xi MS_U16 kt = k;
9204*53ee8cc1Swenshuai.xi while ( n-- )
9205*53ee8cc1Swenshuai.xi {
9206*53ee8cc1Swenshuai.xi p[_u8ZAG[kt++]] = 0;
9207*53ee8cc1Swenshuai.xi }
9208*53ee8cc1Swenshuai.xi }
9209*53ee8cc1Swenshuai.xi
9210*53ee8cc1Swenshuai.xi k += 15;
9211*53ee8cc1Swenshuai.xi }
9212*53ee8cc1Swenshuai.xi else
9213*53ee8cc1Swenshuai.xi {
9214*53ee8cc1Swenshuai.xi //while (k < 64)
9215*53ee8cc1Swenshuai.xi // p[ZAG[k++]] = 0;
9216*53ee8cc1Swenshuai.xi
9217*53ee8cc1Swenshuai.xi break;
9218*53ee8cc1Swenshuai.xi }
9219*53ee8cc1Swenshuai.xi }
9220*53ee8cc1Swenshuai.xi }
9221*53ee8cc1Swenshuai.xi
9222*53ee8cc1Swenshuai.xi if ( k < prev_num_set )
9223*53ee8cc1Swenshuai.xi {
9224*53ee8cc1Swenshuai.xi MS_U16 kt = k;
9225*53ee8cc1Swenshuai.xi while ( kt < prev_num_set && kt < 64) // kt < 64 is for coverity check
9226*53ee8cc1Swenshuai.xi {
9227*53ee8cc1Swenshuai.xi p[_u8ZAG[kt++]] = 0;
9228*53ee8cc1Swenshuai.xi }
9229*53ee8cc1Swenshuai.xi }
9230*53ee8cc1Swenshuai.xi
9231*53ee8cc1Swenshuai.xi _u8Block_max_zag_set[row_block] = k;
9232*53ee8cc1Swenshuai.xi
9233*53ee8cc1Swenshuai.xi //block_num[row_block++] = k;
9234*53ee8cc1Swenshuai.xi row_block++;
9235*53ee8cc1Swenshuai.xi }
9236*53ee8cc1Swenshuai.xi
9237*53ee8cc1Swenshuai.xi _u16Restarts_left--;
9238*53ee8cc1Swenshuai.xi }
9239*53ee8cc1Swenshuai.xi return TRUE;
9240*53ee8cc1Swenshuai.xi }
9241*53ee8cc1Swenshuai.xi
9242*53ee8cc1Swenshuai.xi /*----------------------------------------------------------------------------*/
msAPI_JPEG_idct(JPEG_BLOCK_TYPE * data,MS_U8 * Pdst_ptr)9243*53ee8cc1Swenshuai.xi JPEG_STATIC void msAPI_JPEG_idct( JPEG_BLOCK_TYPE *data, MS_U8 *Pdst_ptr )
9244*53ee8cc1Swenshuai.xi {
9245*53ee8cc1Swenshuai.xi MS_S32 t0, t1, t2, t3;
9246*53ee8cc1Swenshuai.xi MS_S32 t10, t11, t12, t13;
9247*53ee8cc1Swenshuai.xi MS_S32 a1, a2, a3, a4, a5;
9248*53ee8cc1Swenshuai.xi MS_S32 rowctl;
9249*53ee8cc1Swenshuai.xi register JPEG_BLOCK_TYPE *pdata;
9250*53ee8cc1Swenshuai.xi
9251*53ee8cc1Swenshuai.xi //kevinhuang, use an internal array in idct to avoid memcpy to save time
9252*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE workspace[64];
9253*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *wsptr;
9254*53ee8cc1Swenshuai.xi
9255*53ee8cc1Swenshuai.xi pdata = data;
9256*53ee8cc1Swenshuai.xi wsptr = workspace;
9257*53ee8cc1Swenshuai.xi for ( rowctl = 8 - 1; rowctl >= 0; rowctl-- )
9258*53ee8cc1Swenshuai.xi {
9259*53ee8cc1Swenshuai.xi if ( ( pdata[1] | pdata[2] | pdata[3] | pdata[4] | pdata[5] | pdata[6] | pdata[7] ) == 0 )
9260*53ee8cc1Swenshuai.xi {
9261*53ee8cc1Swenshuai.xi MS_S16 dc_val = ( MS_S16 )( pdata[0] << 2 );
9262*53ee8cc1Swenshuai.xi
9263*53ee8cc1Swenshuai.xi wsptr[0] = dc_val;
9264*53ee8cc1Swenshuai.xi wsptr[1] = dc_val;
9265*53ee8cc1Swenshuai.xi wsptr[2] = dc_val;
9266*53ee8cc1Swenshuai.xi wsptr[3] = dc_val;
9267*53ee8cc1Swenshuai.xi wsptr[4] = dc_val;
9268*53ee8cc1Swenshuai.xi wsptr[5] = dc_val;
9269*53ee8cc1Swenshuai.xi wsptr[6] = dc_val;
9270*53ee8cc1Swenshuai.xi wsptr[7] = dc_val;
9271*53ee8cc1Swenshuai.xi
9272*53ee8cc1Swenshuai.xi pdata += 8; /* advance pointer to next row */
9273*53ee8cc1Swenshuai.xi wsptr += 8;
9274*53ee8cc1Swenshuai.xi continue;
9275*53ee8cc1Swenshuai.xi }
9276*53ee8cc1Swenshuai.xi
9277*53ee8cc1Swenshuai.xi a2 = ( MS_S32 )pdata[2];
9278*53ee8cc1Swenshuai.xi a3 = ( MS_S32 )pdata[6];
9279*53ee8cc1Swenshuai.xi
9280*53ee8cc1Swenshuai.xi a1 = (FIX_0_5411) * (a2 + a3);
9281*53ee8cc1Swenshuai.xi t2 = (-FIX_1_8477) * a3 + a1;
9282*53ee8cc1Swenshuai.xi t3 = (FIX_0_7653) * a2 + a1;
9283*53ee8cc1Swenshuai.xi
9284*53ee8cc1Swenshuai.xi t0 = ( ( MS_S32 )pdata[0] + ( MS_S32 )pdata[4] ) << 13;
9285*53ee8cc1Swenshuai.xi t1 = ( ( MS_S32 )pdata[0] - ( MS_S32 )pdata[4] ) << 13;
9286*53ee8cc1Swenshuai.xi
9287*53ee8cc1Swenshuai.xi t10 = t0 + t3;
9288*53ee8cc1Swenshuai.xi t13 = t0 - t3;
9289*53ee8cc1Swenshuai.xi t11 = t1 + t2;
9290*53ee8cc1Swenshuai.xi t12 = t1 - t2;
9291*53ee8cc1Swenshuai.xi
9292*53ee8cc1Swenshuai.xi t0 = ( MS_S32 )pdata[7];
9293*53ee8cc1Swenshuai.xi t1 = ( MS_S32 )pdata[5];
9294*53ee8cc1Swenshuai.xi t2 = ( MS_S32 )pdata[3];
9295*53ee8cc1Swenshuai.xi t3 = ( MS_S32 )pdata[1];
9296*53ee8cc1Swenshuai.xi
9297*53ee8cc1Swenshuai.xi a1 = t0 + t3;
9298*53ee8cc1Swenshuai.xi a2 = t1 + t2;
9299*53ee8cc1Swenshuai.xi a3 = t0 + t2;
9300*53ee8cc1Swenshuai.xi a4 = t1 + t3;
9301*53ee8cc1Swenshuai.xi a5 = (FIX_1_1758) * (a3 + a4);
9302*53ee8cc1Swenshuai.xi
9303*53ee8cc1Swenshuai.xi a1 = (-FIX_0_8999) * a1;
9304*53ee8cc1Swenshuai.xi a2 = (-FIX_2_5629) * a2;
9305*53ee8cc1Swenshuai.xi a3 = (-FIX_1_9615) * a3;
9306*53ee8cc1Swenshuai.xi a4 = (-FIX_0_3901) * a4;
9307*53ee8cc1Swenshuai.xi t0 = (FIX_0_2986) * t0;
9308*53ee8cc1Swenshuai.xi t1 = (FIX_2_0531) * t1;
9309*53ee8cc1Swenshuai.xi t2 = (FIX_3_0727) * t2;
9310*53ee8cc1Swenshuai.xi t3 = (FIX_1_5013) * t3;
9311*53ee8cc1Swenshuai.xi
9312*53ee8cc1Swenshuai.xi a3 += a5;
9313*53ee8cc1Swenshuai.xi a4 += a5;
9314*53ee8cc1Swenshuai.xi
9315*53ee8cc1Swenshuai.xi t0 += a1 + a3;
9316*53ee8cc1Swenshuai.xi t1 += a2 + a4;
9317*53ee8cc1Swenshuai.xi t2 += a2 + a3;
9318*53ee8cc1Swenshuai.xi t3 += a1 + a4;
9319*53ee8cc1Swenshuai.xi
9320*53ee8cc1Swenshuai.xi wsptr[0] = ( MS_S16 )DESCALE( t10 + t3, 13 - 2 );
9321*53ee8cc1Swenshuai.xi wsptr[1] = ( MS_S16 )DESCALE( t11 + t2, 13 - 2 );
9322*53ee8cc1Swenshuai.xi wsptr[2] = ( MS_S16 )DESCALE( t12 + t1, 13 - 2 );
9323*53ee8cc1Swenshuai.xi wsptr[3] = ( MS_S16 )DESCALE( t13 + t0, 13 - 2 );
9324*53ee8cc1Swenshuai.xi wsptr[4] = ( MS_S16 )DESCALE( t13 - t0, 13 - 2 );
9325*53ee8cc1Swenshuai.xi wsptr[5] = ( MS_S16 )DESCALE( t12 - t1, 13 - 2 );
9326*53ee8cc1Swenshuai.xi wsptr[6] = ( MS_S16 )DESCALE( t11 - t2, 13 - 2 );
9327*53ee8cc1Swenshuai.xi wsptr[7] = ( MS_S16 )DESCALE( t10 - t3, 13 - 2 );
9328*53ee8cc1Swenshuai.xi
9329*53ee8cc1Swenshuai.xi pdata += 8;
9330*53ee8cc1Swenshuai.xi wsptr += 8;
9331*53ee8cc1Swenshuai.xi }
9332*53ee8cc1Swenshuai.xi
9333*53ee8cc1Swenshuai.xi pdata = workspace;
9334*53ee8cc1Swenshuai.xi for ( rowctl = 8 - 1; rowctl >= 0; rowctl-- )
9335*53ee8cc1Swenshuai.xi {
9336*53ee8cc1Swenshuai.xi MS_S16 i;
9337*53ee8cc1Swenshuai.xi
9338*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 )
9339*53ee8cc1Swenshuai.xi {
9340*53ee8cc1Swenshuai.xi MS_S16 dc_val = ( MS_S16 )DESCALE( ( MS_S32 )pdata[0], 2 + 3 ) + 128;
9341*53ee8cc1Swenshuai.xi
9342*53ee8cc1Swenshuai.xi clamp( dc_val );
9343*53ee8cc1Swenshuai.xi
9344*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 0] = ( MS_U8 )dc_val;
9345*53ee8cc1Swenshuai.xi
9346*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9347*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor == 3)
9348*53ee8cc1Swenshuai.xi {
9349*53ee8cc1Swenshuai.xi pdata++;
9350*53ee8cc1Swenshuai.xi Pdst_ptr++;
9351*53ee8cc1Swenshuai.xi continue;
9352*53ee8cc1Swenshuai.xi }
9353*53ee8cc1Swenshuai.xi #endif
9354*53ee8cc1Swenshuai.xi
9355*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 4] = ( MS_U8 )dc_val;
9356*53ee8cc1Swenshuai.xi
9357*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9358*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor == 2)
9359*53ee8cc1Swenshuai.xi {
9360*53ee8cc1Swenshuai.xi pdata++;
9361*53ee8cc1Swenshuai.xi Pdst_ptr++;
9362*53ee8cc1Swenshuai.xi continue;
9363*53ee8cc1Swenshuai.xi }
9364*53ee8cc1Swenshuai.xi #endif
9365*53ee8cc1Swenshuai.xi
9366*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 2] = ( MS_U8 )dc_val;
9367*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 6] = ( MS_U8 )dc_val;
9368*53ee8cc1Swenshuai.xi
9369*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9370*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor == 1)
9371*53ee8cc1Swenshuai.xi {
9372*53ee8cc1Swenshuai.xi pdata++;
9373*53ee8cc1Swenshuai.xi Pdst_ptr++;
9374*53ee8cc1Swenshuai.xi continue;
9375*53ee8cc1Swenshuai.xi }
9376*53ee8cc1Swenshuai.xi #endif
9377*53ee8cc1Swenshuai.xi
9378*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 1] = ( MS_U8 )dc_val;
9379*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 5] = ( MS_U8 )dc_val;
9380*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 3] = ( MS_U8 )dc_val;
9381*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 7] = ( MS_U8 )dc_val;
9382*53ee8cc1Swenshuai.xi
9383*53ee8cc1Swenshuai.xi pdata++;
9384*53ee8cc1Swenshuai.xi Pdst_ptr++;
9385*53ee8cc1Swenshuai.xi continue;
9386*53ee8cc1Swenshuai.xi }
9387*53ee8cc1Swenshuai.xi
9388*53ee8cc1Swenshuai.xi a2 = ( MS_S32 )pdata[8 * 2];
9389*53ee8cc1Swenshuai.xi a3 = ( MS_S32 )pdata[8 * 6];
9390*53ee8cc1Swenshuai.xi
9391*53ee8cc1Swenshuai.xi a1 = (FIX_0_5411) * (a2 + a3);
9392*53ee8cc1Swenshuai.xi t2 = (-FIX_1_8477) * a3 + a1;
9393*53ee8cc1Swenshuai.xi t3 = (FIX_0_7653) * a2 + a1;
9394*53ee8cc1Swenshuai.xi
9395*53ee8cc1Swenshuai.xi t0 = ( ( MS_S32 )pdata[8 * 0] + ( MS_S32 )pdata[8 * 4] ) << 13;
9396*53ee8cc1Swenshuai.xi t1 = ( ( MS_S32 )pdata[8 * 0] - ( MS_S32 )pdata[8 * 4] ) << 13;
9397*53ee8cc1Swenshuai.xi
9398*53ee8cc1Swenshuai.xi t10 = t0 + t3;
9399*53ee8cc1Swenshuai.xi t13 = t0 - t3;
9400*53ee8cc1Swenshuai.xi t11 = t1 + t2;
9401*53ee8cc1Swenshuai.xi t12 = t1 - t2;
9402*53ee8cc1Swenshuai.xi
9403*53ee8cc1Swenshuai.xi t0 = ( MS_S32 )pdata[8 * 7];
9404*53ee8cc1Swenshuai.xi t1 = ( MS_S32 )pdata[8 * 5];
9405*53ee8cc1Swenshuai.xi t2 = ( MS_S32 )pdata[8 * 3];
9406*53ee8cc1Swenshuai.xi t3 = ( MS_S32 )pdata[8 * 1];
9407*53ee8cc1Swenshuai.xi
9408*53ee8cc1Swenshuai.xi a1 = t0 + t3;
9409*53ee8cc1Swenshuai.xi a2 = t1 + t2;
9410*53ee8cc1Swenshuai.xi a3 = t0 + t2;
9411*53ee8cc1Swenshuai.xi a4 = t1 + t3;
9412*53ee8cc1Swenshuai.xi a5 = (FIX_1_1758) * (a3 + a4);
9413*53ee8cc1Swenshuai.xi
9414*53ee8cc1Swenshuai.xi a1 = (-FIX_0_8999) * a1;
9415*53ee8cc1Swenshuai.xi a2 = (-FIX_2_5629) * a2;
9416*53ee8cc1Swenshuai.xi a3 = (-FIX_1_9615) * a3;
9417*53ee8cc1Swenshuai.xi a4 = (-FIX_0_3901) * a4;
9418*53ee8cc1Swenshuai.xi t0 = (FIX_0_2986) * t0;
9419*53ee8cc1Swenshuai.xi t1 = (FIX_2_0531) * t1;
9420*53ee8cc1Swenshuai.xi t2 = (FIX_3_0727) * t2;
9421*53ee8cc1Swenshuai.xi t3 = (FIX_1_5013) * t3;
9422*53ee8cc1Swenshuai.xi
9423*53ee8cc1Swenshuai.xi a3 += a5;
9424*53ee8cc1Swenshuai.xi a4 += a5;
9425*53ee8cc1Swenshuai.xi
9426*53ee8cc1Swenshuai.xi t0 += a1 + a3;
9427*53ee8cc1Swenshuai.xi t1 += a2 + a4;
9428*53ee8cc1Swenshuai.xi t2 += a2 + a3;
9429*53ee8cc1Swenshuai.xi t3 += a1 + a4;
9430*53ee8cc1Swenshuai.xi
9431*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t10 + t3, 13 + 2 + 3 ) + 128;
9432*53ee8cc1Swenshuai.xi clamp( i )
9433*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 0] = ( MS_U8 )i;
9434*53ee8cc1Swenshuai.xi
9435*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9436*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor== 3)
9437*53ee8cc1Swenshuai.xi {
9438*53ee8cc1Swenshuai.xi pdata++;
9439*53ee8cc1Swenshuai.xi Pdst_ptr++;
9440*53ee8cc1Swenshuai.xi continue;
9441*53ee8cc1Swenshuai.xi }
9442*53ee8cc1Swenshuai.xi #endif
9443*53ee8cc1Swenshuai.xi
9444*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t13 - t0, 13 + 2 + 3 ) + 128;
9445*53ee8cc1Swenshuai.xi clamp( i )
9446*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 4] = ( MS_U8 )i;
9447*53ee8cc1Swenshuai.xi
9448*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9449*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor== 2)
9450*53ee8cc1Swenshuai.xi {
9451*53ee8cc1Swenshuai.xi pdata++;
9452*53ee8cc1Swenshuai.xi Pdst_ptr++;
9453*53ee8cc1Swenshuai.xi continue;
9454*53ee8cc1Swenshuai.xi }
9455*53ee8cc1Swenshuai.xi #endif
9456*53ee8cc1Swenshuai.xi
9457*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t12 + t1, 13 + 2 + 3 ) + 128;
9458*53ee8cc1Swenshuai.xi clamp( i )
9459*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 2] = ( MS_U8 )i;
9460*53ee8cc1Swenshuai.xi
9461*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t11 - t2, 13 + 2 + 3 ) + 128;
9462*53ee8cc1Swenshuai.xi clamp( i )
9463*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 6] = ( MS_U8 )i;
9464*53ee8cc1Swenshuai.xi
9465*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9466*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor== 1)
9467*53ee8cc1Swenshuai.xi {
9468*53ee8cc1Swenshuai.xi pdata++;
9469*53ee8cc1Swenshuai.xi Pdst_ptr++;
9470*53ee8cc1Swenshuai.xi continue;
9471*53ee8cc1Swenshuai.xi }
9472*53ee8cc1Swenshuai.xi #endif
9473*53ee8cc1Swenshuai.xi
9474*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t11 + t2, 13 + 2 + 3 ) + 128;
9475*53ee8cc1Swenshuai.xi clamp( i )
9476*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 1] = ( MS_U8 )i;
9477*53ee8cc1Swenshuai.xi
9478*53ee8cc1Swenshuai.xi
9479*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t13 + t0, 13 + 2 + 3 ) + 128;
9480*53ee8cc1Swenshuai.xi clamp( i )
9481*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 3] = ( MS_U8 )i;
9482*53ee8cc1Swenshuai.xi
9483*53ee8cc1Swenshuai.xi
9484*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t12 - t1, 13 + 2 + 3 ) + 128;
9485*53ee8cc1Swenshuai.xi clamp( i )
9486*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 5] = ( MS_U8 )i;
9487*53ee8cc1Swenshuai.xi
9488*53ee8cc1Swenshuai.xi
9489*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t10 - t3, 13 + 2 + 3 ) + 128;
9490*53ee8cc1Swenshuai.xi clamp( i )
9491*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 7] = ( MS_U8 )i;
9492*53ee8cc1Swenshuai.xi
9493*53ee8cc1Swenshuai.xi pdata++;
9494*53ee8cc1Swenshuai.xi Pdst_ptr++;
9495*53ee8cc1Swenshuai.xi }
9496*53ee8cc1Swenshuai.xi }
9497*53ee8cc1Swenshuai.xi
msAPI_JPEG_Idct_CMYKConvert(void)9498*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_Idct_CMYKConvert(void)
9499*53ee8cc1Swenshuai.xi {
9500*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *Psrc_ptr = _ps16Block_seg[0];
9501*53ee8cc1Swenshuai.xi MS_U8 *Pdst_ptr = gpu8Sample_buf;
9502*53ee8cc1Swenshuai.xi MS_U8 *u8Start_Each_Block, *u8Start_Each_Row;
9503*53ee8cc1Swenshuai.xi MS_U32 u32_y_Blcok_Pos = 0, Max_Pixel_Per_Row;
9504*53ee8cc1Swenshuai.xi MS_S32 i;
9505*53ee8cc1Swenshuai.xi MS_U8 u8Row_in_block, k;
9506*53ee8cc1Swenshuai.xi MS_U16 u16Pixel_Per_Block_x = 8, u16Pixel_Per_Block_y = 8;
9507*53ee8cc1Swenshuai.xi MS_U16 u16Pixel_Per_Pack_row = 16, u16TotalBlock_Per_Row, u16ScaleDownStep = 1 << _u8ScaleDownFactor;
9508*53ee8cc1Swenshuai.xi
9509*53ee8cc1Swenshuai.xi u16TotalBlock_Per_Row = (_u32Max_blocks_per_row)/2;
9510*53ee8cc1Swenshuai.xi
9511*53ee8cc1Swenshuai.xi u16Pixel_Per_Pack_row = u16Pixel_Per_Pack_row >> _u8ScaleDownFactor;
9512*53ee8cc1Swenshuai.xi u16Pixel_Per_Block_x = u16Pixel_Per_Block_x/* >> _u8ScaleDownFactor*/;
9513*53ee8cc1Swenshuai.xi u16Pixel_Per_Block_y = u16Pixel_Per_Block_y >> _u8ScaleDownFactor;
9514*53ee8cc1Swenshuai.xi
9515*53ee8cc1Swenshuai.xi
9516*53ee8cc1Swenshuai.xi Max_Pixel_Per_Row = (u16TotalBlock_Per_Row*u16Pixel_Per_Block_x >> _u8ScaleDownFactor);
9517*53ee8cc1Swenshuai.xi
9518*53ee8cc1Swenshuai.xi //Get start position of each row
9519*53ee8cc1Swenshuai.xi u8Start_Each_Row = (u8Out_buf + (u32_Decode_Line*(Max_Pixel_Per_Row*u16Pixel_Per_Block_y)));
9520*53ee8cc1Swenshuai.xi
9521*53ee8cc1Swenshuai.xi for ( i = (MS_S32)_u32Max_blocks_per_row; i > 0;)
9522*53ee8cc1Swenshuai.xi {
9523*53ee8cc1Swenshuai.xi //===================GET Y1 BLOCKs=======================
9524*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9525*53ee8cc1Swenshuai.xi
9526*53ee8cc1Swenshuai.xi //Get start position of block
9527*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9528*53ee8cc1Swenshuai.xi
9529*53ee8cc1Swenshuai.xi //Write value to destination buffer
9530*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9531*53ee8cc1Swenshuai.xi {
9532*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9533*53ee8cc1Swenshuai.xi {
9534*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + (k*2) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9535*53ee8cc1Swenshuai.xi }
9536*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9537*53ee8cc1Swenshuai.xi }
9538*53ee8cc1Swenshuai.xi
9539*53ee8cc1Swenshuai.xi //Skip U. V block for 422 format
9540*53ee8cc1Swenshuai.xi Psrc_ptr += 256;
9541*53ee8cc1Swenshuai.xi Pdst_ptr += 256;
9542*53ee8cc1Swenshuai.xi i-=4;
9543*53ee8cc1Swenshuai.xi
9544*53ee8cc1Swenshuai.xi if(i == 0)
9545*53ee8cc1Swenshuai.xi {
9546*53ee8cc1Swenshuai.xi //Already decoded all blocks
9547*53ee8cc1Swenshuai.xi continue;
9548*53ee8cc1Swenshuai.xi }
9549*53ee8cc1Swenshuai.xi else if(i < 0)
9550*53ee8cc1Swenshuai.xi {
9551*53ee8cc1Swenshuai.xi printf("GET BLOCK NUMBER ERROR!\n");
9552*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
9553*53ee8cc1Swenshuai.xi return FALSE;
9554*53ee8cc1Swenshuai.xi }
9555*53ee8cc1Swenshuai.xi
9556*53ee8cc1Swenshuai.xi //Move y block position in a row
9557*53ee8cc1Swenshuai.xi u32_y_Blcok_Pos++;
9558*53ee8cc1Swenshuai.xi //===================GET Y2 BLOCKs=======================
9559*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9560*53ee8cc1Swenshuai.xi
9561*53ee8cc1Swenshuai.xi //Get start position of block
9562*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9563*53ee8cc1Swenshuai.xi
9564*53ee8cc1Swenshuai.xi //Write value to destination buffer
9565*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9566*53ee8cc1Swenshuai.xi {
9567*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9568*53ee8cc1Swenshuai.xi {
9569*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + (k*2) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9570*53ee8cc1Swenshuai.xi }
9571*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9572*53ee8cc1Swenshuai.xi }
9573*53ee8cc1Swenshuai.xi
9574*53ee8cc1Swenshuai.xi //Move idct data position
9575*53ee8cc1Swenshuai.xi Psrc_ptr += 64;
9576*53ee8cc1Swenshuai.xi Pdst_ptr += 64;
9577*53ee8cc1Swenshuai.xi i--;
9578*53ee8cc1Swenshuai.xi
9579*53ee8cc1Swenshuai.xi //Move y block position in a row, Reset position for U block
9580*53ee8cc1Swenshuai.xi u32_y_Blcok_Pos--;
9581*53ee8cc1Swenshuai.xi //===================GET U BLOCKs=======================
9582*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9583*53ee8cc1Swenshuai.xi
9584*53ee8cc1Swenshuai.xi //Get start position of block
9585*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9586*53ee8cc1Swenshuai.xi
9587*53ee8cc1Swenshuai.xi //Write value to destination buffer
9588*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9589*53ee8cc1Swenshuai.xi {
9590*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9591*53ee8cc1Swenshuai.xi {
9592*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + ((k*4) + 1) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9593*53ee8cc1Swenshuai.xi }
9594*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9595*53ee8cc1Swenshuai.xi }
9596*53ee8cc1Swenshuai.xi
9597*53ee8cc1Swenshuai.xi //Move idct data position
9598*53ee8cc1Swenshuai.xi Psrc_ptr += 64;
9599*53ee8cc1Swenshuai.xi Pdst_ptr += 64;
9600*53ee8cc1Swenshuai.xi i--;
9601*53ee8cc1Swenshuai.xi
9602*53ee8cc1Swenshuai.xi //===================GET V BLOCKs=======================
9603*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9604*53ee8cc1Swenshuai.xi
9605*53ee8cc1Swenshuai.xi //Get start position of block
9606*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9607*53ee8cc1Swenshuai.xi
9608*53ee8cc1Swenshuai.xi //Write value to destination buffer
9609*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9610*53ee8cc1Swenshuai.xi {
9611*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9612*53ee8cc1Swenshuai.xi {
9613*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + ((k*4) + 3) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9614*53ee8cc1Swenshuai.xi }
9615*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9616*53ee8cc1Swenshuai.xi }
9617*53ee8cc1Swenshuai.xi
9618*53ee8cc1Swenshuai.xi //Move idct data position
9619*53ee8cc1Swenshuai.xi Psrc_ptr += 128;
9620*53ee8cc1Swenshuai.xi Pdst_ptr += 128;
9621*53ee8cc1Swenshuai.xi i-=2;
9622*53ee8cc1Swenshuai.xi
9623*53ee8cc1Swenshuai.xi //Move y block position in a row, Reset position for U block
9624*53ee8cc1Swenshuai.xi u32_y_Blcok_Pos+=2;
9625*53ee8cc1Swenshuai.xi
9626*53ee8cc1Swenshuai.xi }
9627*53ee8cc1Swenshuai.xi
9628*53ee8cc1Swenshuai.xi u32_Decode_Line++;
9629*53ee8cc1Swenshuai.xi return TRUE;
9630*53ee8cc1Swenshuai.xi }
9631*53ee8cc1Swenshuai.xi
msAPI_JPEG_Idct_RGBConvert(void)9632*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_Idct_RGBConvert(void)
9633*53ee8cc1Swenshuai.xi {
9634*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *Psrc_ptr = _ps16Block_seg[0];
9635*53ee8cc1Swenshuai.xi MS_U8 *Pdst_ptr = gpu8Sample_buf;
9636*53ee8cc1Swenshuai.xi MS_U8 *u8Start_Each_Block, *u8Start_Each_Row;
9637*53ee8cc1Swenshuai.xi MS_U32 u32_y_Blcok_Pos = 0, Max_Pixel_Per_Row;
9638*53ee8cc1Swenshuai.xi MS_S32 i;
9639*53ee8cc1Swenshuai.xi MS_U8 u8Row_in_block, k;
9640*53ee8cc1Swenshuai.xi MS_U16 u16Pixel_Per_Block_x = 8, u16Pixel_Per_Block_y = 8;
9641*53ee8cc1Swenshuai.xi MS_U16 u16Pixel_Per_Pack_row = 16, u16TotalBlock_Per_Row, u16ScaleDownStep = 1 << _u8ScaleDownFactor;
9642*53ee8cc1Swenshuai.xi
9643*53ee8cc1Swenshuai.xi u16TotalBlock_Per_Row = (_u32Max_blocks_per_row*2)/3;
9644*53ee8cc1Swenshuai.xi
9645*53ee8cc1Swenshuai.xi u16Pixel_Per_Pack_row = u16Pixel_Per_Pack_row >> _u8ScaleDownFactor;
9646*53ee8cc1Swenshuai.xi u16Pixel_Per_Block_x = u16Pixel_Per_Block_x/* >> _u8ScaleDownFactor*/;
9647*53ee8cc1Swenshuai.xi u16Pixel_Per_Block_y = u16Pixel_Per_Block_y >> _u8ScaleDownFactor;
9648*53ee8cc1Swenshuai.xi
9649*53ee8cc1Swenshuai.xi
9650*53ee8cc1Swenshuai.xi Max_Pixel_Per_Row = (u16TotalBlock_Per_Row*u16Pixel_Per_Block_x >> _u8ScaleDownFactor);
9651*53ee8cc1Swenshuai.xi
9652*53ee8cc1Swenshuai.xi //Get start position of each row
9653*53ee8cc1Swenshuai.xi u8Start_Each_Row = (u8Out_buf + (u32_Decode_Line*(Max_Pixel_Per_Row*u16Pixel_Per_Block_y)));
9654*53ee8cc1Swenshuai.xi
9655*53ee8cc1Swenshuai.xi for ( i = (MS_S32)_u32Max_blocks_per_row; i > 0;)
9656*53ee8cc1Swenshuai.xi {
9657*53ee8cc1Swenshuai.xi
9658*53ee8cc1Swenshuai.xi //===================GET R BLOCKs========================
9659*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9660*53ee8cc1Swenshuai.xi
9661*53ee8cc1Swenshuai.xi //Get start position of block
9662*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9663*53ee8cc1Swenshuai.xi
9664*53ee8cc1Swenshuai.xi //Write value to destination buffer
9665*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9666*53ee8cc1Swenshuai.xi {
9667*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9668*53ee8cc1Swenshuai.xi {
9669*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + (k*2) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9670*53ee8cc1Swenshuai.xi }
9671*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9672*53ee8cc1Swenshuai.xi }
9673*53ee8cc1Swenshuai.xi
9674*53ee8cc1Swenshuai.xi //Skip U. V block for 422 format
9675*53ee8cc1Swenshuai.xi Psrc_ptr += 64;
9676*53ee8cc1Swenshuai.xi Pdst_ptr += 64;
9677*53ee8cc1Swenshuai.xi i--;
9678*53ee8cc1Swenshuai.xi
9679*53ee8cc1Swenshuai.xi //===================GET G BLOCKs=======================
9680*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9681*53ee8cc1Swenshuai.xi
9682*53ee8cc1Swenshuai.xi //Get start position of block
9683*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9684*53ee8cc1Swenshuai.xi //Write value to destination buffer
9685*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9686*53ee8cc1Swenshuai.xi {
9687*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9688*53ee8cc1Swenshuai.xi {
9689*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + ((k*4) + 1) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9690*53ee8cc1Swenshuai.xi }
9691*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9692*53ee8cc1Swenshuai.xi }
9693*53ee8cc1Swenshuai.xi
9694*53ee8cc1Swenshuai.xi //Move idct data position
9695*53ee8cc1Swenshuai.xi Psrc_ptr += 64;
9696*53ee8cc1Swenshuai.xi Pdst_ptr += 64;
9697*53ee8cc1Swenshuai.xi i--;
9698*53ee8cc1Swenshuai.xi
9699*53ee8cc1Swenshuai.xi //===================GET B BLOCKs=======================
9700*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9701*53ee8cc1Swenshuai.xi
9702*53ee8cc1Swenshuai.xi //Get start position of block
9703*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9704*53ee8cc1Swenshuai.xi //Write value to destination buffer
9705*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9706*53ee8cc1Swenshuai.xi {
9707*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9708*53ee8cc1Swenshuai.xi {
9709*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + ((k*4) + 3) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9710*53ee8cc1Swenshuai.xi }
9711*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9712*53ee8cc1Swenshuai.xi }
9713*53ee8cc1Swenshuai.xi
9714*53ee8cc1Swenshuai.xi //Move idct data position
9715*53ee8cc1Swenshuai.xi Psrc_ptr += 64;
9716*53ee8cc1Swenshuai.xi Pdst_ptr += 64;
9717*53ee8cc1Swenshuai.xi i--;
9718*53ee8cc1Swenshuai.xi
9719*53ee8cc1Swenshuai.xi if(i == 0)
9720*53ee8cc1Swenshuai.xi {
9721*53ee8cc1Swenshuai.xi //Already decoded all blocks
9722*53ee8cc1Swenshuai.xi continue;
9723*53ee8cc1Swenshuai.xi }
9724*53ee8cc1Swenshuai.xi else if(i < 0)
9725*53ee8cc1Swenshuai.xi {
9726*53ee8cc1Swenshuai.xi printf("GET BLOCK NUMBER ERROR!\n");
9727*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
9728*53ee8cc1Swenshuai.xi return FALSE;
9729*53ee8cc1Swenshuai.xi }
9730*53ee8cc1Swenshuai.xi
9731*53ee8cc1Swenshuai.xi //Move y block position in a row
9732*53ee8cc1Swenshuai.xi u32_y_Blcok_Pos++;
9733*53ee8cc1Swenshuai.xi //===================GET R BLOCKs=======================
9734*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9735*53ee8cc1Swenshuai.xi
9736*53ee8cc1Swenshuai.xi //Get start position of block
9737*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9738*53ee8cc1Swenshuai.xi //Write value to destination buffer
9739*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9740*53ee8cc1Swenshuai.xi {
9741*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9742*53ee8cc1Swenshuai.xi {
9743*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + (k*2) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9744*53ee8cc1Swenshuai.xi }
9745*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9746*53ee8cc1Swenshuai.xi }
9747*53ee8cc1Swenshuai.xi
9748*53ee8cc1Swenshuai.xi //Move idct data position
9749*53ee8cc1Swenshuai.xi Psrc_ptr += 192;
9750*53ee8cc1Swenshuai.xi Pdst_ptr += 192;
9751*53ee8cc1Swenshuai.xi i-=3;
9752*53ee8cc1Swenshuai.xi
9753*53ee8cc1Swenshuai.xi //Move y block position in a row, Reset position for U block
9754*53ee8cc1Swenshuai.xi u32_y_Blcok_Pos++;
9755*53ee8cc1Swenshuai.xi
9756*53ee8cc1Swenshuai.xi }
9757*53ee8cc1Swenshuai.xi
9758*53ee8cc1Swenshuai.xi u32_Decode_Line++;
9759*53ee8cc1Swenshuai.xi return TRUE;
9760*53ee8cc1Swenshuai.xi }
9761*53ee8cc1Swenshuai.xi
9762*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9763*53ee8cc1Swenshuai.xi // Performs a 2D IDCT over the entire row's coefficient buffer.
msAPI_JPEG_transform_row(void)9764*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_transform_row( void )
9765*53ee8cc1Swenshuai.xi {
9766*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Max block : %ld\n", _u32Max_blocks_per_row);
9767*53ee8cc1Swenshuai.xi
9768*53ee8cc1Swenshuai.xi switch ( gu8Scan_type )
9769*53ee8cc1Swenshuai.xi {
9770*53ee8cc1Swenshuai.xi case E_JPEG_CMYK:
9771*53ee8cc1Swenshuai.xi if(!msAPI_JPEG_Idct_CMYKConvert())
9772*53ee8cc1Swenshuai.xi return FALSE;
9773*53ee8cc1Swenshuai.xi break;
9774*53ee8cc1Swenshuai.xi case E_JPEG_RGB:
9775*53ee8cc1Swenshuai.xi if(!msAPI_JPEG_Idct_RGBConvert())
9776*53ee8cc1Swenshuai.xi return FALSE;
9777*53ee8cc1Swenshuai.xi break;
9778*53ee8cc1Swenshuai.xi default :
9779*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("System don`t support this format!\n");
9780*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
9781*53ee8cc1Swenshuai.xi return FALSE;
9782*53ee8cc1Swenshuai.xi break;
9783*53ee8cc1Swenshuai.xi }
9784*53ee8cc1Swenshuai.xi return TRUE;
9785*53ee8cc1Swenshuai.xi
9786*53ee8cc1Swenshuai.xi }
9787*53ee8cc1Swenshuai.xi
msAPI_JPEG_Baseline_Decode(void)9788*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_Result msAPI_JPEG_Baseline_Decode(void)
9789*53ee8cc1Swenshuai.xi {
9790*53ee8cc1Swenshuai.xi
9791*53ee8cc1Swenshuai.xi if(_bProgressive_flag==TRUE)
9792*53ee8cc1Swenshuai.xi return (E_JPEG_FAILED);
9793*53ee8cc1Swenshuai.xi
9794*53ee8cc1Swenshuai.xi if ( _u16Total_lines_left == 0 )
9795*53ee8cc1Swenshuai.xi {
9796*53ee8cc1Swenshuai.xi return ( E_JPEG_OKAY );
9797*53ee8cc1Swenshuai.xi }
9798*53ee8cc1Swenshuai.xi
9799*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
9800*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
9801*53ee8cc1Swenshuai.xi {
9802*53ee8cc1Swenshuai.xi return ( E_JPEG_FAILED );
9803*53ee8cc1Swenshuai.xi }
9804*53ee8cc1Swenshuai.xi #endif
9805*53ee8cc1Swenshuai.xi
9806*53ee8cc1Swenshuai.xi if( _u16Total_lines_left > 0 )
9807*53ee8cc1Swenshuai.xi {
9808*53ee8cc1Swenshuai.xi
9809*53ee8cc1Swenshuai.xi if(!msAPI_JPEG_decode_next_row())
9810*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
9811*53ee8cc1Swenshuai.xi
9812*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Max line num : %d\n",(_u16Total_lines_left));
9813*53ee8cc1Swenshuai.xi
9814*53ee8cc1Swenshuai.xi if(!msAPI_JPEG_transform_row()) //IDCT
9815*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
9816*53ee8cc1Swenshuai.xi
9817*53ee8cc1Swenshuai.xi _u16Total_lines_left -= gu8Max_mcu_y_size;
9818*53ee8cc1Swenshuai.xi }
9819*53ee8cc1Swenshuai.xi
9820*53ee8cc1Swenshuai.xi return (E_JPEG_DONE);
9821*53ee8cc1Swenshuai.xi }
9822*53ee8cc1Swenshuai.xi #endif //SW_JPD_RGB_CMYK
9823*53ee8cc1Swenshuai.xi
9824*53ee8cc1Swenshuai.xi
9825*53ee8cc1Swenshuai.xi
MApi_JPEG_DisableAddressConvert_OJPD(void)9826*53ee8cc1Swenshuai.xi void MApi_JPEG_DisableAddressConvert_OJPD(void)
9827*53ee8cc1Swenshuai.xi {
9828*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s\n", __FUNCTION__);
9829*53ee8cc1Swenshuai.xi __bIsMjpeg = FALSE;
9830*53ee8cc1Swenshuai.xi }
9831*53ee8cc1Swenshuai.xi
9832*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9833*53ee8cc1Swenshuai.xi /********************************************************************/
9834*53ee8cc1Swenshuai.xi ///Get the free memory for temporary usage.
9835*53ee8cc1Swenshuai.xi ///@param size \b IN indicate the size of wanted free memory
9836*53ee8cc1Swenshuai.xi ///@return the physical address of free memory
9837*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetFreeMemory_OJPD(MS_U32 size)9838*53ee8cc1Swenshuai.xi MS_PHYADDR MApi_JPEG_GetFreeMemory_OJPD(MS_U32 size)
9839*53ee8cc1Swenshuai.xi {
9840*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
9841*53ee8cc1Swenshuai.xi {
9842*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
9843*53ee8cc1Swenshuai.xi return 0;
9844*53ee8cc1Swenshuai.xi }
9845*53ee8cc1Swenshuai.xi
9846*53ee8cc1Swenshuai.xi if(_bProgressive_flag == TRUE)
9847*53ee8cc1Swenshuai.xi {
9848*53ee8cc1Swenshuai.xi return 0;
9849*53ee8cc1Swenshuai.xi }
9850*53ee8cc1Swenshuai.xi
9851*53ee8cc1Swenshuai.xi if(size > (INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE))
9852*53ee8cc1Swenshuai.xi {
9853*53ee8cc1Swenshuai.xi return 0;
9854*53ee8cc1Swenshuai.xi }
9855*53ee8cc1Swenshuai.xi
9856*53ee8cc1Swenshuai.xi INTERNAL_BUFFER_SIZE = INTERNAL_BUFFER_SIZE - size;
9857*53ee8cc1Swenshuai.xi
9858*53ee8cc1Swenshuai.xi return (MS_VA2PA((MS_U32)INTERNAL_BUFFER_ADDR) + INTERNAL_BUFFER_SIZE);
9859*53ee8cc1Swenshuai.xi }
9860*53ee8cc1Swenshuai.xi
9861*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9862*53ee8cc1Swenshuai.xi /********************************************************************/
9863*53ee8cc1Swenshuai.xi ///Get the data offset of JPEG file.
9864*53ee8cc1Swenshuai.xi ///@return the data offset of JPEG file
9865*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetDataOffset_OJPD(void)9866*53ee8cc1Swenshuai.xi MS_U32 MApi_JPEG_GetDataOffset_OJPD(void)
9867*53ee8cc1Swenshuai.xi {
9868*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
9869*53ee8cc1Swenshuai.xi {
9870*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
9871*53ee8cc1Swenshuai.xi return 0;
9872*53ee8cc1Swenshuai.xi }
9873*53ee8cc1Swenshuai.xi
9874*53ee8cc1Swenshuai.xi if(_bThumbnailAccessMode)
9875*53ee8cc1Swenshuai.xi {
9876*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: Thumbnail mode!!\n", __FUNCTION__);
9877*53ee8cc1Swenshuai.xi return 0;
9878*53ee8cc1Swenshuai.xi }
9879*53ee8cc1Swenshuai.xi
9880*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : u32DataOffset = 0x%lx\n", __FUNCTION__ , u32DataOffset);
9881*53ee8cc1Swenshuai.xi return u32DataOffset;
9882*53ee8cc1Swenshuai.xi }
9883*53ee8cc1Swenshuai.xi
9884*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9885*53ee8cc1Swenshuai.xi /********************************************************************/
9886*53ee8cc1Swenshuai.xi ///Get the sof marker offset of JPEG file.
9887*53ee8cc1Swenshuai.xi ///@return the sof marker offset of JPEG file
9888*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_GetSOFOffset_OJPD(void)9889*53ee8cc1Swenshuai.xi MS_U32 MApi_JPEG_GetSOFOffset_OJPD(void)
9890*53ee8cc1Swenshuai.xi {
9891*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
9892*53ee8cc1Swenshuai.xi {
9893*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
9894*53ee8cc1Swenshuai.xi return 0;
9895*53ee8cc1Swenshuai.xi }
9896*53ee8cc1Swenshuai.xi
9897*53ee8cc1Swenshuai.xi if(_bThumbnailAccessMode)
9898*53ee8cc1Swenshuai.xi {
9899*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: Thumbnail mode!!\n", __FUNCTION__);
9900*53ee8cc1Swenshuai.xi return 0;
9901*53ee8cc1Swenshuai.xi }
9902*53ee8cc1Swenshuai.xi
9903*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : u32SOFOffset = 0x%lx\n", __FUNCTION__ , u32SOFOffset);
9904*53ee8cc1Swenshuai.xi return u32SOFOffset;
9905*53ee8cc1Swenshuai.xi }
9906*53ee8cc1Swenshuai.xi
9907*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9908*53ee8cc1Swenshuai.xi /********************************************************************/
9909*53ee8cc1Swenshuai.xi ///Enable/Disable JPD CMYK support.
9910*53ee8cc1Swenshuai.xi ///@param bEnable \b IN enable/disable supporting JPD CMYK
9911*53ee8cc1Swenshuai.xi ///@return E_JPEG_OKAY/E_JPEG_FAILED
9912*53ee8cc1Swenshuai.xi ///Note: It need to be called before init. The default is JPD CMYK support.
9913*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SupportCMYK_OJPD(MS_BOOL bEnable)9914*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_SupportCMYK_OJPD(MS_BOOL bEnable)
9915*53ee8cc1Swenshuai.xi {
9916*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
9917*53ee8cc1Swenshuai.xi bEnableCMYK = bEnable;
9918*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
9919*53ee8cc1Swenshuai.xi #else
9920*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Not Support CMYK formant!!!\n");
9921*53ee8cc1Swenshuai.xi UNUSED(bEnable);
9922*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
9923*53ee8cc1Swenshuai.xi #endif
9924*53ee8cc1Swenshuai.xi }
9925*53ee8cc1Swenshuai.xi
9926*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9927*53ee8cc1Swenshuai.xi /********************************************************************/
9928*53ee8cc1Swenshuai.xi ///Enable/Disable JPD RGB support.
9929*53ee8cc1Swenshuai.xi ///@param bEnable \b IN enable/disable supporting JPD RGB
9930*53ee8cc1Swenshuai.xi ///@return E_JPEG_OKAY/E_JPEG_FAILED
9931*53ee8cc1Swenshuai.xi ///Note: It need to be called before init. The default is JPD RGB support.
9932*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SupportRGB_OJPD(MS_BOOL bEnable)9933*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_SupportRGB_OJPD(MS_BOOL bEnable)
9934*53ee8cc1Swenshuai.xi {
9935*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
9936*53ee8cc1Swenshuai.xi bEnableRGB = bEnable;
9937*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
9938*53ee8cc1Swenshuai.xi #else
9939*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Not Support RGB formant!!!\n");
9940*53ee8cc1Swenshuai.xi UNUSED(bEnable);
9941*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
9942*53ee8cc1Swenshuai.xi #endif
9943*53ee8cc1Swenshuai.xi }
9944*53ee8cc1Swenshuai.xi
9945*53ee8cc1Swenshuai.xi
9946*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
MApi_JPEG_IsMPOFormat_OJPD(void)9947*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_IsMPOFormat_OJPD( void )
9948*53ee8cc1Swenshuai.xi {
9949*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MApi_JPEG_IsMPOFormat=%d\n", bIsMPOFormat);
9950*53ee8cc1Swenshuai.xi return bIsMPOFormat;
9951*53ee8cc1Swenshuai.xi }
9952*53ee8cc1Swenshuai.xi
MApi_JPEG_GetMPOIndex_OJPD(JPEG_MPO_INDEX_INFO ** ppMPOIndex)9953*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_GetMPOIndex_OJPD(JPEG_MPO_INDEX_INFO **ppMPOIndex)
9954*53ee8cc1Swenshuai.xi {
9955*53ee8cc1Swenshuai.xi if(_stMPOIndex.num_of_image == 0xFFFFFFFF)
9956*53ee8cc1Swenshuai.xi {
9957*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("No MPO Index\n");
9958*53ee8cc1Swenshuai.xi return FALSE;
9959*53ee8cc1Swenshuai.xi }
9960*53ee8cc1Swenshuai.xi
9961*53ee8cc1Swenshuai.xi *ppMPOIndex = &_stMPOIndex;
9962*53ee8cc1Swenshuai.xi return TRUE;
9963*53ee8cc1Swenshuai.xi }
9964*53ee8cc1Swenshuai.xi
MApi_JPEG_GetMPOAttr_OJPD(MS_U32 image_no,JPEG_MPO_ATTRIBUTE_INFO ** ppMPOAttr)9965*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_GetMPOAttr_OJPD(MS_U32 image_no, JPEG_MPO_ATTRIBUTE_INFO **ppMPOAttr)
9966*53ee8cc1Swenshuai.xi {
9967*53ee8cc1Swenshuai.xi if((JPEG_MPO_MAX_SUPPORT_IMAGE < image_no)
9968*53ee8cc1Swenshuai.xi || (FALSE == _stMPOAttri[image_no - 1].used))
9969*53ee8cc1Swenshuai.xi {
9970*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("No MPO Attribute with image no. %ld\n", image_no);
9971*53ee8cc1Swenshuai.xi return FALSE;
9972*53ee8cc1Swenshuai.xi }
9973*53ee8cc1Swenshuai.xi
9974*53ee8cc1Swenshuai.xi *ppMPOAttr = &_stMPOAttri[image_no - 1];
9975*53ee8cc1Swenshuai.xi return TRUE;
9976*53ee8cc1Swenshuai.xi }
9977*53ee8cc1Swenshuai.xi
MApi_JPEG_DumpMPO_OJPD(void)9978*53ee8cc1Swenshuai.xi void MApi_JPEG_DumpMPO_OJPD(void)
9979*53ee8cc1Swenshuai.xi {
9980*53ee8cc1Swenshuai.xi MS_U32 i = 0;
9981*53ee8cc1Swenshuai.xi
9982*53ee8cc1Swenshuai.xi if(_stMPOIndex.num_of_image == 0xFFFFFFFF)
9983*53ee8cc1Swenshuai.xi {
9984*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("No MPO Index\n");
9985*53ee8cc1Swenshuai.xi return;
9986*53ee8cc1Swenshuai.xi }
9987*53ee8cc1Swenshuai.xi
9988*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("start_of_offset = %ld, num_of_image = %ld\n", _stMPOIndex.start_of_offset, _stMPOIndex.num_of_image);
9989*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
9990*53ee8cc1Swenshuai.xi {
9991*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mp_entry[%ld]:attribute = 0x%lx\n", i, _stMPOIndex.mp_entry[i].attribute);
9992*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mp_entry[%ld]:size = 0x%lx\n", i, _stMPOIndex.mp_entry[i].size);
9993*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mp_entry[%ld]:offset = 0x%lx\n", i, _stMPOIndex.mp_entry[i].offset);
9994*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mp_entry[%ld]:image1_no = 0x%x\n", i, _stMPOIndex.mp_entry[i].image1_no);
9995*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mp_entry[%ld]:image2_no = 0x%x\n", i, _stMPOIndex.mp_entry[i].image2_no);
9996*53ee8cc1Swenshuai.xi
9997*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:MPIndividualNum = 0x%lx\n", i, _stMPOAttri[i].MPIndividualNum);
9998*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOrientation = 0x%lx\n", i, _stMPOAttri[i].PanOrientation);
9999*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_H.numerator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_H.numerator);
10000*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_H.denominator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_H.denominator);
10001*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_V.numerator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_V.numerator);
10002*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_V.denominator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_V.denominator);
10003*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:BaseViewpointNum = 0x%lx\n", i, _stMPOAttri[i].BaseViewpointNum);
10004*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:ConvergenceAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].ConvergenceAngle.s_numerator);
10005*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:ConvergenceAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].ConvergenceAngle.s_denominator);
10006*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:BaselineLength.numerator = 0x%lx\n", i, _stMPOAttri[i].BaselineLength.numerator);
10007*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:BaselineLength.denominator = 0x%lx\n", i, _stMPOAttri[i].BaselineLength.denominator);
10008*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:VerticalDivergence.s_numerator = 0x%lx\n", i, _stMPOAttri[i].VerticalDivergence.s_numerator);
10009*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:VerticalDivergence.s_denominator = 0x%lx\n", i, _stMPOAttri[i].VerticalDivergence.s_denominator);
10010*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_X.s_numerator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_X.s_numerator);
10011*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_X.s_denominator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_X.s_denominator);
10012*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Y.s_numerator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Y.s_numerator);
10013*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Y.s_denominator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Y.s_denominator);
10014*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Z.s_numerator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Z.s_numerator);
10015*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Z.s_denominator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Z.s_denominator);
10016*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:YawAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].YawAngle.s_numerator);
10017*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:YawAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].YawAngle.s_denominator);
10018*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PitchAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].PitchAngle.s_numerator);
10019*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PitchAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].PitchAngle.s_denominator);
10020*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:RollAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].RollAngle.s_numerator);
10021*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:RollAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].RollAngle.s_denominator);
10022*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:used = 0x%d\n", i, _stMPOAttri[i].used);
10023*53ee8cc1Swenshuai.xi }
10024*53ee8cc1Swenshuai.xi return;
10025*53ee8cc1Swenshuai.xi }
10026*53ee8cc1Swenshuai.xi
MApi_JPEG_SetMPOBuffer_OJPD(MS_U32 read_offset,MS_U32 output_start)10027*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_SetMPOBuffer_OJPD(MS_U32 read_offset, MS_U32 output_start)
10028*53ee8cc1Swenshuai.xi {
10029*53ee8cc1Swenshuai.xi read_offset = MS_PA2KSEG1((MS_U32)read_offset);// | AEON_NON_CACHE_MASK;
10030*53ee8cc1Swenshuai.xi output_start = MS_PA2KSEG1((MS_U32)output_start);// | AEON_NON_CACHE_MASK;
10031*53ee8cc1Swenshuai.xi
10032*53ee8cc1Swenshuai.xi if((read_offset < MRC_BUFFER_ADDR)
10033*53ee8cc1Swenshuai.xi || (read_offset > (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE)))
10034*53ee8cc1Swenshuai.xi {
10035*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_SetMPOBuffer, read_offset invalid\n");
10036*53ee8cc1Swenshuai.xi return FALSE;
10037*53ee8cc1Swenshuai.xi }
10038*53ee8cc1Swenshuai.xi
10039*53ee8cc1Swenshuai.xi if(read_offset > (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE/2))
10040*53ee8cc1Swenshuai.xi {
10041*53ee8cc1Swenshuai.xi mpo_load_data = FALSE;
10042*53ee8cc1Swenshuai.xi }
10043*53ee8cc1Swenshuai.xi
10044*53ee8cc1Swenshuai.xi if(output_start < MWC_BUFFER_ADDR)
10045*53ee8cc1Swenshuai.xi {
10046*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_SetMPOBuffer, output_start invalid\n");
10047*53ee8cc1Swenshuai.xi return FALSE;
10048*53ee8cc1Swenshuai.xi }
10049*53ee8cc1Swenshuai.xi
10050*53ee8cc1Swenshuai.xi _pu8In_buf_MPO_ofs = (MS_U8*)read_offset;
10051*53ee8cc1Swenshuai.xi _u32In_buf_MPO_left = (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE) - read_offset;
10052*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);
10053*53ee8cc1Swenshuai.xi MWC_BUFFER_ADDR = output_start;
10054*53ee8cc1Swenshuai.xi return TRUE;
10055*53ee8cc1Swenshuai.xi }
10056*53ee8cc1Swenshuai.xi
10057*53ee8cc1Swenshuai.xi /********************************************************************/
10058*53ee8cc1Swenshuai.xi /// Set Max decoding resolution for MPO
10059*53ee8cc1Swenshuai.xi ///@param -u16Width \b IN : indicate max decoding width
10060*53ee8cc1Swenshuai.xi ///@param -u16Height \b IN : indicate max decoding height
10061*53ee8cc1Swenshuai.xi ///@return None
10062*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SetMPOMaxDecodeResolution_OJPD(MS_U16 u16Width,MS_U16 u16Height)10063*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMPOMaxDecodeResolution_OJPD(MS_U16 u16Width, MS_U16 u16Height)
10064*53ee8cc1Swenshuai.xi {
10065*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: Width = %d, Height = %d\n", __FUNCTION__, u16Width, u16Height);
10066*53ee8cc1Swenshuai.xi JPEG_MPO_MAX_WIDTH = u16Width;
10067*53ee8cc1Swenshuai.xi JPEG_MPO_MAX_HEIGHT = u16Height;
10068*53ee8cc1Swenshuai.xi return;
10069*53ee8cc1Swenshuai.xi }
10070*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
10071*53ee8cc1Swenshuai.xi /********************************************************************/
10072*53ee8cc1Swenshuai.xi /// Set Max decoding resolution of Progressive MPO
10073*53ee8cc1Swenshuai.xi ///@param -u16ProWidth \b IN : indicate max decoding width
10074*53ee8cc1Swenshuai.xi ///@param -u16ProHeight \b IN : indicate max decoding height
10075*53ee8cc1Swenshuai.xi ///@return None
10076*53ee8cc1Swenshuai.xi /********************************************************************/
MApi_JPEG_SetMPOProMaxDecodeResolution_OJPD(MS_U16 u16ProWidth,MS_U16 u16ProHeight)10077*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMPOProMaxDecodeResolution_OJPD(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
10078*53ee8cc1Swenshuai.xi {
10079*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: ProWidth = %d, ProHeight = %d\n", __FUNCTION__, u16ProWidth, u16ProHeight);
10080*53ee8cc1Swenshuai.xi JPEG_MPO_PRO_MAX_WIDTH = u16ProWidth;
10081*53ee8cc1Swenshuai.xi JPEG_MPO_PRO_MAX_HEIGHT = u16ProHeight;
10082*53ee8cc1Swenshuai.xi return;
10083*53ee8cc1Swenshuai.xi }
10084*53ee8cc1Swenshuai.xi
10085*53ee8cc1Swenshuai.xi #endif
10086*53ee8cc1Swenshuai.xi #endif
10087