1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi // Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi // No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi // modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi // supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi // Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi // Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi // obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi // such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi // MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi // confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi // third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi // kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi // without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi // intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi // and in conformity with any international standard. You agree to waive any
38*53ee8cc1Swenshuai.xi // claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi // incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi // In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi // consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi // revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi // You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi // even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi // request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi // parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi // services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi // MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi // ("Services").
52*53ee8cc1Swenshuai.xi // You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi // writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi // disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi // or otherwise:
58*53ee8cc1Swenshuai.xi // (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi // mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi // (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi // including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi // of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi // (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi // of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi // Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi // settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi // Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi // with the said Rules.
72*53ee8cc1Swenshuai.xi // The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi // be English.
74*53ee8cc1Swenshuai.xi // The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file apiJPEG.c
98*53ee8cc1Swenshuai.xi /// @brief JPEG API
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi
102*53ee8cc1Swenshuai.xi
103*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
104*53ee8cc1Swenshuai.xi // Include Files
105*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
106*53ee8cc1Swenshuai.xi #ifndef CMODEL
107*53ee8cc1Swenshuai.xi #include "MsCommon.h"
108*53ee8cc1Swenshuai.xi #include "MsVersion.h"
109*53ee8cc1Swenshuai.xi #include "MsOS.h"
110*53ee8cc1Swenshuai.xi #include "asmCPU.h"
111*53ee8cc1Swenshuai.xi #include "jpeg_def.h"
112*53ee8cc1Swenshuai.xi #include "drvJPD.h"
113*53ee8cc1Swenshuai.xi //#include "Utl.h"
114*53ee8cc1Swenshuai.xi ////#include "drvUART.h"
115*53ee8cc1Swenshuai.xi #else
116*53ee8cc1Swenshuai.xi #include "jpeg_cmodel_def.h"
117*53ee8cc1Swenshuai.xi #include "jpeg_cmodel.h"
118*53ee8cc1Swenshuai.xi #endif
119*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
120*53ee8cc1Swenshuai.xi #include <setjmp.h>
121*53ee8cc1Swenshuai.xi #endif
122*53ee8cc1Swenshuai.xi #include "jpeg_memory.h"
123*53ee8cc1Swenshuai.xi #include "apiJPEG.h"
124*53ee8cc1Swenshuai.xi
125*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
126*53ee8cc1Swenshuai.xi #include <linux/string.h>
127*53ee8cc1Swenshuai.xi #else
128*53ee8cc1Swenshuai.xi #include <string.h>
129*53ee8cc1Swenshuai.xi #endif
130*53ee8cc1Swenshuai.xi
131*53ee8cc1Swenshuai.xi #include "utopia.h"
132*53ee8cc1Swenshuai.xi #include "apiJPEG_priv.h"
133*53ee8cc1Swenshuai.xi #include "apiJPEG_v2.h"
134*53ee8cc1Swenshuai.xi void* pInstantJPD = NULL;
135*53ee8cc1Swenshuai.xi
136*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
137*53ee8cc1Swenshuai.xi // Local Compiler Options
138*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
139*53ee8cc1Swenshuai.xi // PS. CMODEL always supports progressive mode decode
140*53ee8cc1Swenshuai.xi #define SUPPORT_PROGRESSIVE_MODE 1
141*53ee8cc1Swenshuai.xi
142*53ee8cc1Swenshuai.xi #define ENABLE_JPEG_NO_SIZE_LOWER_BOUND 0
143*53ee8cc1Swenshuai.xi
144*53ee8cc1Swenshuai.xi #define SUPPORT_PROGRESSIVE_SCLAEDOWN_MODE 1 //CL82399
145*53ee8cc1Swenshuai.xi
146*53ee8cc1Swenshuai.xi #define SW_OPTIMIZE 0
147*53ee8cc1Swenshuai.xi #define SW_JPD_RGB_CMYK 1
148*53ee8cc1Swenshuai.xi #ifdef CMODEL
149*53ee8cc1Swenshuai.xi // This funcion is not ready in CMODEL
150*53ee8cc1Swenshuai.xi #undef SW_JPD_RGB_CMYK
151*53ee8cc1Swenshuai.xi #define SW_JPD_RGB_CMYK 0
152*53ee8cc1Swenshuai.xi #endif
153*53ee8cc1Swenshuai.xi
154*53ee8cc1Swenshuai.xi /* Need to check whether OS support jump API or not */
155*53ee8cc1Swenshuai.xi #ifdef CMODEL
156*53ee8cc1Swenshuai.xi #define JPD_LONGJUMP_SUPPORT
157*53ee8cc1Swenshuai.xi #endif
158*53ee8cc1Swenshuai.xi #if 0
159*53ee8cc1Swenshuai.xi #if !defined(MSOS_TYPE_ECOS)
160*53ee8cc1Swenshuai.xi #define USE_LIBC
161*53ee8cc1Swenshuai.xi #endif
162*53ee8cc1Swenshuai.xi #ifndef USE_LIBC
163*53ee8cc1Swenshuai.xi #define jmp_buf MS_U32
164*53ee8cc1Swenshuai.xi #define setjmp(jmp_state) FALSE
165*53ee8cc1Swenshuai.xi #define longjmp(jmp_state, status)
166*53ee8cc1Swenshuai.xi #endif
167*53ee8cc1Swenshuai.xi #endif
168*53ee8cc1Swenshuai.xi
169*53ee8cc1Swenshuai.xi #define PRINT_JPD_DECODE_TIME 0
170*53ee8cc1Swenshuai.xi #define LOG_DATA_TO_USB 0
171*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
172*53ee8cc1Swenshuai.xi // Local Defines
173*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
174*53ee8cc1Swenshuai.xi // Max. allocated blocks
175*53ee8cc1Swenshuai.xi #ifdef CMODEL
176*53ee8cc1Swenshuai.xi #define JPEG_MAXBLOCKS 100
177*53ee8cc1Swenshuai.xi #else
178*53ee8cc1Swenshuai.xi #define JPEG_MAXBLOCKS 50
179*53ee8cc1Swenshuai.xi #endif
180*53ee8cc1Swenshuai.xi
181*53ee8cc1Swenshuai.xi #define DEFAULT_DECODE_TIMEOUT 100
182*53ee8cc1Swenshuai.xi
183*53ee8cc1Swenshuai.xi //fractional bits in scale factors
184*53ee8cc1Swenshuai.xi #define IFAST_SCALE_BITS 2
185*53ee8cc1Swenshuai.xi
186*53ee8cc1Swenshuai.xi #define JPEG_TIFF_SOI_OFFSET 0x0201
187*53ee8cc1Swenshuai.xi #define JPEG_TIFF_JPEG_IMG_BYTES 0x0202
188*53ee8cc1Swenshuai.xi
189*53ee8cc1Swenshuai.xi #define JPEG_TIFF_BIG_ENDIAN 0x4D4D
190*53ee8cc1Swenshuai.xi #define JPEG_TIFF_LITTLE_ENDIAN 0x4949
191*53ee8cc1Swenshuai.xi
192*53ee8cc1Swenshuai.xi //EXIF Tag
193*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_MANUFACTURER 0x010F
194*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_MODEL 0x0110
195*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_ORIENTATION 0x0112
196*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_DATETIME_MOD 0x0132
197*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_IFD_POINTER 0x8769
198*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_EXPOSURE_PROGRAM 0x8822
199*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_ISO_SPEED_RATING 0x8827
200*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_DATETIME_ORI 0x9003
201*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_EXPOSURE_TIME 0x829A
202*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_F_NUMBER 0x829D
203*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_SHUTTER_SPEED 0x9201
204*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_APERTURE 0x9202
205*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_EXPOSURE_BIAS 0x9204
206*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_FLASH 0x9209
207*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_FOCAL_LENGTH 0x920A
208*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_IMAGE_WIDTH 0xA002
209*53ee8cc1Swenshuai.xi #define JPEG_EXIF_TAG_IMAGE_HEIGHT 0xA003
210*53ee8cc1Swenshuai.xi
211*53ee8cc1Swenshuai.xi #define JPEG_MANUFACTURER_SIZE 32
212*53ee8cc1Swenshuai.xi #define JPEG_MODEL_SIZE 128
213*53ee8cc1Swenshuai.xi
214*53ee8cc1Swenshuai.xi #define MIN_READBUFFER_SIZE 128
215*53ee8cc1Swenshuai.xi
216*53ee8cc1Swenshuai.xi #define MRC_BUFFER_ADDR _u32ReadBufferAddr
217*53ee8cc1Swenshuai.xi #define MRC_BUFFER_SIZE _u32ReadBufferSize
218*53ee8cc1Swenshuai.xi #define MWC_BUFFER_ADDR _u32WriteBufferAddr
219*53ee8cc1Swenshuai.xi #define MWC_BUFFER_SIZE _u32WriteBufferSize
220*53ee8cc1Swenshuai.xi #define INTERNAL_BUFFER_ADDR _u32InternalBufferAddr
221*53ee8cc1Swenshuai.xi #define INTERNAL_BUFFER_SIZE _u32InternalBufferSize
222*53ee8cc1Swenshuai.xi
223*53ee8cc1Swenshuai.xi #define HUFF_EXTEND_TBL(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
224*53ee8cc1Swenshuai.xi
225*53ee8cc1Swenshuai.xi #define HUFF_EXTEND_P(x,s) HUFF_EXTEND_TBL(x,s)
226*53ee8cc1Swenshuai.xi
227*53ee8cc1Swenshuai.xi /* EXIF parsing section */
228*53ee8cc1Swenshuai.xi #define EndianChangeL(_x) \
229*53ee8cc1Swenshuai.xi ((((_x) & 0xff) << 24) | (((_x) & 0xff00) << 8) | (((_x) & 0xff0000) >> 8) | (((_x) & 0xff000000) >> 24))
230*53ee8cc1Swenshuai.xi
231*53ee8cc1Swenshuai.xi #define EndianChangeS(_x) \
232*53ee8cc1Swenshuai.xi ((((_x) & 0xff) << 8) | (((_x) & 0xff00) >> 8))
233*53ee8cc1Swenshuai.xi
234*53ee8cc1Swenshuai.xi #define JPEG_TAG_EXIF EndianChangeL(0x45786966)
235*53ee8cc1Swenshuai.xi
236*53ee8cc1Swenshuai.xi #define JPEG_ABS(x) (((x)>=0)?(x):(-(x)))
237*53ee8cc1Swenshuai.xi
238*53ee8cc1Swenshuai.xi
239*53ee8cc1Swenshuai.xi static APP0_Unit App0_Unit_Data;
240*53ee8cc1Swenshuai.xi
241*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
242*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
243*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16PaddingMcuNumber;
244*53ee8cc1Swenshuai.xi
245*53ee8cc1Swenshuai.xi MS_U32 u32_Decode_Line;
246*53ee8cc1Swenshuai.xi MS_U8 *u8Out_buf;
247*53ee8cc1Swenshuai.xi //#define DCTSIZE 8
248*53ee8cc1Swenshuai.xi //#define DCTELEM int
249*53ee8cc1Swenshuai.xi #define PASS1_BITS 2
250*53ee8cc1Swenshuai.xi #define FIX_3_0727 ((MS_S32)25172) /* FIX(3.072711026) */
251*53ee8cc1Swenshuai.xi #define FIX_2_5629 ((MS_S32)20995) /* FIX(2.562915447) */
252*53ee8cc1Swenshuai.xi #define FIX_2_0531 ((MS_S32)16819) /* FIX(2.053119869) */
253*53ee8cc1Swenshuai.xi #define FIX_1_9615 ((MS_S32)16069) /* FIX(1.961570560) */
254*53ee8cc1Swenshuai.xi #define FIX_1_8477 ((MS_S32)15137) /* FIX(1.847759065) */
255*53ee8cc1Swenshuai.xi #define FIX_1_5013 ((MS_S32)12299) /* FIX(1.501321110) */
256*53ee8cc1Swenshuai.xi #define FIX_1_1758 ((MS_S32)9633) /* FIX(1.175875602) */
257*53ee8cc1Swenshuai.xi #define FIX_0_8999 ((MS_S32)7373) /* FIX(0.899976223) */
258*53ee8cc1Swenshuai.xi #define FIX_0_7653 ((MS_S32)6270) /* FIX(0.765366865) */
259*53ee8cc1Swenshuai.xi #define FIX_0_5411 ((MS_S32)4433) /* FIX(0.541196100) */
260*53ee8cc1Swenshuai.xi #define FIX_0_3901 ((MS_S32)3196) /* FIX(0.390180644) */
261*53ee8cc1Swenshuai.xi #define FIX_0_2986 ((MS_S32)2446) /* FIX(0.298631336) */
262*53ee8cc1Swenshuai.xi #define SCALE_DONE ((MS_S32) 1)
263*53ee8cc1Swenshuai.xi #define DESCALE(a,m) (((a) + (SCALE_DONE << ((m)-1))) >> (m))
264*53ee8cc1Swenshuai.xi #define clamp(i) if (i & 0xFF00) i = (((~i) >> 15) & 0xFF);
265*53ee8cc1Swenshuai.xi #define SCALEBITS 16
266*53ee8cc1Swenshuai.xi #define ONE_HALF ((MS_S32) 1 << (SCALEBITS-1))
267*53ee8cc1Swenshuai.xi #define FIX(x) ((MS_S32) ((x) * (1L<<SCALEBITS) + 0.5))
268*53ee8cc1Swenshuai.xi
269*53ee8cc1Swenshuai.xi
270*53ee8cc1Swenshuai.xi #define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
271*53ee8cc1Swenshuai.xi
272*53ee8cc1Swenshuai.xi #ifdef CMODEL
273*53ee8cc1Swenshuai.xi // Same as drvJPD.h
274*53ee8cc1Swenshuai.xi // JPD Downscale Ratio
275*53ee8cc1Swenshuai.xi // Bellows are 1, 1/2, 1/4 and 1/8 in order
276*53ee8cc1Swenshuai.xi typedef enum
277*53ee8cc1Swenshuai.xi {
278*53ee8cc1Swenshuai.xi E_JPD_DOWNSCALE_ORG = 0x00
279*53ee8cc1Swenshuai.xi , E_JPD_DOWNSCALE_HALF = 0x01
280*53ee8cc1Swenshuai.xi , E_JPD_DOWNSCALE_FOURTH = 0x02
281*53ee8cc1Swenshuai.xi , E_JPD_DOWNSCALE_EIGHTH = 0x03
282*53ee8cc1Swenshuai.xi } JPD_DownScale;
283*53ee8cc1Swenshuai.xi #endif
284*53ee8cc1Swenshuai.xi #endif
285*53ee8cc1Swenshuai.xi
286*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
287*53ee8cc1Swenshuai.xi FILE *logBinfp;
288*53ee8cc1Swenshuai.xi
289*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_MSG(format, args...) do{if(logBinfp) fprintf(logBinfp, format, ##args);}while(0)
290*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_ERR(format, args...) do{if(logBinfp) fprintf(logBinfp, format, ##args);}while(0)
291*53ee8cc1Swenshuai.xi #else
292*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_MSG(format, args...) do{if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) printf(format, ##args);}while(0)
293*53ee8cc1Swenshuai.xi #define JPEG_DEBUG_API_ERR(format, args...) do{if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) printf(format, ##args);}while(0)
294*53ee8cc1Swenshuai.xi #endif
295*53ee8cc1Swenshuai.xi #define printf_red(args...) do{ printf("\033[1;31m"); printf(args); printf("\033[m"); }while(0)
296*53ee8cc1Swenshuai.xi #define UTOPIA_20_DBG(args...) //do{ printf("\033[1;31m"); printf(args); printf("\033[m"); }while(0)
297*53ee8cc1Swenshuai.xi
298*53ee8cc1Swenshuai.xi #define JPEG_OVER_BUFFER_RET(addr, buf_addr, buf_size) \
299*53ee8cc1Swenshuai.xi do \
300*53ee8cc1Swenshuai.xi { \
301*53ee8cc1Swenshuai.xi if(((MS_U32)(addr) < (MS_U32)(buf_addr)) \
302*53ee8cc1Swenshuai.xi || ((MS_U32)(addr) >= ((MS_U32)(buf_addr) + (MS_U32)(buf_size)))) \
303*53ee8cc1Swenshuai.xi { \
304*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d] invalid address 0x%lx\n", __FUNCTION__, __LINE__, (MS_U32)(addr)); \
305*53ee8cc1Swenshuai.xi return FALSE; \
306*53ee8cc1Swenshuai.xi } \
307*53ee8cc1Swenshuai.xi } \
308*53ee8cc1Swenshuai.xi while(0)
309*53ee8cc1Swenshuai.xi
310*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
311*53ee8cc1Swenshuai.xi // Local Structures
312*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
313*53ee8cc1Swenshuai.xi //JPEG header marker id
314*53ee8cc1Swenshuai.xi typedef enum
315*53ee8cc1Swenshuai.xi {
316*53ee8cc1Swenshuai.xi E_JPEG_SOF0 = 0xC0
317*53ee8cc1Swenshuai.xi , E_JPEG_SOF1 = 0xC1
318*53ee8cc1Swenshuai.xi , E_JPEG_SOF2 = 0xC2
319*53ee8cc1Swenshuai.xi , E_JPEG_SOF3 = 0xC3
320*53ee8cc1Swenshuai.xi , E_JPEG_SOF5 = 0xC5
321*53ee8cc1Swenshuai.xi , E_JPEG_SOF6 = 0xC6
322*53ee8cc1Swenshuai.xi , E_JPEG_SOF7 = 0xC7
323*53ee8cc1Swenshuai.xi , E_JPEG_JPG = 0xC8
324*53ee8cc1Swenshuai.xi , E_JPEG_SOF9 = 0xC9
325*53ee8cc1Swenshuai.xi , E_JPEG_SOF10 = 0xCA
326*53ee8cc1Swenshuai.xi , E_JPEG_SOF11 = 0xCB
327*53ee8cc1Swenshuai.xi , E_JPEG_SOF13 = 0xCD
328*53ee8cc1Swenshuai.xi , E_JPEG_SOF14 = 0xCE
329*53ee8cc1Swenshuai.xi , E_JPEG_SOF15 = 0xCF
330*53ee8cc1Swenshuai.xi , E_JPEG_DHT = 0xC4
331*53ee8cc1Swenshuai.xi , E_JPEG_DAC = 0xCC
332*53ee8cc1Swenshuai.xi , E_JPEG_RST0 = 0xD0
333*53ee8cc1Swenshuai.xi , E_JPEG_RST1 = 0xD1
334*53ee8cc1Swenshuai.xi , E_JPEG_RST2 = 0xD2
335*53ee8cc1Swenshuai.xi , E_JPEG_RST3 = 0xD3
336*53ee8cc1Swenshuai.xi , E_JPEG_RST4 = 0xD4
337*53ee8cc1Swenshuai.xi , E_JPEG_RST5 = 0xD5
338*53ee8cc1Swenshuai.xi , E_JPEG_RST6 = 0xD6
339*53ee8cc1Swenshuai.xi , E_JPEG_RST7 = 0xD7
340*53ee8cc1Swenshuai.xi , E_JPEG_SOI = 0xD8
341*53ee8cc1Swenshuai.xi , E_JPEG_EOI = 0xD9
342*53ee8cc1Swenshuai.xi , E_JPEG_SOS = 0xDA
343*53ee8cc1Swenshuai.xi , E_JPEG_DQT = 0xDB
344*53ee8cc1Swenshuai.xi , E_JPEG_DNL = 0xDC
345*53ee8cc1Swenshuai.xi , E_JPEG_DRI = 0xDD
346*53ee8cc1Swenshuai.xi , E_JPEG_DHP = 0xDE
347*53ee8cc1Swenshuai.xi , E_JPEG_EXP = 0xDF
348*53ee8cc1Swenshuai.xi , E_JPEG_APP0 = 0xE0
349*53ee8cc1Swenshuai.xi , E_JPEG_APP1 = 0xE1
350*53ee8cc1Swenshuai.xi , E_JPEG_APP2 = 0xE2
351*53ee8cc1Swenshuai.xi , E_JPEG_APP3 = 0xE3
352*53ee8cc1Swenshuai.xi , E_JPEG_APP4 = 0xE4
353*53ee8cc1Swenshuai.xi , E_JPEG_APP5 = 0xE5
354*53ee8cc1Swenshuai.xi , E_JPEG_APP6 = 0xE6
355*53ee8cc1Swenshuai.xi , E_JPEG_APP7 = 0xE7
356*53ee8cc1Swenshuai.xi , E_JPEG_APP8 = 0xE8
357*53ee8cc1Swenshuai.xi , E_JPEG_APP9 = 0xE9
358*53ee8cc1Swenshuai.xi , E_JPEG_APP10 = 0xEA
359*53ee8cc1Swenshuai.xi , E_JPEG_APP11 = 0xEB
360*53ee8cc1Swenshuai.xi , E_JPEG_APP12 = 0xEC
361*53ee8cc1Swenshuai.xi , E_JPEG_APP13 = 0xED
362*53ee8cc1Swenshuai.xi , E_JPEG_APP14 = 0xEE
363*53ee8cc1Swenshuai.xi , E_JPEG_APP15 = 0xEF
364*53ee8cc1Swenshuai.xi , E_JPEG_JPG0 = 0xF0
365*53ee8cc1Swenshuai.xi , E_JPEG_JPG1 = 0xF1
366*53ee8cc1Swenshuai.xi , E_JPEG_JPG2 = 0xF2
367*53ee8cc1Swenshuai.xi , E_JPEG_JPG3 = 0xF3
368*53ee8cc1Swenshuai.xi , E_JPEG_JPG4 = 0xF4
369*53ee8cc1Swenshuai.xi , E_JPEG_JPG5 = 0xF5
370*53ee8cc1Swenshuai.xi , E_JPEG_JPG6 = 0xF6
371*53ee8cc1Swenshuai.xi , E_JPEG_JPG7 = 0xF7
372*53ee8cc1Swenshuai.xi , E_JPEG_JPG8 = 0xF8
373*53ee8cc1Swenshuai.xi , E_JPEG_JPG9 = 0xF9
374*53ee8cc1Swenshuai.xi , E_JPEG_JPG10 = 0xFA
375*53ee8cc1Swenshuai.xi , E_JPEG_JPG11 = 0xFB
376*53ee8cc1Swenshuai.xi , E_JPEG_JPG12 = 0xFC
377*53ee8cc1Swenshuai.xi , E_JPEG_JPG13 = 0xFD
378*53ee8cc1Swenshuai.xi , E_JPEG_COM = 0xFE
379*53ee8cc1Swenshuai.xi , E_JPEG_TEM = 0x01
380*53ee8cc1Swenshuai.xi , E_JPEG_ERROR = 0x100
381*53ee8cc1Swenshuai.xi } JPEG_HdrMarker;
382*53ee8cc1Swenshuai.xi
383*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
384*53ee8cc1Swenshuai.xi typedef enum
385*53ee8cc1Swenshuai.xi {
386*53ee8cc1Swenshuai.xi E_RLE_DC = 0,
387*53ee8cc1Swenshuai.xi E_RLE_AC,
388*53ee8cc1Swenshuai.xi E_RLE_ZRL,
389*53ee8cc1Swenshuai.xi E_RLE_EOB,
390*53ee8cc1Swenshuai.xi } JPEG_RLESymbol;
391*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
392*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Name: JPEG_CoeffBuf
393*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Description: The info of coefficient for JPEG decode
394*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
395*53ee8cc1Swenshuai.xi typedef struct
396*53ee8cc1Swenshuai.xi {
397*53ee8cc1Swenshuai.xi MS_U8 *pu8Data; ///<data of coefficient of DC, AC
398*53ee8cc1Swenshuai.xi MS_U16 u16Block_num_x; ///<the number of block for width
399*53ee8cc1Swenshuai.xi MS_U16 u16Block_num_y; ///<the number of block for height
400*53ee8cc1Swenshuai.xi MS_U16 u16Block_size; ///<block size
401*53ee8cc1Swenshuai.xi MS_U8 u8Block_len_x; ///<The width of block
402*53ee8cc1Swenshuai.xi MS_U8 u8Block_len_y; ///<The height of block
403*53ee8cc1Swenshuai.xi } JPEG_CoeffBuf, *PJPEG_CoeffBuf;
404*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
405*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Name: JPEG_SVLD
406*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Description: The info of SVLD for JPEG decode
407*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
408*53ee8cc1Swenshuai.xi typedef struct
409*53ee8cc1Swenshuai.xi {
410*53ee8cc1Swenshuai.xi union
411*53ee8cc1Swenshuai.xi {
412*53ee8cc1Swenshuai.xi struct
413*53ee8cc1Swenshuai.xi {
414*53ee8cc1Swenshuai.xi MS_U32 amp :11; ///<The amplitude of value of VLI
415*53ee8cc1Swenshuai.xi MS_U32 sign :1; ///<The sign of value of VLI
416*53ee8cc1Swenshuai.xi MS_U32 run :4; ///<run value
417*53ee8cc1Swenshuai.xi MS_U32 sym_type :2; ///<symbol type
418*53ee8cc1Swenshuai.xi MS_U32 blk_type :2; ///<YUV type
419*53ee8cc1Swenshuai.xi MS_U32 EOP :1; ///<End of picture
420*53ee8cc1Swenshuai.xi MS_U32 trash :11; ///<reserved
421*53ee8cc1Swenshuai.xi };
422*53ee8cc1Swenshuai.xi
423*53ee8cc1Swenshuai.xi struct
424*53ee8cc1Swenshuai.xi {
425*53ee8cc1Swenshuai.xi MS_U8 byte0; ///<byte0 of SVLD
426*53ee8cc1Swenshuai.xi MS_U8 byte1; ///<byte1 of SVLD
427*53ee8cc1Swenshuai.xi MS_U8 byte2; ///<byte2 of SVLD
428*53ee8cc1Swenshuai.xi MS_U8 byte3; ///<byte3 of SVLD
429*53ee8cc1Swenshuai.xi };
430*53ee8cc1Swenshuai.xi };
431*53ee8cc1Swenshuai.xi } JPEG_SVLD;
432*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
433*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Name: JPEG_HdrChk
434*53ee8cc1Swenshuai.xi /// @brief \b Struct \b Description: The info of header checking for JPEG decode
435*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
436*53ee8cc1Swenshuai.xi typedef union
437*53ee8cc1Swenshuai.xi {
438*53ee8cc1Swenshuai.xi struct
439*53ee8cc1Swenshuai.xi {
440*53ee8cc1Swenshuai.xi MS_U8 DQT:1;///<has Quant Table?
441*53ee8cc1Swenshuai.xi MS_U8 DHT:1;///<has Huffman Table?
442*53ee8cc1Swenshuai.xi // MS_U8 SOF:1;
443*53ee8cc1Swenshuai.xi // MS_U8 SOS:1;
444*53ee8cc1Swenshuai.xi };
445*53ee8cc1Swenshuai.xi MS_U8 result; ///<wildcard for header check
446*53ee8cc1Swenshuai.xi } JPEG_HdrChk;
447*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
448*53ee8cc1Swenshuai.xi typedef MS_BOOL ( *Pdecode_block_func )( MS_U8, MS_U16, MS_U16 );
449*53ee8cc1Swenshuai.xi
450*53ee8cc1Swenshuai.xi
451*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
452*53ee8cc1Swenshuai.xi // Global Variables
453*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
454*53ee8cc1Swenshuai.xi
455*53ee8cc1Swenshuai.xi
456*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
457*53ee8cc1Swenshuai.xi // Local Variables
458*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
459*53ee8cc1Swenshuai.xi #ifdef CMODEL
460*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_HEIGHT = 0xFFFF;
461*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_WIDTH = 0xFFFF;
462*53ee8cc1Swenshuai.xi #else
463*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_HEIGHT = 1200;
464*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MAX_WIDTH = 1600;
465*53ee8cc1Swenshuai.xi #endif
466*53ee8cc1Swenshuai.xi
467*53ee8cc1Swenshuai.xi // max progressive resolution setting
468*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_PRO_MAX_HEIGHT = 768;
469*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_PRO_MAX_WIDTH = 1024;
470*53ee8cc1Swenshuai.xi
471*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 MAX_JPEG_WIDTH_HD = 0;
472*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 MAX_JPEG_HEIGHT_HD = 0;
473*53ee8cc1Swenshuai.xi
474*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
475*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_MAX_HEIGHT = 1200;
476*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_MAX_WIDTH = 1600;
477*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_PRO_MAX_HEIGHT = 768;
478*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_MPO_PRO_MAX_WIDTH = 1024;
479*53ee8cc1Swenshuai.xi #endif
480*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
481*53ee8cc1Swenshuai.xi #if 0
482*53ee8cc1Swenshuai.xi // Default Table for JPEG
483*53ee8cc1Swenshuai.xi const MS_U16 g16GRPINFO_TBL[128]=
484*53ee8cc1Swenshuai.xi {
485*53ee8cc1Swenshuai.xi 0x0000,
486*53ee8cc1Swenshuai.xi 0x0000,
487*53ee8cc1Swenshuai.xi 0x0000,
488*53ee8cc1Swenshuai.xi 0x0100,
489*53ee8cc1Swenshuai.xi 0x0010,
490*53ee8cc1Swenshuai.xi 0x0140,
491*53ee8cc1Swenshuai.xi 0x0060,
492*53ee8cc1Swenshuai.xi 0x01e0,
493*53ee8cc1Swenshuai.xi 0x0070,
494*53ee8cc1Swenshuai.xi 0x01f0,
495*53ee8cc1Swenshuai.xi 0x0080,
496*53ee8cc1Swenshuai.xi 0x01f8,
497*53ee8cc1Swenshuai.xi 0x0090,
498*53ee8cc1Swenshuai.xi 0x01fc,
499*53ee8cc1Swenshuai.xi 0x00a0,
500*53ee8cc1Swenshuai.xi 0x01fe,
501*53ee8cc1Swenshuai.xi 0x00b0,
502*53ee8cc1Swenshuai.xi 0x01ff,
503*53ee8cc1Swenshuai.xi 0x0000,
504*53ee8cc1Swenshuai.xi 0x0000,
505*53ee8cc1Swenshuai.xi 0x0000,
506*53ee8cc1Swenshuai.xi 0x0000,
507*53ee8cc1Swenshuai.xi 0x0000,
508*53ee8cc1Swenshuai.xi 0x0000,
509*53ee8cc1Swenshuai.xi 0x0000,
510*53ee8cc1Swenshuai.xi 0x0000,
511*53ee8cc1Swenshuai.xi 0x0000,
512*53ee8cc1Swenshuai.xi 0x0000,
513*53ee8cc1Swenshuai.xi 0x0000,
514*53ee8cc1Swenshuai.xi 0x0000,
515*53ee8cc1Swenshuai.xi 0x0000,
516*53ee8cc1Swenshuai.xi 0x0000,
517*53ee8cc1Swenshuai.xi 0x0000,
518*53ee8cc1Swenshuai.xi 0x0000,
519*53ee8cc1Swenshuai.xi 0x0000,
520*53ee8cc1Swenshuai.xi 0x0100,
521*53ee8cc1Swenshuai.xi 0x0030,
522*53ee8cc1Swenshuai.xi 0x01c0,
523*53ee8cc1Swenshuai.xi 0x0040,
524*53ee8cc1Swenshuai.xi 0x01e0,
525*53ee8cc1Swenshuai.xi 0x0050,
526*53ee8cc1Swenshuai.xi 0x01f0,
527*53ee8cc1Swenshuai.xi 0x0060,
528*53ee8cc1Swenshuai.xi 0x01f8,
529*53ee8cc1Swenshuai.xi 0x0070,
530*53ee8cc1Swenshuai.xi 0x01fc,
531*53ee8cc1Swenshuai.xi 0x0080,
532*53ee8cc1Swenshuai.xi 0x01fe,
533*53ee8cc1Swenshuai.xi 0x0090,
534*53ee8cc1Swenshuai.xi 0x01ff,
535*53ee8cc1Swenshuai.xi 0x80a0,
536*53ee8cc1Swenshuai.xi 0x01ff,
537*53ee8cc1Swenshuai.xi 0xc0b0,
538*53ee8cc1Swenshuai.xi 0x01ff,
539*53ee8cc1Swenshuai.xi 0x0000,
540*53ee8cc1Swenshuai.xi 0x0000,
541*53ee8cc1Swenshuai.xi 0x0000,
542*53ee8cc1Swenshuai.xi 0x0000,
543*53ee8cc1Swenshuai.xi 0x0000,
544*53ee8cc1Swenshuai.xi 0x0000,
545*53ee8cc1Swenshuai.xi 0x0000,
546*53ee8cc1Swenshuai.xi 0x0000,
547*53ee8cc1Swenshuai.xi 0x0000,
548*53ee8cc1Swenshuai.xi 0x0000,
549*53ee8cc1Swenshuai.xi 0x0000,
550*53ee8cc1Swenshuai.xi 0x0000,
551*53ee8cc1Swenshuai.xi 0x0000,
552*53ee8cc1Swenshuai.xi 0x0100,
553*53ee8cc1Swenshuai.xi 0x0002,
554*53ee8cc1Swenshuai.xi 0x0180,
555*53ee8cc1Swenshuai.xi 0x0003,
556*53ee8cc1Swenshuai.xi 0x01a0,
557*53ee8cc1Swenshuai.xi 0x0006,
558*53ee8cc1Swenshuai.xi 0x01d0,
559*53ee8cc1Swenshuai.xi 0x0009,
560*53ee8cc1Swenshuai.xi 0x01e8,
561*53ee8cc1Swenshuai.xi 0x000b,
562*53ee8cc1Swenshuai.xi 0x01f0,
563*53ee8cc1Swenshuai.xi 0x000f,
564*53ee8cc1Swenshuai.xi 0x01f8,
565*53ee8cc1Swenshuai.xi 0x0012,
566*53ee8cc1Swenshuai.xi 0x01fb,
567*53ee8cc1Swenshuai.xi 0x8017,
568*53ee8cc1Swenshuai.xi 0x01fd,
569*53ee8cc1Swenshuai.xi 0xc01c,
570*53ee8cc1Swenshuai.xi 0x01fe,
571*53ee8cc1Swenshuai.xi 0x4020,
572*53ee8cc1Swenshuai.xi 0x01ff,
573*53ee8cc1Swenshuai.xi 0x0000,
574*53ee8cc1Swenshuai.xi 0x0000,
575*53ee8cc1Swenshuai.xi 0x0000,
576*53ee8cc1Swenshuai.xi 0x0000,
577*53ee8cc1Swenshuai.xi 0x8024,
578*53ee8cc1Swenshuai.xi 0x01ff,
579*53ee8cc1Swenshuai.xi 0x8225,
580*53ee8cc1Swenshuai.xi 0x01ff,
581*53ee8cc1Swenshuai.xi 0x0000,
582*53ee8cc1Swenshuai.xi 0x0000,
583*53ee8cc1Swenshuai.xi 0x0000,
584*53ee8cc1Swenshuai.xi 0x0100,
585*53ee8cc1Swenshuai.xi 0x0002,
586*53ee8cc1Swenshuai.xi 0x0180,
587*53ee8cc1Swenshuai.xi 0x0003,
588*53ee8cc1Swenshuai.xi 0x01a0,
589*53ee8cc1Swenshuai.xi 0x0005,
590*53ee8cc1Swenshuai.xi 0x01c0,
591*53ee8cc1Swenshuai.xi 0x0009,
592*53ee8cc1Swenshuai.xi 0x01e0,
593*53ee8cc1Swenshuai.xi 0x000d,
594*53ee8cc1Swenshuai.xi 0x01f0,
595*53ee8cc1Swenshuai.xi 0x0010,
596*53ee8cc1Swenshuai.xi 0x01f6,
597*53ee8cc1Swenshuai.xi 0x0014,
598*53ee8cc1Swenshuai.xi 0x01fa,
599*53ee8cc1Swenshuai.xi 0x801b,
600*53ee8cc1Swenshuai.xi 0x01fd,
601*53ee8cc1Swenshuai.xi 0xc020,
602*53ee8cc1Swenshuai.xi 0x01fe,
603*53ee8cc1Swenshuai.xi 0x4024,
604*53ee8cc1Swenshuai.xi 0x01ff,
605*53ee8cc1Swenshuai.xi 0x0000,
606*53ee8cc1Swenshuai.xi 0x0000,
607*53ee8cc1Swenshuai.xi 0x8028,
608*53ee8cc1Swenshuai.xi 0x01ff,
609*53ee8cc1Swenshuai.xi 0x8429,
610*53ee8cc1Swenshuai.xi 0x01ff,
611*53ee8cc1Swenshuai.xi 0x882b,
612*53ee8cc1Swenshuai.xi 0x01ff
613*53ee8cc1Swenshuai.xi };
614*53ee8cc1Swenshuai.xi #endif
615*53ee8cc1Swenshuai.xi #if 0
616*53ee8cc1Swenshuai.xi const MS_U16 g16SYMIDX_TBL[]=
617*53ee8cc1Swenshuai.xi {
618*53ee8cc1Swenshuai.xi 0x0001,
619*53ee8cc1Swenshuai.xi 0x0102,
620*53ee8cc1Swenshuai.xi 0x0203,
621*53ee8cc1Swenshuai.xi 0x0300,
622*53ee8cc1Swenshuai.xi 0x1104,
623*53ee8cc1Swenshuai.xi 0x0411,
624*53ee8cc1Swenshuai.xi 0x0505,
625*53ee8cc1Swenshuai.xi 0x2112,
626*53ee8cc1Swenshuai.xi 0x3121,
627*53ee8cc1Swenshuai.xi 0x0631,
628*53ee8cc1Swenshuai.xi 0x1241,
629*53ee8cc1Swenshuai.xi 0x4106,
630*53ee8cc1Swenshuai.xi 0x5113,
631*53ee8cc1Swenshuai.xi 0x0751,
632*53ee8cc1Swenshuai.xi 0x6161,
633*53ee8cc1Swenshuai.xi 0x7107,
634*53ee8cc1Swenshuai.xi 0x1322,
635*53ee8cc1Swenshuai.xi 0x2271,
636*53ee8cc1Swenshuai.xi 0x3214,
637*53ee8cc1Swenshuai.xi 0x8132,
638*53ee8cc1Swenshuai.xi 0x0881,
639*53ee8cc1Swenshuai.xi 0x1491,
640*53ee8cc1Swenshuai.xi 0x42a1,
641*53ee8cc1Swenshuai.xi 0x9108,
642*53ee8cc1Swenshuai.xi 0xa123,
643*53ee8cc1Swenshuai.xi 0xb142,
644*53ee8cc1Swenshuai.xi 0xc1b1,
645*53ee8cc1Swenshuai.xi 0x09c1,
646*53ee8cc1Swenshuai.xi 0x2315,
647*53ee8cc1Swenshuai.xi 0x3352,
648*53ee8cc1Swenshuai.xi 0x52d1,
649*53ee8cc1Swenshuai.xi 0xf0f0,
650*53ee8cc1Swenshuai.xi 0x1524,
651*53ee8cc1Swenshuai.xi 0x6233,
652*53ee8cc1Swenshuai.xi 0x7262,
653*53ee8cc1Swenshuai.xi 0xd172,
654*53ee8cc1Swenshuai.xi 0x0a82,
655*53ee8cc1Swenshuai.xi 0x1609,
656*53ee8cc1Swenshuai.xi 0x240a,
657*53ee8cc1Swenshuai.xi 0x3416,
658*53ee8cc1Swenshuai.xi 0xe117,
659*53ee8cc1Swenshuai.xi 0x2518,
660*53ee8cc1Swenshuai.xi 0xf119,
661*53ee8cc1Swenshuai.xi 0x171a,
662*53ee8cc1Swenshuai.xi 0x1825,
663*53ee8cc1Swenshuai.xi 0x1926,
664*53ee8cc1Swenshuai.xi 0x1a27,
665*53ee8cc1Swenshuai.xi 0x2628,
666*53ee8cc1Swenshuai.xi 0x2729,
667*53ee8cc1Swenshuai.xi 0x282a,
668*53ee8cc1Swenshuai.xi 0x2934,
669*53ee8cc1Swenshuai.xi 0x2a35,
670*53ee8cc1Swenshuai.xi 0x3536,
671*53ee8cc1Swenshuai.xi 0x3637,
672*53ee8cc1Swenshuai.xi 0x3738,
673*53ee8cc1Swenshuai.xi 0x3839,
674*53ee8cc1Swenshuai.xi 0x393a,
675*53ee8cc1Swenshuai.xi 0x3a43,
676*53ee8cc1Swenshuai.xi 0x4344,
677*53ee8cc1Swenshuai.xi 0x4445,
678*53ee8cc1Swenshuai.xi 0x4546,
679*53ee8cc1Swenshuai.xi 0x4647,
680*53ee8cc1Swenshuai.xi 0x4748,
681*53ee8cc1Swenshuai.xi 0x4849,
682*53ee8cc1Swenshuai.xi 0x494a,
683*53ee8cc1Swenshuai.xi 0x4a53,
684*53ee8cc1Swenshuai.xi 0x5354,
685*53ee8cc1Swenshuai.xi 0x5455,
686*53ee8cc1Swenshuai.xi 0x5556,
687*53ee8cc1Swenshuai.xi 0x5657,
688*53ee8cc1Swenshuai.xi 0x5758,
689*53ee8cc1Swenshuai.xi 0x5859,
690*53ee8cc1Swenshuai.xi 0x595a,
691*53ee8cc1Swenshuai.xi 0x5a63,
692*53ee8cc1Swenshuai.xi 0x6364,
693*53ee8cc1Swenshuai.xi 0x6465,
694*53ee8cc1Swenshuai.xi 0x6566,
695*53ee8cc1Swenshuai.xi 0x6667,
696*53ee8cc1Swenshuai.xi 0x6768,
697*53ee8cc1Swenshuai.xi 0x6869,
698*53ee8cc1Swenshuai.xi 0x696a,
699*53ee8cc1Swenshuai.xi 0x6a73,
700*53ee8cc1Swenshuai.xi 0x7374,
701*53ee8cc1Swenshuai.xi 0x7475,
702*53ee8cc1Swenshuai.xi 0x7576,
703*53ee8cc1Swenshuai.xi 0x7677,
704*53ee8cc1Swenshuai.xi 0x7778,
705*53ee8cc1Swenshuai.xi 0x7879,
706*53ee8cc1Swenshuai.xi 0x797a,
707*53ee8cc1Swenshuai.xi 0x7a83,
708*53ee8cc1Swenshuai.xi 0x8284,
709*53ee8cc1Swenshuai.xi 0x8385,
710*53ee8cc1Swenshuai.xi 0x8486,
711*53ee8cc1Swenshuai.xi 0x8587,
712*53ee8cc1Swenshuai.xi 0x8688,
713*53ee8cc1Swenshuai.xi 0x8789,
714*53ee8cc1Swenshuai.xi 0x888a,
715*53ee8cc1Swenshuai.xi 0x8992,
716*53ee8cc1Swenshuai.xi 0x8a93,
717*53ee8cc1Swenshuai.xi 0x9294,
718*53ee8cc1Swenshuai.xi 0x9395,
719*53ee8cc1Swenshuai.xi 0x9496,
720*53ee8cc1Swenshuai.xi 0x9597,
721*53ee8cc1Swenshuai.xi 0x9698,
722*53ee8cc1Swenshuai.xi 0x9799,
723*53ee8cc1Swenshuai.xi 0x989a,
724*53ee8cc1Swenshuai.xi 0x99a2,
725*53ee8cc1Swenshuai.xi 0x9aa3,
726*53ee8cc1Swenshuai.xi 0xa2a4,
727*53ee8cc1Swenshuai.xi 0xa3a5,
728*53ee8cc1Swenshuai.xi 0xa4a6,
729*53ee8cc1Swenshuai.xi 0xa5a7,
730*53ee8cc1Swenshuai.xi 0xa6a8,
731*53ee8cc1Swenshuai.xi 0xa7a9,
732*53ee8cc1Swenshuai.xi 0xa8aa,
733*53ee8cc1Swenshuai.xi 0xa9b2,
734*53ee8cc1Swenshuai.xi 0xaab3,
735*53ee8cc1Swenshuai.xi 0xb2b4,
736*53ee8cc1Swenshuai.xi 0xb3b5,
737*53ee8cc1Swenshuai.xi 0xb4b6,
738*53ee8cc1Swenshuai.xi 0xb5b7,
739*53ee8cc1Swenshuai.xi 0xb6b8,
740*53ee8cc1Swenshuai.xi 0xb7b9,
741*53ee8cc1Swenshuai.xi 0xb8ba,
742*53ee8cc1Swenshuai.xi 0xb9c2,
743*53ee8cc1Swenshuai.xi 0xbac3,
744*53ee8cc1Swenshuai.xi 0xc2c4,
745*53ee8cc1Swenshuai.xi 0xc3c5,
746*53ee8cc1Swenshuai.xi 0xc4c6,
747*53ee8cc1Swenshuai.xi 0xc5c7,
748*53ee8cc1Swenshuai.xi 0xc6c8,
749*53ee8cc1Swenshuai.xi 0xc7c9,
750*53ee8cc1Swenshuai.xi 0xc8ca,
751*53ee8cc1Swenshuai.xi 0xc9d2,
752*53ee8cc1Swenshuai.xi 0xcad3,
753*53ee8cc1Swenshuai.xi 0xd2d4,
754*53ee8cc1Swenshuai.xi 0xd3d5,
755*53ee8cc1Swenshuai.xi 0xd4d6,
756*53ee8cc1Swenshuai.xi 0xd5d7,
757*53ee8cc1Swenshuai.xi 0xd6d8,
758*53ee8cc1Swenshuai.xi 0xd7d9,
759*53ee8cc1Swenshuai.xi 0xd8da,
760*53ee8cc1Swenshuai.xi 0xd9e1,
761*53ee8cc1Swenshuai.xi 0xdae2,
762*53ee8cc1Swenshuai.xi 0xe2e3,
763*53ee8cc1Swenshuai.xi 0xe3e4,
764*53ee8cc1Swenshuai.xi 0xe4e5,
765*53ee8cc1Swenshuai.xi 0xe5e6,
766*53ee8cc1Swenshuai.xi 0xe6e7,
767*53ee8cc1Swenshuai.xi 0xe7e8,
768*53ee8cc1Swenshuai.xi 0xe8e9,
769*53ee8cc1Swenshuai.xi 0xe9ea,
770*53ee8cc1Swenshuai.xi 0xeaf1,
771*53ee8cc1Swenshuai.xi 0xf2f2,
772*53ee8cc1Swenshuai.xi 0xf3f3,
773*53ee8cc1Swenshuai.xi 0xf4f4,
774*53ee8cc1Swenshuai.xi 0xf5f5,
775*53ee8cc1Swenshuai.xi 0xf6f6,
776*53ee8cc1Swenshuai.xi 0xf7f7,
777*53ee8cc1Swenshuai.xi 0xf8f8,
778*53ee8cc1Swenshuai.xi 0xf9f9,
779*53ee8cc1Swenshuai.xi 0xfafa,
780*53ee8cc1Swenshuai.xi 0x0000,
781*53ee8cc1Swenshuai.xi 0x0000,
782*53ee8cc1Swenshuai.xi 0x0000,
783*53ee8cc1Swenshuai.xi 0x0000,
784*53ee8cc1Swenshuai.xi 0x0000,
785*53ee8cc1Swenshuai.xi 0x0000,
786*53ee8cc1Swenshuai.xi 0x0000,
787*53ee8cc1Swenshuai.xi 0x0000,
788*53ee8cc1Swenshuai.xi 0x0000,
789*53ee8cc1Swenshuai.xi 0x0000,
790*53ee8cc1Swenshuai.xi 0x0000,
791*53ee8cc1Swenshuai.xi 0x0000,
792*53ee8cc1Swenshuai.xi 0x0000,
793*53ee8cc1Swenshuai.xi 0x0000,
794*53ee8cc1Swenshuai.xi 0x0000,
795*53ee8cc1Swenshuai.xi 0x0000,
796*53ee8cc1Swenshuai.xi 0x0000,
797*53ee8cc1Swenshuai.xi 0x0000,
798*53ee8cc1Swenshuai.xi 0x0000,
799*53ee8cc1Swenshuai.xi 0x0000,
800*53ee8cc1Swenshuai.xi 0x0000,
801*53ee8cc1Swenshuai.xi 0x0000,
802*53ee8cc1Swenshuai.xi 0x0000,
803*53ee8cc1Swenshuai.xi 0x0000,
804*53ee8cc1Swenshuai.xi 0x0000,
805*53ee8cc1Swenshuai.xi 0x0000,
806*53ee8cc1Swenshuai.xi 0x0000,
807*53ee8cc1Swenshuai.xi 0x0000,
808*53ee8cc1Swenshuai.xi 0x0000,
809*53ee8cc1Swenshuai.xi 0x0000,
810*53ee8cc1Swenshuai.xi 0x0000,
811*53ee8cc1Swenshuai.xi 0x0000,
812*53ee8cc1Swenshuai.xi 0x0000,
813*53ee8cc1Swenshuai.xi 0x0000,
814*53ee8cc1Swenshuai.xi 0x0000,
815*53ee8cc1Swenshuai.xi 0x0000,
816*53ee8cc1Swenshuai.xi 0x0000,
817*53ee8cc1Swenshuai.xi 0x0000,
818*53ee8cc1Swenshuai.xi 0x0000,
819*53ee8cc1Swenshuai.xi 0x0000,
820*53ee8cc1Swenshuai.xi 0x0000,
821*53ee8cc1Swenshuai.xi 0x0000,
822*53ee8cc1Swenshuai.xi 0x0000,
823*53ee8cc1Swenshuai.xi 0x0000,
824*53ee8cc1Swenshuai.xi 0x0000,
825*53ee8cc1Swenshuai.xi 0x0000,
826*53ee8cc1Swenshuai.xi 0x0000,
827*53ee8cc1Swenshuai.xi 0x0000,
828*53ee8cc1Swenshuai.xi 0x0000,
829*53ee8cc1Swenshuai.xi 0x0000,
830*53ee8cc1Swenshuai.xi 0x0000,
831*53ee8cc1Swenshuai.xi 0x0000,
832*53ee8cc1Swenshuai.xi 0x0000,
833*53ee8cc1Swenshuai.xi 0x0000,
834*53ee8cc1Swenshuai.xi 0x0000,
835*53ee8cc1Swenshuai.xi 0x0000,
836*53ee8cc1Swenshuai.xi 0x0000,
837*53ee8cc1Swenshuai.xi 0x0000,
838*53ee8cc1Swenshuai.xi 0x0000,
839*53ee8cc1Swenshuai.xi 0x0000,
840*53ee8cc1Swenshuai.xi 0x0000,
841*53ee8cc1Swenshuai.xi 0x0000,
842*53ee8cc1Swenshuai.xi 0x0000,
843*53ee8cc1Swenshuai.xi 0x0000,
844*53ee8cc1Swenshuai.xi 0x0000,
845*53ee8cc1Swenshuai.xi 0x0000,
846*53ee8cc1Swenshuai.xi 0x0000,
847*53ee8cc1Swenshuai.xi 0x0000,
848*53ee8cc1Swenshuai.xi 0x0000,
849*53ee8cc1Swenshuai.xi 0x0000,
850*53ee8cc1Swenshuai.xi 0x0000,
851*53ee8cc1Swenshuai.xi 0x0000,
852*53ee8cc1Swenshuai.xi 0x0000,
853*53ee8cc1Swenshuai.xi 0x0000,
854*53ee8cc1Swenshuai.xi 0x0000,
855*53ee8cc1Swenshuai.xi 0x0000,
856*53ee8cc1Swenshuai.xi 0x0000,
857*53ee8cc1Swenshuai.xi 0x0000,
858*53ee8cc1Swenshuai.xi 0x0000,
859*53ee8cc1Swenshuai.xi 0x0000,
860*53ee8cc1Swenshuai.xi 0x0000,
861*53ee8cc1Swenshuai.xi 0x0000,
862*53ee8cc1Swenshuai.xi 0x0000,
863*53ee8cc1Swenshuai.xi 0x0000,
864*53ee8cc1Swenshuai.xi 0x0000,
865*53ee8cc1Swenshuai.xi 0x0000,
866*53ee8cc1Swenshuai.xi 0x0000,
867*53ee8cc1Swenshuai.xi 0x0000,
868*53ee8cc1Swenshuai.xi 0x0000,
869*53ee8cc1Swenshuai.xi 0x0000,
870*53ee8cc1Swenshuai.xi 0x0000,
871*53ee8cc1Swenshuai.xi 0x0000,
872*53ee8cc1Swenshuai.xi 0x0000,
873*53ee8cc1Swenshuai.xi 0x0000,
874*53ee8cc1Swenshuai.xi 0x0000,
875*53ee8cc1Swenshuai.xi 0x0101,
876*53ee8cc1Swenshuai.xi 0x0202,
877*53ee8cc1Swenshuai.xi 0x0303,
878*53ee8cc1Swenshuai.xi 0x0404,
879*53ee8cc1Swenshuai.xi 0x0505,
880*53ee8cc1Swenshuai.xi 0x0606,
881*53ee8cc1Swenshuai.xi 0x0707,
882*53ee8cc1Swenshuai.xi 0x0808,
883*53ee8cc1Swenshuai.xi 0x0909,
884*53ee8cc1Swenshuai.xi 0x0a0a,
885*53ee8cc1Swenshuai.xi 0x0b0b,
886*53ee8cc1Swenshuai.xi 0x0000,
887*53ee8cc1Swenshuai.xi 0x0000,
888*53ee8cc1Swenshuai.xi 0x0000,
889*53ee8cc1Swenshuai.xi 0x0000
890*53ee8cc1Swenshuai.xi };
891*53ee8cc1Swenshuai.xi #endif
892*53ee8cc1Swenshuai.xi #if 0
893*53ee8cc1Swenshuai.xi const MS_U16 g16IQ_TBL[128]=
894*53ee8cc1Swenshuai.xi {
895*53ee8cc1Swenshuai.xi 0x0010,
896*53ee8cc1Swenshuai.xi 0x000b,
897*53ee8cc1Swenshuai.xi 0x000a,
898*53ee8cc1Swenshuai.xi 0x0010,
899*53ee8cc1Swenshuai.xi 0x0018,
900*53ee8cc1Swenshuai.xi 0x0028,
901*53ee8cc1Swenshuai.xi 0x0033,
902*53ee8cc1Swenshuai.xi 0x003d,
903*53ee8cc1Swenshuai.xi 0x000c,
904*53ee8cc1Swenshuai.xi 0x000c,
905*53ee8cc1Swenshuai.xi 0x000e,
906*53ee8cc1Swenshuai.xi 0x0013,
907*53ee8cc1Swenshuai.xi 0x001a,
908*53ee8cc1Swenshuai.xi 0x003a,
909*53ee8cc1Swenshuai.xi 0x003c,
910*53ee8cc1Swenshuai.xi 0x0037,
911*53ee8cc1Swenshuai.xi 0x000e,
912*53ee8cc1Swenshuai.xi 0x000d,
913*53ee8cc1Swenshuai.xi 0x0010,
914*53ee8cc1Swenshuai.xi 0x0018,
915*53ee8cc1Swenshuai.xi 0x0028,
916*53ee8cc1Swenshuai.xi 0x0039,
917*53ee8cc1Swenshuai.xi 0x0045,
918*53ee8cc1Swenshuai.xi 0x0038,
919*53ee8cc1Swenshuai.xi 0x000e,
920*53ee8cc1Swenshuai.xi 0x0011,
921*53ee8cc1Swenshuai.xi 0x0016,
922*53ee8cc1Swenshuai.xi 0x001d,
923*53ee8cc1Swenshuai.xi 0x0033,
924*53ee8cc1Swenshuai.xi 0x0057,
925*53ee8cc1Swenshuai.xi 0x0050,
926*53ee8cc1Swenshuai.xi 0x003e,
927*53ee8cc1Swenshuai.xi 0x0012,
928*53ee8cc1Swenshuai.xi 0x0016,
929*53ee8cc1Swenshuai.xi 0x0025,
930*53ee8cc1Swenshuai.xi 0x0038,
931*53ee8cc1Swenshuai.xi 0x0044,
932*53ee8cc1Swenshuai.xi 0x006d,
933*53ee8cc1Swenshuai.xi 0x0067,
934*53ee8cc1Swenshuai.xi 0x004d,
935*53ee8cc1Swenshuai.xi 0x0018,
936*53ee8cc1Swenshuai.xi 0x0023,
937*53ee8cc1Swenshuai.xi 0x0037,
938*53ee8cc1Swenshuai.xi 0x0040,
939*53ee8cc1Swenshuai.xi 0x0051,
940*53ee8cc1Swenshuai.xi 0x0068,
941*53ee8cc1Swenshuai.xi 0x0071,
942*53ee8cc1Swenshuai.xi 0x005c,
943*53ee8cc1Swenshuai.xi 0x0031,
944*53ee8cc1Swenshuai.xi 0x0040,
945*53ee8cc1Swenshuai.xi 0x004e,
946*53ee8cc1Swenshuai.xi 0x0057,
947*53ee8cc1Swenshuai.xi 0x0067,
948*53ee8cc1Swenshuai.xi 0x0079,
949*53ee8cc1Swenshuai.xi 0x0078,
950*53ee8cc1Swenshuai.xi 0x0065,
951*53ee8cc1Swenshuai.xi 0x0048,
952*53ee8cc1Swenshuai.xi 0x005c,
953*53ee8cc1Swenshuai.xi 0x005f,
954*53ee8cc1Swenshuai.xi 0x0062,
955*53ee8cc1Swenshuai.xi 0x0070,
956*53ee8cc1Swenshuai.xi 0x0064,
957*53ee8cc1Swenshuai.xi 0x0067,
958*53ee8cc1Swenshuai.xi 0x0063,
959*53ee8cc1Swenshuai.xi 0x0011,
960*53ee8cc1Swenshuai.xi 0x0012,
961*53ee8cc1Swenshuai.xi 0x0018,
962*53ee8cc1Swenshuai.xi 0x002f,
963*53ee8cc1Swenshuai.xi 0x0063,
964*53ee8cc1Swenshuai.xi 0x0063,
965*53ee8cc1Swenshuai.xi 0x0063,
966*53ee8cc1Swenshuai.xi 0x0063,
967*53ee8cc1Swenshuai.xi 0x0012,
968*53ee8cc1Swenshuai.xi 0x0015,
969*53ee8cc1Swenshuai.xi 0x001a,
970*53ee8cc1Swenshuai.xi 0x0042,
971*53ee8cc1Swenshuai.xi 0x0063,
972*53ee8cc1Swenshuai.xi 0x0063,
973*53ee8cc1Swenshuai.xi 0x0063,
974*53ee8cc1Swenshuai.xi 0x0063,
975*53ee8cc1Swenshuai.xi 0x0018,
976*53ee8cc1Swenshuai.xi 0x001a,
977*53ee8cc1Swenshuai.xi 0x0038,
978*53ee8cc1Swenshuai.xi 0x0063,
979*53ee8cc1Swenshuai.xi 0x0063,
980*53ee8cc1Swenshuai.xi 0x0063,
981*53ee8cc1Swenshuai.xi 0x0063,
982*53ee8cc1Swenshuai.xi 0x0063,
983*53ee8cc1Swenshuai.xi 0x002f,
984*53ee8cc1Swenshuai.xi 0x0042,
985*53ee8cc1Swenshuai.xi 0x0063,
986*53ee8cc1Swenshuai.xi 0x0063,
987*53ee8cc1Swenshuai.xi 0x0063,
988*53ee8cc1Swenshuai.xi 0x0063,
989*53ee8cc1Swenshuai.xi 0x0063,
990*53ee8cc1Swenshuai.xi 0x0063,
991*53ee8cc1Swenshuai.xi 0x0063,
992*53ee8cc1Swenshuai.xi 0x0063,
993*53ee8cc1Swenshuai.xi 0x0063,
994*53ee8cc1Swenshuai.xi 0x0063,
995*53ee8cc1Swenshuai.xi 0x0063,
996*53ee8cc1Swenshuai.xi 0x0063,
997*53ee8cc1Swenshuai.xi 0x0063,
998*53ee8cc1Swenshuai.xi 0x0063,
999*53ee8cc1Swenshuai.xi 0x0063,
1000*53ee8cc1Swenshuai.xi 0x0063,
1001*53ee8cc1Swenshuai.xi 0x0063,
1002*53ee8cc1Swenshuai.xi 0x0063,
1003*53ee8cc1Swenshuai.xi 0x0063,
1004*53ee8cc1Swenshuai.xi 0x0063,
1005*53ee8cc1Swenshuai.xi 0x0063,
1006*53ee8cc1Swenshuai.xi 0x0063,
1007*53ee8cc1Swenshuai.xi 0x0063,
1008*53ee8cc1Swenshuai.xi 0x0063,
1009*53ee8cc1Swenshuai.xi 0x0063,
1010*53ee8cc1Swenshuai.xi 0x0063,
1011*53ee8cc1Swenshuai.xi 0x0063,
1012*53ee8cc1Swenshuai.xi 0x0063,
1013*53ee8cc1Swenshuai.xi 0x0063,
1014*53ee8cc1Swenshuai.xi 0x0063,
1015*53ee8cc1Swenshuai.xi 0x0063,
1016*53ee8cc1Swenshuai.xi 0x0063,
1017*53ee8cc1Swenshuai.xi 0x0063,
1018*53ee8cc1Swenshuai.xi 0x0063,
1019*53ee8cc1Swenshuai.xi 0x0063,
1020*53ee8cc1Swenshuai.xi 0x0063,
1021*53ee8cc1Swenshuai.xi 0x0063,
1022*53ee8cc1Swenshuai.xi 0x0063
1023*53ee8cc1Swenshuai.xi };
1024*53ee8cc1Swenshuai.xi #endif
1025*53ee8cc1Swenshuai.xi
1026*53ee8cc1Swenshuai.xi /* entry n is (-1 << n) + 1 */
1027*53ee8cc1Swenshuai.xi static const MS_S32 extend_offset[16] =
1028*53ee8cc1Swenshuai.xi {
1029*53ee8cc1Swenshuai.xi 0, (( -1)<<1)+1, ((-1)<<2)+1, ((-1)<<3) + 1, ((-1)<<4)+1, ((-1)<<5)+1,
1030*53ee8cc1Swenshuai.xi ((-1)<<6)+1, ((-1)<<7)+1, ((-1)<<8)+1, ((-1)<<9)+1, ((-1) <<10)+1,
1031*53ee8cc1Swenshuai.xi ((-1)<<11)+1, ((-1)<<12)+1, ((-1)<<13)+1, ((-1)<<14)+1, ((-1)<<15)+1
1032*53ee8cc1Swenshuai.xi };
1033*53ee8cc1Swenshuai.xi
1034*53ee8cc1Swenshuai.xi /* entry n is 2**(n-1) */
1035*53ee8cc1Swenshuai.xi static const MS_S32 extend_test[16] =
1036*53ee8cc1Swenshuai.xi {
1037*53ee8cc1Swenshuai.xi 0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000
1038*53ee8cc1Swenshuai.xi };
1039*53ee8cc1Swenshuai.xi
1040*53ee8cc1Swenshuai.xi static const MS_S32 extend_mask[] =
1041*53ee8cc1Swenshuai.xi {
1042*53ee8cc1Swenshuai.xi 0, (1<<0), (1<<1), (1<<2), (1<<3), (1<<4), (1<<5), (1<<6), (1<<7), (1<<8),
1043*53ee8cc1Swenshuai.xi (1<<9), (1<<10), (1<<11), (1<<12), (1<<13), (1<<14), (1<<15), (1<<16),
1044*53ee8cc1Swenshuai.xi };
1045*53ee8cc1Swenshuai.xi
1046*53ee8cc1Swenshuai.xi
1047*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ReadBufferAddr;
1048*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ReadBufferSize;
1049*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32WriteBufferAddr;
1050*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32WriteBufferSize;
1051*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32InternalBufferAddr;
1052*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32InternalBufferSize;
1053*53ee8cc1Swenshuai.xi
1054*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32RLEOffset; // offset to record the current RLE access address
1055*53ee8cc1Swenshuai.xi
1056*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_HdrChk _HeadCheck;
1057*53ee8cc1Swenshuai.xi
1058*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_BLOCK_TYPE _s16dc_pred[3];
1059*53ee8cc1Swenshuai.xi
1060*53ee8cc1Swenshuai.xi // The width/height may be the thumbnail or original image size, it based on decoding mode
1061*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Image_x_size;
1062*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Image_y_size;
1063*53ee8cc1Swenshuai.xi
1064*53ee8cc1Swenshuai.xi // The original size of this JPEG file after alignment
1065*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16OriginalImage_x_size;
1066*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16OriginalImage_y_size;
1067*53ee8cc1Swenshuai.xi
1068*53ee8cc1Swenshuai.xi // The original size before alignment
1069*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16NonAlignmentImage_x_size;
1070*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16NonAlignmentImage_y_size;
1071*53ee8cc1Swenshuai.xi
1072*53ee8cc1Swenshuai.xi // The width/height/pitch of image for displaying.
1073*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImageWidth;
1074*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImagePitch;
1075*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImageHeight;
1076*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16AlignedImagePitch_H;
1077*53ee8cc1Swenshuai.xi
1078*53ee8cc1Swenshuai.xi // Scale Down Factor
1079*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8ScaleDownFactor;
1080*53ee8cc1Swenshuai.xi
1081*53ee8cc1Swenshuai.xi ////JPEG_STATIC PJPEG_FILE_FileSystem_t _pStream;
1082*53ee8cc1Swenshuai.xi
1083*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8DecodeType = E_JPEG_TYPE_MAIN;
1084*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bProgressive_flag;
1085*53ee8cc1Swenshuai.xi
1086*53ee8cc1Swenshuai.xi #ifndef CMODEL
1087*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8DownScaleRatio;
1088*53ee8cc1Swenshuai.xi #endif
1089*53ee8cc1Swenshuai.xi
1090*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bFirstRLE;
1091*53ee8cc1Swenshuai.xi
1092*53ee8cc1Swenshuai.xi /******* Thumbnail related *******/
1093*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bThumbnailFound;
1094*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bThumbnailAccessMode;
1095*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ThumbnailOffset;
1096*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16ThumbnailSize;
1097*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bTiffBigEndian;
1098*53ee8cc1Swenshuai.xi
1099*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32ThumbnailBufferOffset; // keep track of thumb buffer access address
1100*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u16ThumbnailBufferSize; // keep track of thumb buffer size
1101*53ee8cc1Swenshuai.xi /*****************************/
1102*53ee8cc1Swenshuai.xi
1103*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_HuffInfo _Huff_info[JPEG_MAXHUFFTABLES];
1104*53ee8cc1Swenshuai.xi
1105*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_QuantTbl _QuantTables[JPEG_MAXQUANTTABLES]; /* pointer to quantization tables */
1106*53ee8cc1Swenshuai.xi
1107*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comps_in_frame; /* # of components in frame */
1108*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_h_samp[JPEG_MAXCOMPONENTS]; /* component's horizontal sampling factor */
1109*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_v_samp[JPEG_MAXCOMPONENTS]; /* component's vertical sampling factor */
1110*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_quant[JPEG_MAXCOMPONENTS]; /* component's quantization table selector */
1111*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_ident[JPEG_MAXCOMPONENTS]; /* component's ID */
1112*53ee8cc1Swenshuai.xi
1113*53ee8cc1Swenshuai.xi // The Luma and Chroma (YU) component ID, default is 1 & 2
1114*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8LumaCi = 1;
1115*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8ChromaCi = 2;
1116*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Chroma2Ci = 3;
1117*53ee8cc1Swenshuai.xi
1118*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Comp_h_blocks[JPEG_MAXCOMPONENTS];
1119*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Comp_v_blocks[JPEG_MAXCOMPONENTS];
1120*53ee8cc1Swenshuai.xi
1121*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comps_in_scan; /* # of components in scan */
1122*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_list[JPEG_MAXCOMPSINSCAN]; /* components in this scan */
1123*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_dc_tab[JPEG_MAXCOMPONENTS]; /* component's DC Huffman coding table selector */
1124*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Comp_ac_tab[JPEG_MAXCOMPONENTS]; /* component's AC Huffman coding table selector */
1125*53ee8cc1Swenshuai.xi
1126*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Spectral_start; /* spectral selection start */
1127*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Spectral_end; /* spectral selection end */
1128*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Successive_low; /* successive approximation low */
1129*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Successive_high; /* successive approximation high */
1130*53ee8cc1Swenshuai.xi
1131*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Blocks_per_mcu;
1132*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Max_blocks_per_row;
1133*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Mcus_per_row;
1134*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Mcus_per_col;
1135*53ee8cc1Swenshuai.xi
1136*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Mcu_org[JPEG_MAXBLOCKSPERMCU];
1137*53ee8cc1Swenshuai.xi
1138*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 gu8Max_mcu_x_size; /* MCU's max. X size in pixels */
1139*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 gu8Max_mcu_y_size; /* MCU's max. Y size in pixels */
1140*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 gu16Max_mcus_per_row;
1141*53ee8cc1Swenshuai.xi
1142*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
1143*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Total_lines_left; /* total # lines left in image */
1144*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Block_y_mcu[JPEG_MAXCOMPONENTS];
1145*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_HuffTbl _Huff_tbls[JPEG_MAXHUFFTABLES];
1146*53ee8cc1Swenshuai.xi JPEG_STATIC PJPEG_CoeffBuf _DC_Coeffs[JPEG_MAXCOMPONENTS];
1147*53ee8cc1Swenshuai.xi JPEG_STATIC PJPEG_CoeffBuf _AC_Coeffs[JPEG_MAXCOMPONENTS];
1148*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Last_dc_val[JPEG_MAXCOMPONENTS];
1149*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EOB_run;
1150*53ee8cc1Swenshuai.xi #ifdef CMODEL
1151*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 gu16Mcu_lines_left; /* total # lines left in this MCU */
1152*53ee8cc1Swenshuai.xi #endif
1153*53ee8cc1Swenshuai.xi #endif
1154*53ee8cc1Swenshuai.xi
1155*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Max_blocks_per_mcu;
1156*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Max_mcus_per_col;
1157*53ee8cc1Swenshuai.xi
1158*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 gu8Scan_type; /* Grey, Yh1v1, Yh1v2, Yh2v1, Yh2v2,
1159*53ee8cc1Swenshuai.xi CMYK111, CMYK4114 */
1160*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 *_pu8In_buf_ofs;
1161*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32In_buf_left;
1162*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Tem_flag;
1163*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bEOF_flag;
1164*53ee8cc1Swenshuai.xi
1165*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 *_pu8In_buf;
1166*53ee8cc1Swenshuai.xi
1167*53ee8cc1Swenshuai.xi JPEG_STATIC MS_S16 _s16Bits_left;
1168*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Bit_buf;
1169*53ee8cc1Swenshuai.xi
1170*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Restart_interval;
1171*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Restarts_left;
1172*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Next_restart_num;
1173*53ee8cc1Swenshuai.xi
1174*53ee8cc1Swenshuai.xi JPEG_STATIC void *_pBlocks[JPEG_MAXBLOCKS]; /* list of all dynamically allocated blocks */
1175*53ee8cc1Swenshuai.xi
1176*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_ErrCode _Error_code;
1177*53ee8cc1Swenshuai.xi
1178*53ee8cc1Swenshuai.xi #ifdef CMODEL
1179*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bReady_flag;
1180*53ee8cc1Swenshuai.xi #endif
1181*53ee8cc1Swenshuai.xi
1182*53ee8cc1Swenshuai.xi //#ifdef USE_LIBC
1183*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
1184*53ee8cc1Swenshuai.xi JPEG_STATIC jmp_buf _jmp_state;
1185*53ee8cc1Swenshuai.xi #endif
1186*53ee8cc1Swenshuai.xi //#endif
1187*53ee8cc1Swenshuai.xi
1188*53ee8cc1Swenshuai.xi ////JPEG_STATIC MS_S32 _Total_Decoded_Size = 0;
1189*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI - harold
1190*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 NumPics;
1191*53ee8cc1Swenshuai.xi #endif
1192*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Total_bytes_read;
1193*53ee8cc1Swenshuai.xi
1194*53ee8cc1Swenshuai.xi //JPEG_STATIC MS_U8 *_pu32ExifHeaderAddr;
1195*53ee8cc1Swenshuai.xi
1196*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_FillHdrFunc _pFillHdrFunc = NULL;
1197*53ee8cc1Swenshuai.xi
1198*53ee8cc1Swenshuai.xi #ifdef CMODEL
1199*53ee8cc1Swenshuai.xi extern const MS_U8 _u8ZAG[64];
1200*53ee8cc1Swenshuai.xi extern const MS_U8 _u8Jpeg_zigzag_order[64];
1201*53ee8cc1Swenshuai.xi #elif SW_JPD_RGB_CMYK
1202*53ee8cc1Swenshuai.xi static const MS_U8 _u8ZAG[64+1] =
1203*53ee8cc1Swenshuai.xi {
1204*53ee8cc1Swenshuai.xi 0, 1, 8, 16, 9, 2, 3, 10,
1205*53ee8cc1Swenshuai.xi 17, 24, 32, 25, 18, 11, 4, 5,
1206*53ee8cc1Swenshuai.xi 12, 19, 26, 33, 40, 48, 41, 34,
1207*53ee8cc1Swenshuai.xi 27, 20, 13, 6, 7, 14, 21, 28,
1208*53ee8cc1Swenshuai.xi 35, 42, 49, 56, 57, 50, 43, 36,
1209*53ee8cc1Swenshuai.xi 29, 22, 15, 23, 30, 37, 44, 51,
1210*53ee8cc1Swenshuai.xi 58, 59, 52, 45, 38, 31, 39, 46,
1211*53ee8cc1Swenshuai.xi 53, 60, 61, 54, 47, 55, 62, 63
1212*53ee8cc1Swenshuai.xi ,0
1213*53ee8cc1Swenshuai.xi };
1214*53ee8cc1Swenshuai.xi #endif
1215*53ee8cc1Swenshuai.xi
1216*53ee8cc1Swenshuai.xi JPEG_STATIC MSIF_Version _api_jpeg_version = {
1217*53ee8cc1Swenshuai.xi .DDI = { JPEG_API_VERSION },
1218*53ee8cc1Swenshuai.xi };
1219*53ee8cc1Swenshuai.xi
1220*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8JPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
1221*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bMHEG5 = FALSE;
1222*53ee8cc1Swenshuai.xi
1223*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _JPD_PreVIdx = 0; //For H/W bug, some cases can not exit after decode done
1224*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _JPD_IsDecoding = FALSE; //For H/W bug, some cases can not exit after decode done
1225*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _JPD_ReCheckTime = 0; //For H/W bug, some cases can not exit after decode done
1226*53ee8cc1Swenshuai.xi
1227*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _Progressive_ROI_flag = FALSE; //CL82399
1228*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 ROI_width; //CL82399
1229*53ee8cc1Swenshuai.xi
1230*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_BuffLoadType u8PreLHFlag = E_JPEG_BUFFER_NONE;
1231*53ee8cc1Swenshuai.xi
1232*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 u32MRCheckCount = 0;
1233*53ee8cc1Swenshuai.xi
1234*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL _bIsInit = FALSE;
1235*53ee8cc1Swenshuai.xi
1236*53ee8cc1Swenshuai.xi ///JPEG_STATIC MS_U32 jpeg_input = 0;
1237*53ee8cc1Swenshuai.xi ///#define JPEG_GO do{scanf("%d", &jpeg_input);}while(0)
1238*53ee8cc1Swenshuai.xi
1239*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
1240*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *_ps16Block_seg[JPEG_MAXBLOCKSPERROW];
1241*53ee8cc1Swenshuai.xi MS_U8 _u8Block_max_zag_set[JPEG_MAXBLOCKSPERROW];
1242*53ee8cc1Swenshuai.xi MS_U8 *gpu8Sample_buf;
1243*53ee8cc1Swenshuai.xi MS_S32 gs32Crr[256];
1244*53ee8cc1Swenshuai.xi MS_S32 gs32Cbb[256];
1245*53ee8cc1Swenshuai.xi MS_S32 gs32Crg[256];
1246*53ee8cc1Swenshuai.xi MS_S32 gs32Cbg[256];
1247*53ee8cc1Swenshuai.xi
1248*53ee8cc1Swenshuai.xi MS_U8 *pgu8Scan_line_0;
1249*53ee8cc1Swenshuai.xi MS_U8 *pgu8scan_line_1;
1250*53ee8cc1Swenshuai.xi
1251*53ee8cc1Swenshuai.xi //JPEG_STATIC MS_U16 _u16Real_dest_bytes_per_scan_line;
1252*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Dest_bytes_per_scan_line; /* rounded up */
1253*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8Dest_bytes_per_pixel; /* currently, 4 (RGB) or 1 (Y) */
1254*53ee8cc1Swenshuai.xi
1255*53ee8cc1Swenshuai.xi #if ( ! SUPPORT_PROGRESSIVE_MODE) && ( ! defined(CMODEL))
1256*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16Total_lines_left; /* total # lines left in image */
1257*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32Block_y_mcu[JPEG_MAXCOMPONENTS];
1258*53ee8cc1Swenshuai.xi //JPEG_STATIC MS_U16 gu16Mcu_lines_left; /* total # lines left in this MCU */
1259*53ee8cc1Swenshuai.xi #endif
1260*53ee8cc1Swenshuai.xi #endif
1261*53ee8cc1Swenshuai.xi
1262*53ee8cc1Swenshuai.xi /*===========================================================================*/
1263*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL __bIsMjpeg = FALSE;
1264*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 __u32RealMjpegBase = 0x00000000;
1265*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 __u32TrickyMjpegBase = 0x00000000;
1266*53ee8cc1Swenshuai.xi /*===========================================================================*/
1267*53ee8cc1Swenshuai.xi
1268*53ee8cc1Swenshuai.xi //The info of JPEG EXIF
1269*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_EXIF_DateTime _stEXIF_DateTime;
1270*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_EXIF_Orientation _eEXIF_Orientation;
1271*53ee8cc1Swenshuai.xi
1272*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
1273*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8EXIF_Manufacturer[JPEG_MANUFACTURER_SIZE];
1274*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 _u8EXIF_Model[JPEG_MODEL_SIZE];
1275*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16EXIF_Exposureprogram;
1276*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 _u16EXIF_Flash;
1277*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EXIF_ISOSpeedRatings;
1278*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ExposureTime;
1279*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_FNumber;
1280*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ShutterSpeedValue;
1281*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ApertureValue;
1282*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_ExposureBiasValue;
1283*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_RATIONAL _stEXIF_FocalLength;
1284*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EXIF_ImageWidth;
1285*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 _u32EXIF_ImageHeight;
1286*53ee8cc1Swenshuai.xi #endif
1287*53ee8cc1Swenshuai.xi
1288*53ee8cc1Swenshuai.xi //record data offset
1289*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 u32DataOffset = 0;
1290*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 u32SOFOffset = 0; //for SEC request, they need to know the offset of SOF marker
1291*53ee8cc1Swenshuai.xi
1292*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bIs3HuffTbl = FALSE;
1293*53ee8cc1Swenshuai.xi
1294*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
1295*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bEnableCMYK = TRUE;
1296*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL bEnableRGB = TRUE;
1297*53ee8cc1Swenshuai.xi #endif
1298*53ee8cc1Swenshuai.xi
1299*53ee8cc1Swenshuai.xi
1300*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
1301*53ee8cc1Swenshuai.xi //MPO buffer
1302*53ee8cc1Swenshuai.xi static MS_U8 *_pu8In_buf_MPO_ofs;
1303*53ee8cc1Swenshuai.xi static MS_U32 _u32In_buf_MPO_left = 0xFFFFFFFFUL;
1304*53ee8cc1Swenshuai.xi
1305*53ee8cc1Swenshuai.xi static MS_BOOL mpo_load_data = TRUE; //check whether load data when start decode or fill buffer.
1306*53ee8cc1Swenshuai.xi static MS_BOOL bIsMPOFormat = FALSE;
1307*53ee8cc1Swenshuai.xi static MS_U32 u32MPFOffset = 0;
1308*53ee8cc1Swenshuai.xi #endif
1309*53ee8cc1Swenshuai.xi
1310*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
1311*53ee8cc1Swenshuai.xi static MS_U32 u32MeasureDecodeTime;
1312*53ee8cc1Swenshuai.xi static MS_U32 u32MeasureDecodeTimeSW;
1313*53ee8cc1Swenshuai.xi static MS_U32 u32MeasureDecodeTimeHW;
1314*53ee8cc1Swenshuai.xi #endif
1315*53ee8cc1Swenshuai.xi
1316*53ee8cc1Swenshuai.xi static unsigned long u32CRC;
1317*53ee8cc1Swenshuai.xi
verJPD_CRC32_Init(void)1318*53ee8cc1Swenshuai.xi static void verJPD_CRC32_Init(void)
1319*53ee8cc1Swenshuai.xi {
1320*53ee8cc1Swenshuai.xi u32CRC = 0xFFFFFFFF;
1321*53ee8cc1Swenshuai.xi }
1322*53ee8cc1Swenshuai.xi
1323*53ee8cc1Swenshuai.xi
verJPD_CRC32_GetResult(void)1324*53ee8cc1Swenshuai.xi static MS_U32 verJPD_CRC32_GetResult(void)
1325*53ee8cc1Swenshuai.xi {
1326*53ee8cc1Swenshuai.xi return (~u32CRC);
1327*53ee8cc1Swenshuai.xi }
1328*53ee8cc1Swenshuai.xi
1329*53ee8cc1Swenshuai.xi
verJPD_Init_CRC_Table(MS_U32 * u32CRCtemptable)1330*53ee8cc1Swenshuai.xi static void verJPD_Init_CRC_Table(MS_U32 *u32CRCtemptable)
1331*53ee8cc1Swenshuai.xi {
1332*53ee8cc1Swenshuai.xi
1333*53ee8cc1Swenshuai.xi int i,j,tmp, result;
1334*53ee8cc1Swenshuai.xi
1335*53ee8cc1Swenshuai.xi for(i=0;i<=0xFF;i++)
1336*53ee8cc1Swenshuai.xi {
1337*53ee8cc1Swenshuai.xi tmp=i;
1338*53ee8cc1Swenshuai.xi result=0;
1339*53ee8cc1Swenshuai.xi
1340*53ee8cc1Swenshuai.xi for(j=1;j<9;j++)
1341*53ee8cc1Swenshuai.xi {
1342*53ee8cc1Swenshuai.xi if(tmp & 1)
1343*53ee8cc1Swenshuai.xi {
1344*53ee8cc1Swenshuai.xi result |= (1 << (8 - j));
1345*53ee8cc1Swenshuai.xi }
1346*53ee8cc1Swenshuai.xi tmp >>= 1;
1347*53ee8cc1Swenshuai.xi }
1348*53ee8cc1Swenshuai.xi
1349*53ee8cc1Swenshuai.xi u32CRCtemptable[i]=result<<24;
1350*53ee8cc1Swenshuai.xi for(j=0; j<8; j++)
1351*53ee8cc1Swenshuai.xi {
1352*53ee8cc1Swenshuai.xi u32CRCtemptable[i] = (u32CRCtemptable[i] << 1) ^ ((u32CRCtemptable[i] & (1 << 31)) ? 0x04C11DB7 : 0);
1353*53ee8cc1Swenshuai.xi }
1354*53ee8cc1Swenshuai.xi
1355*53ee8cc1Swenshuai.xi tmp=u32CRCtemptable[i];
1356*53ee8cc1Swenshuai.xi result=0;
1357*53ee8cc1Swenshuai.xi
1358*53ee8cc1Swenshuai.xi for(j=1;j<33;j++)
1359*53ee8cc1Swenshuai.xi {
1360*53ee8cc1Swenshuai.xi if(tmp & 1)
1361*53ee8cc1Swenshuai.xi {
1362*53ee8cc1Swenshuai.xi result |= (1 << (32 - j));
1363*53ee8cc1Swenshuai.xi }
1364*53ee8cc1Swenshuai.xi tmp >>= 1;
1365*53ee8cc1Swenshuai.xi }
1366*53ee8cc1Swenshuai.xi u32CRCtemptable[i]=result;
1367*53ee8cc1Swenshuai.xi }
1368*53ee8cc1Swenshuai.xi }
1369*53ee8cc1Swenshuai.xi
verJPD_CRC32_Update(const MS_U8 * pu8Data,MS_U32 u32Size)1370*53ee8cc1Swenshuai.xi static void verJPD_CRC32_Update(const MS_U8 *pu8Data, MS_U32 u32Size)
1371*53ee8cc1Swenshuai.xi {
1372*53ee8cc1Swenshuai.xi MS_U32 u32CRCTable[256];
1373*53ee8cc1Swenshuai.xi MS_U32 u32LoopCounter;
1374*53ee8cc1Swenshuai.xi
1375*53ee8cc1Swenshuai.xi if (pu8Data == NULL || u32Size == 0) return;
1376*53ee8cc1Swenshuai.xi
1377*53ee8cc1Swenshuai.xi verJPD_Init_CRC_Table(u32CRCTable);
1378*53ee8cc1Swenshuai.xi
1379*53ee8cc1Swenshuai.xi #if 0
1380*53ee8cc1Swenshuai.xi int i;
1381*53ee8cc1Swenshuai.xi for(i = 0;i<256;i++)
1382*53ee8cc1Swenshuai.xi {
1383*53ee8cc1Swenshuai.xi printf("0x%08x,\n", u32CRCTable[i]);
1384*53ee8cc1Swenshuai.xi }
1385*53ee8cc1Swenshuai.xi #endif
1386*53ee8cc1Swenshuai.xi
1387*53ee8cc1Swenshuai.xi for (u32LoopCounter=0; u32LoopCounter<u32Size; u32LoopCounter++)
1388*53ee8cc1Swenshuai.xi {
1389*53ee8cc1Swenshuai.xi u32CRC = (u32CRC >> 8) ^ u32CRCTable[ pu8Data[u32LoopCounter] ^ (unsigned char)(u32CRC & 0xFF) ];
1390*53ee8cc1Swenshuai.xi }
1391*53ee8cc1Swenshuai.xi }
1392*53ee8cc1Swenshuai.xi
1393*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1394*53ee8cc1Swenshuai.xi // Local Function Prototypes
1395*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1396*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI - harold
1397*53ee8cc1Swenshuai.xi JPEG_STATIC void MSAPI_MJPEG_Get_Pics(void);
1398*53ee8cc1Swenshuai.xi #endif // not implement for new MDDI - harold
1399*53ee8cc1Swenshuai.xi
1400*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_terminate(JPEG_ErrCode status);
1401*53ee8cc1Swenshuai.xi
1402*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_init(void);
1403*53ee8cc1Swenshuai.xi
1404*53ee8cc1Swenshuai.xi #ifndef CMODEL
1405*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_StartDecode(void);
1406*53ee8cc1Swenshuai.xi #endif
1407*53ee8cc1Swenshuai.xi
1408*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_GetAlignedResolution(MS_U16 *width, MS_U16 *height);
1409*53ee8cc1Swenshuai.xi
1410*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
1411*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_transform_row( void );
1412*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_Result msAPI_JPEG_Baseline_Decode(void);
1413*53ee8cc1Swenshuai.xi #endif //SW_JPD_RGB_CMYK
1414*53ee8cc1Swenshuai.xi
1415*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_GetECS(void);
1416*53ee8cc1Swenshuai.xi
1417*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1418*53ee8cc1Swenshuai.xi // Debug Functions
1419*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1420*53ee8cc1Swenshuai.xi
1421*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1422*53ee8cc1Swenshuai.xi // Local Functions
1423*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1424*53ee8cc1Swenshuai.xi
JPEG_OVER_BUFFER(MS_U32 addr,MS_U32 buf_addr,MS_U32 buf_size)1425*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_OVER_BUFFER(MS_U32 addr, MS_U32 buf_addr, MS_U32 buf_size)
1426*53ee8cc1Swenshuai.xi {
1427*53ee8cc1Swenshuai.xi if((addr < buf_addr)
1428*53ee8cc1Swenshuai.xi || (addr >= (buf_addr+ buf_size)))
1429*53ee8cc1Swenshuai.xi {
1430*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d] invalid address 0x%lx\n", __FUNCTION__, __LINE__, addr);
1431*53ee8cc1Swenshuai.xi return TRUE;
1432*53ee8cc1Swenshuai.xi }
1433*53ee8cc1Swenshuai.xi return FALSE;
1434*53ee8cc1Swenshuai.xi }
1435*53ee8cc1Swenshuai.xi
1436*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1437*53ee8cc1Swenshuai.xi // Refill the input buffer.
1438*53ee8cc1Swenshuai.xi // This method will sit in a loop until (A) the buffer is full or (B)
1439*53ee8cc1Swenshuai.xi // the stream's read() method reports an end of file condition.
JPEG_fill_read_buffer(void)1440*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_fill_read_buffer(void)
1441*53ee8cc1Swenshuai.xi {
1442*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer:\n");
1443*53ee8cc1Swenshuai.xi _u32In_buf_left = 0;
1444*53ee8cc1Swenshuai.xi _pu8In_buf_ofs = _pu8In_buf;
1445*53ee8cc1Swenshuai.xi
1446*53ee8cc1Swenshuai.xi if(_bEOF_flag
1447*53ee8cc1Swenshuai.xi && (FALSE == _bThumbnailAccessMode))
1448*53ee8cc1Swenshuai.xi {
1449*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer : EOF!!!\n");
1450*53ee8cc1Swenshuai.xi return TRUE;
1451*53ee8cc1Swenshuai.xi }
1452*53ee8cc1Swenshuai.xi
1453*53ee8cc1Swenshuai.xi if(_bThumbnailAccessMode)
1454*53ee8cc1Swenshuai.xi {
1455*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Fill Thumbnail, buffer left = %ld, buffer offset = %ld\n", _u16ThumbnailBufferSize, _u32ThumbnailBufferOffset);
1456*53ee8cc1Swenshuai.xi if(_u16ThumbnailBufferSize>=MRC_BUFFER_SIZE)
1457*53ee8cc1Swenshuai.xi {
1458*53ee8cc1Swenshuai.xi JPEG_memcpy((void *)(_pu8In_buf + _u32In_buf_left), (void *)(INTERNAL_BUFFER_ADDR + _u32ThumbnailBufferOffset), MRC_BUFFER_SIZE);
1459*53ee8cc1Swenshuai.xi _u32In_buf_left = MRC_BUFFER_SIZE;
1460*53ee8cc1Swenshuai.xi _u32ThumbnailBufferOffset += MRC_BUFFER_SIZE;
1461*53ee8cc1Swenshuai.xi _u16ThumbnailBufferSize -= MRC_BUFFER_SIZE;
1462*53ee8cc1Swenshuai.xi }
1463*53ee8cc1Swenshuai.xi else
1464*53ee8cc1Swenshuai.xi {
1465*53ee8cc1Swenshuai.xi JPEG_memcpy((void *)(_pu8In_buf + _u32In_buf_left), (void *)(INTERNAL_BUFFER_ADDR + _u32ThumbnailBufferOffset), _u16ThumbnailBufferSize);
1466*53ee8cc1Swenshuai.xi _bEOF_flag = TRUE;
1467*53ee8cc1Swenshuai.xi _u32In_buf_left = _u16ThumbnailBufferSize;
1468*53ee8cc1Swenshuai.xi _u32ThumbnailBufferOffset += _u16ThumbnailBufferSize;
1469*53ee8cc1Swenshuai.xi _u16ThumbnailBufferSize = 0;
1470*53ee8cc1Swenshuai.xi }
1471*53ee8cc1Swenshuai.xi }
1472*53ee8cc1Swenshuai.xi else
1473*53ee8cc1Swenshuai.xi {
1474*53ee8cc1Swenshuai.xi if(_pFillHdrFunc)
1475*53ee8cc1Swenshuai.xi {
1476*53ee8cc1Swenshuai.xi MS_S32 byte_read = _pFillHdrFunc((MS_PHYADDR)MS_VA2PA((MS_U32)_pu8In_buf), MRC_BUFFER_SIZE);
1477*53ee8cc1Swenshuai.xi if(byte_read < 0)
1478*53ee8cc1Swenshuai.xi {
1479*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_STREAM_READ);
1480*53ee8cc1Swenshuai.xi return FALSE;
1481*53ee8cc1Swenshuai.xi }
1482*53ee8cc1Swenshuai.xi _u32In_buf_left = byte_read;
1483*53ee8cc1Swenshuai.xi }
1484*53ee8cc1Swenshuai.xi else
1485*53ee8cc1Swenshuai.xi {
1486*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_pFillHdrFunc is not registered!!\n");
1487*53ee8cc1Swenshuai.xi if (bMHEG5)
1488*53ee8cc1Swenshuai.xi {
1489*53ee8cc1Swenshuai.xi _u32In_buf_left = MRC_BUFFER_SIZE;
1490*53ee8cc1Swenshuai.xi }
1491*53ee8cc1Swenshuai.xi else
1492*53ee8cc1Swenshuai.xi {
1493*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_NOT_ENOUGH_HEADER_INFO);
1494*53ee8cc1Swenshuai.xi return FALSE;
1495*53ee8cc1Swenshuai.xi }
1496*53ee8cc1Swenshuai.xi }
1497*53ee8cc1Swenshuai.xi }
1498*53ee8cc1Swenshuai.xi #if 0
1499*53ee8cc1Swenshuai.xi else
1500*53ee8cc1Swenshuai.xi {
1501*53ee8cc1Swenshuai.xi do
1502*53ee8cc1Swenshuai.xi {
1503*53ee8cc1Swenshuai.xi MS_S32 bytes_read = _pStream->read( _pu8In_buf + _u32In_buf_left, MRC_BUFFER_SIZE - _u32In_buf_left, &_bEOF_flag, _pStream);//, 0 );
1504*53ee8cc1Swenshuai.xi if ( bytes_read == -1 )
1505*53ee8cc1Swenshuai.xi {
1506*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_STREAM_READ );
1507*53ee8cc1Swenshuai.xi }
1508*53ee8cc1Swenshuai.xi _u32In_buf_left += bytes_read;
1509*53ee8cc1Swenshuai.xi //// _Total_Decoded_Size += bytes_read;
1510*53ee8cc1Swenshuai.xi } while ( ( _u32In_buf_left < MRC_BUFFER_SIZE ) && ( !_bEOF_flag ) );
1511*53ee8cc1Swenshuai.xi }
1512*53ee8cc1Swenshuai.xi
1513*53ee8cc1Swenshuai.xi _u32Total_bytes_read += _u32In_buf_left;
1514*53ee8cc1Swenshuai.xi #endif
1515*53ee8cc1Swenshuai.xi
1516*53ee8cc1Swenshuai.xi u32DataOffset += MRC_BUFFER_SIZE;
1517*53ee8cc1Swenshuai.xi return TRUE;
1518*53ee8cc1Swenshuai.xi }
JPEG_force_fill_read_buffer(MS_U32 u32Size)1519*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_force_fill_read_buffer(MS_U32 u32Size)
1520*53ee8cc1Swenshuai.xi {
1521*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer:\n");
1522*53ee8cc1Swenshuai.xi _u32In_buf_left = u32Size;
1523*53ee8cc1Swenshuai.xi _pu8In_buf_ofs = _pu8In_buf;
1524*53ee8cc1Swenshuai.xi
1525*53ee8cc1Swenshuai.xi if(_bEOF_flag)
1526*53ee8cc1Swenshuai.xi {
1527*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer : EOF!!!\n");
1528*53ee8cc1Swenshuai.xi return TRUE;
1529*53ee8cc1Swenshuai.xi }
1530*53ee8cc1Swenshuai.xi
1531*53ee8cc1Swenshuai.xi if(_pFillHdrFunc)
1532*53ee8cc1Swenshuai.xi {
1533*53ee8cc1Swenshuai.xi MS_S32 byte_read = 0;
1534*53ee8cc1Swenshuai.xi if((MRC_BUFFER_SIZE-u32Size) > 0)
1535*53ee8cc1Swenshuai.xi {
1536*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("[VA] _pu8In_buf=0x%lx\n", (MS_U32)_pu8In_buf);
1537*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("[PA] _pu8In_buf=0x%lx\n", MS_VA2PA((MS_U32)_pu8In_buf));
1538*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("[PA] callback addr=0x%lx\n", (MS_VA2PA((MS_U32)_pu8In_buf)+u32Size));
1539*53ee8cc1Swenshuai.xi byte_read = _pFillHdrFunc((MS_PHYADDR)(MS_VA2PA((MS_U32)_pu8In_buf)+u32Size), MRC_BUFFER_SIZE-u32Size);
1540*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@@@fill byte_read=0x%lx\n", byte_read);
1541*53ee8cc1Swenshuai.xi }
1542*53ee8cc1Swenshuai.xi
1543*53ee8cc1Swenshuai.xi if(byte_read < 0)
1544*53ee8cc1Swenshuai.xi {
1545*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_STREAM_READ);
1546*53ee8cc1Swenshuai.xi return FALSE;
1547*53ee8cc1Swenshuai.xi }
1548*53ee8cc1Swenshuai.xi _u32In_buf_left += byte_read;
1549*53ee8cc1Swenshuai.xi }
1550*53ee8cc1Swenshuai.xi else
1551*53ee8cc1Swenshuai.xi {
1552*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_pFillHdrFunc is not registered!!\n");
1553*53ee8cc1Swenshuai.xi return FALSE;
1554*53ee8cc1Swenshuai.xi }
1555*53ee8cc1Swenshuai.xi
1556*53ee8cc1Swenshuai.xi return TRUE;
1557*53ee8cc1Swenshuai.xi }
1558*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1559*53ee8cc1Swenshuai.xi // Logical rotate left operation.
JPEG_rol(MS_U32 i,MS_U8 j)1560*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_rol(MS_U32 i, MS_U8 j)
1561*53ee8cc1Swenshuai.xi {
1562*53ee8cc1Swenshuai.xi return ( ( i << j ) | ( i >> ( 32 - j ) ) );
1563*53ee8cc1Swenshuai.xi }
1564*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1565*53ee8cc1Swenshuai.xi // Retrieve one character from the input stream.
JPEG_get_char(void)1566*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 JPEG_get_char(void)
1567*53ee8cc1Swenshuai.xi {
1568*53ee8cc1Swenshuai.xi MS_U8 c;
1569*53ee8cc1Swenshuai.xi
1570*53ee8cc1Swenshuai.xi // Any bytes remaining in buffer?
1571*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
1572*53ee8cc1Swenshuai.xi {
1573*53ee8cc1Swenshuai.xi // Try to get more bytes.
1574*53ee8cc1Swenshuai.xi if(!JPEG_fill_read_buffer())
1575*53ee8cc1Swenshuai.xi {
1576*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_get_char : JPEG_fill_read_buffer failed!!!\n");
1577*53ee8cc1Swenshuai.xi _u32In_buf_left = 0;
1578*53ee8cc1Swenshuai.xi }
1579*53ee8cc1Swenshuai.xi // Still nothing to get?
1580*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
1581*53ee8cc1Swenshuai.xi {
1582*53ee8cc1Swenshuai.xi // Padd the end of the stream with 0xFF 0xD9 (EOI marker)
1583*53ee8cc1Swenshuai.xi // FIXME: Is there a better padding pattern to use?
1584*53ee8cc1Swenshuai.xi MS_U8 t = _u8Tem_flag;
1585*53ee8cc1Swenshuai.xi _u8Tem_flag ^= 1;
1586*53ee8cc1Swenshuai.xi if ( t )
1587*53ee8cc1Swenshuai.xi {
1588*53ee8cc1Swenshuai.xi return ( 0xD9 );
1589*53ee8cc1Swenshuai.xi }
1590*53ee8cc1Swenshuai.xi else
1591*53ee8cc1Swenshuai.xi {
1592*53ee8cc1Swenshuai.xi return ( 0xFF );
1593*53ee8cc1Swenshuai.xi }
1594*53ee8cc1Swenshuai.xi }
1595*53ee8cc1Swenshuai.xi }
1596*53ee8cc1Swenshuai.xi
1597*53ee8cc1Swenshuai.xi c = *_pu8In_buf_ofs++;
1598*53ee8cc1Swenshuai.xi _u32In_buf_left--;
1599*53ee8cc1Swenshuai.xi
1600*53ee8cc1Swenshuai.xi return ( c );
1601*53ee8cc1Swenshuai.xi }
1602*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1603*53ee8cc1Swenshuai.xi // Same as previus method, except can indicate if the character is
1604*53ee8cc1Swenshuai.xi // a "padd" character or not.
JPEG_get_charP(MS_BOOL * Ppadding_flag)1605*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 JPEG_get_charP(MS_BOOL *Ppadding_flag)
1606*53ee8cc1Swenshuai.xi {
1607*53ee8cc1Swenshuai.xi MS_U8 c;
1608*53ee8cc1Swenshuai.xi
1609*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
1610*53ee8cc1Swenshuai.xi {
1611*53ee8cc1Swenshuai.xi if(!JPEG_fill_read_buffer())
1612*53ee8cc1Swenshuai.xi {
1613*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_get_charP : JPEG_fill_read_buffer failed!!!\n");
1614*53ee8cc1Swenshuai.xi _u32In_buf_left = 0;
1615*53ee8cc1Swenshuai.xi }
1616*53ee8cc1Swenshuai.xi
1617*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
1618*53ee8cc1Swenshuai.xi {
1619*53ee8cc1Swenshuai.xi *Ppadding_flag = TRUE;
1620*53ee8cc1Swenshuai.xi #if 1
1621*53ee8cc1Swenshuai.xi _u8Tem_flag ^= 1;
1622*53ee8cc1Swenshuai.xi // This function is called during when progressive huffman decoding
1623*53ee8cc1Swenshuai.xi // Should not padding 0xFFD9 at this state
1624*53ee8cc1Swenshuai.xi return 0;
1625*53ee8cc1Swenshuai.xi #else
1626*53ee8cc1Swenshuai.xi MS_U8 t;
1627*53ee8cc1Swenshuai.xi t = _u8Tem_flag;
1628*53ee8cc1Swenshuai.xi _u8Tem_flag ^= 1;
1629*53ee8cc1Swenshuai.xi if ( t )
1630*53ee8cc1Swenshuai.xi {
1631*53ee8cc1Swenshuai.xi return ( 0xD9 );
1632*53ee8cc1Swenshuai.xi }
1633*53ee8cc1Swenshuai.xi else
1634*53ee8cc1Swenshuai.xi {
1635*53ee8cc1Swenshuai.xi return ( 0xFF );
1636*53ee8cc1Swenshuai.xi }
1637*53ee8cc1Swenshuai.xi #endif
1638*53ee8cc1Swenshuai.xi }
1639*53ee8cc1Swenshuai.xi }
1640*53ee8cc1Swenshuai.xi
1641*53ee8cc1Swenshuai.xi *Ppadding_flag = FALSE;
1642*53ee8cc1Swenshuai.xi
1643*53ee8cc1Swenshuai.xi c = *_pu8In_buf_ofs++;
1644*53ee8cc1Swenshuai.xi _u32In_buf_left--;
1645*53ee8cc1Swenshuai.xi
1646*53ee8cc1Swenshuai.xi return ( c );
1647*53ee8cc1Swenshuai.xi }
1648*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1649*53ee8cc1Swenshuai.xi // Inserts a previously retrieved character back into the input buffer.
JPEG_stuff_char(MS_U8 q)1650*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_stuff_char(MS_U8 q)
1651*53ee8cc1Swenshuai.xi {
1652*53ee8cc1Swenshuai.xi *( --_pu8In_buf_ofs ) = q;
1653*53ee8cc1Swenshuai.xi _u32In_buf_left++;
1654*53ee8cc1Swenshuai.xi }
1655*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1656*53ee8cc1Swenshuai.xi // Retrieves one character from the input stream, but does
1657*53ee8cc1Swenshuai.xi // not read past markers. Will continue to return 0xFF when a
1658*53ee8cc1Swenshuai.xi // marker is encountered.
1659*53ee8cc1Swenshuai.xi // FIXME: Bad name?
JPEG_get_octet(void)1660*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U8 JPEG_get_octet(void)
1661*53ee8cc1Swenshuai.xi {
1662*53ee8cc1Swenshuai.xi MS_BOOL padding_flag;
1663*53ee8cc1Swenshuai.xi MS_U8 c = JPEG_get_charP( &padding_flag );
1664*53ee8cc1Swenshuai.xi
1665*53ee8cc1Swenshuai.xi if ( c == 0xFF )
1666*53ee8cc1Swenshuai.xi {
1667*53ee8cc1Swenshuai.xi if ( padding_flag )
1668*53ee8cc1Swenshuai.xi {
1669*53ee8cc1Swenshuai.xi return ( 0xFF );
1670*53ee8cc1Swenshuai.xi }
1671*53ee8cc1Swenshuai.xi
1672*53ee8cc1Swenshuai.xi c = JPEG_get_charP( &padding_flag );
1673*53ee8cc1Swenshuai.xi if ( padding_flag )
1674*53ee8cc1Swenshuai.xi {
1675*53ee8cc1Swenshuai.xi JPEG_stuff_char( 0xFF );
1676*53ee8cc1Swenshuai.xi return ( 0xFF );
1677*53ee8cc1Swenshuai.xi }
1678*53ee8cc1Swenshuai.xi
1679*53ee8cc1Swenshuai.xi if ( c == 0x00 )
1680*53ee8cc1Swenshuai.xi {
1681*53ee8cc1Swenshuai.xi return ( 0xFF );
1682*53ee8cc1Swenshuai.xi }
1683*53ee8cc1Swenshuai.xi else
1684*53ee8cc1Swenshuai.xi {
1685*53ee8cc1Swenshuai.xi JPEG_stuff_char( c );
1686*53ee8cc1Swenshuai.xi JPEG_stuff_char( 0xFF );
1687*53ee8cc1Swenshuai.xi return ( 0xFF );
1688*53ee8cc1Swenshuai.xi }
1689*53ee8cc1Swenshuai.xi }
1690*53ee8cc1Swenshuai.xi
1691*53ee8cc1Swenshuai.xi return ( c );
1692*53ee8cc1Swenshuai.xi }
1693*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1694*53ee8cc1Swenshuai.xi // Retrieves a variable number of bits from the input stream.
1695*53ee8cc1Swenshuai.xi // Markers will not be read into the input bit buffer. Instead,
1696*53ee8cc1Swenshuai.xi // an infinite number of all 1's will be returned when a marker
1697*53ee8cc1Swenshuai.xi // is encountered.
1698*53ee8cc1Swenshuai.xi // FIXME: Is it better to return all 0's instead, like the older implementation?
JPEG_get_bits_2(MS_U8 numbits)1699*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_get_bits_2(MS_U8 numbits)
1700*53ee8cc1Swenshuai.xi {
1701*53ee8cc1Swenshuai.xi MS_U32 i, c1, c2;
1702*53ee8cc1Swenshuai.xi
1703*53ee8cc1Swenshuai.xi i = ( _u32Bit_buf >> ( 16 - numbits ) ) & ( ( 1 << numbits ) - 1 );
1704*53ee8cc1Swenshuai.xi
1705*53ee8cc1Swenshuai.xi _s16Bits_left -= numbits;
1706*53ee8cc1Swenshuai.xi if ( _s16Bits_left <= 0 )
1707*53ee8cc1Swenshuai.xi {
1708*53ee8cc1Swenshuai.xi _u32Bit_buf = JPEG_rol( _u32Bit_buf, numbits += _s16Bits_left );
1709*53ee8cc1Swenshuai.xi
1710*53ee8cc1Swenshuai.xi c1 = JPEG_get_octet();
1711*53ee8cc1Swenshuai.xi c2 = JPEG_get_octet();
1712*53ee8cc1Swenshuai.xi
1713*53ee8cc1Swenshuai.xi _u32Bit_buf = ( _u32Bit_buf & 0xFFFF ) | ( ( ( MS_U32 )c1 ) << 24 ) | ( ( ( MS_U32 )c2 ) << 16 );
1714*53ee8cc1Swenshuai.xi
1715*53ee8cc1Swenshuai.xi _u32Bit_buf = JPEG_rol( _u32Bit_buf, -_s16Bits_left );
1716*53ee8cc1Swenshuai.xi
1717*53ee8cc1Swenshuai.xi _s16Bits_left += 16;
1718*53ee8cc1Swenshuai.xi }
1719*53ee8cc1Swenshuai.xi else
1720*53ee8cc1Swenshuai.xi {
1721*53ee8cc1Swenshuai.xi _u32Bit_buf = JPEG_rol( _u32Bit_buf, numbits );
1722*53ee8cc1Swenshuai.xi }
1723*53ee8cc1Swenshuai.xi
1724*53ee8cc1Swenshuai.xi return i;
1725*53ee8cc1Swenshuai.xi }
1726*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1727*53ee8cc1Swenshuai.xi // Decodes a Huffman encoded symbol.
JPEG_huff_decode(JPEG_HuffTbl * Ph)1728*53ee8cc1Swenshuai.xi JPEG_STATIC MS_S32 JPEG_huff_decode(JPEG_HuffTbl *Ph)
1729*53ee8cc1Swenshuai.xi {
1730*53ee8cc1Swenshuai.xi MS_S32 symbol;
1731*53ee8cc1Swenshuai.xi
1732*53ee8cc1Swenshuai.xi // Check first 8-bits: do we have a complete symbol?
1733*53ee8cc1Swenshuai.xi symbol = Ph->s16Look_up[( _u32Bit_buf >> 8 ) & 0xFF];
1734*53ee8cc1Swenshuai.xi if ( symbol < 0 )
1735*53ee8cc1Swenshuai.xi {
1736*53ee8cc1Swenshuai.xi // Decode more bits, use a tree traversal to find symbol.
1737*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 8 );
1738*53ee8cc1Swenshuai.xi
1739*53ee8cc1Swenshuai.xi do
1740*53ee8cc1Swenshuai.xi {
1741*53ee8cc1Swenshuai.xi symbol = Ph->s16Tree[~symbol + ( 1 - JPEG_get_bits_2( 1 ) )];
1742*53ee8cc1Swenshuai.xi }
1743*53ee8cc1Swenshuai.xi while ( symbol < 0 );
1744*53ee8cc1Swenshuai.xi }
1745*53ee8cc1Swenshuai.xi else
1746*53ee8cc1Swenshuai.xi {
1747*53ee8cc1Swenshuai.xi JPEG_get_bits_2( Ph->u8Code_size[symbol] );
1748*53ee8cc1Swenshuai.xi }
1749*53ee8cc1Swenshuai.xi
1750*53ee8cc1Swenshuai.xi return symbol;
1751*53ee8cc1Swenshuai.xi }
1752*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1753*53ee8cc1Swenshuai.xi // Unconditionally frees all allocated blocks.
JPEG_free_all_blocks(void)1754*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_free_all_blocks(void)
1755*53ee8cc1Swenshuai.xi {
1756*53ee8cc1Swenshuai.xi MS_U8 i;
1757*53ee8cc1Swenshuai.xi #if 0
1758*53ee8cc1Swenshuai.xi if ( _pStream )
1759*53ee8cc1Swenshuai.xi {
1760*53ee8cc1Swenshuai.xi _pStream = NULL;
1761*53ee8cc1Swenshuai.xi }
1762*53ee8cc1Swenshuai.xi #endif
1763*53ee8cc1Swenshuai.xi for ( i = 0; i < JPEG_MAXBLOCKS; i++ )
1764*53ee8cc1Swenshuai.xi {
1765*53ee8cc1Swenshuai.xi if(_pBlocks[i]!=NULL)
1766*53ee8cc1Swenshuai.xi JPEG_MEMORY_free( _pBlocks[i] );
1767*53ee8cc1Swenshuai.xi
1768*53ee8cc1Swenshuai.xi _pBlocks[i] = NULL;
1769*53ee8cc1Swenshuai.xi }
1770*53ee8cc1Swenshuai.xi }
1771*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1772*53ee8cc1Swenshuai.xi // This method handles all errors.
1773*53ee8cc1Swenshuai.xi // It could easily be changed to use C++ exceptions.
JPEG_terminate(JPEG_ErrCode status)1774*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_terminate(JPEG_ErrCode status)
1775*53ee8cc1Swenshuai.xi {
1776*53ee8cc1Swenshuai.xi _Error_code = status;
1777*53ee8cc1Swenshuai.xi
1778*53ee8cc1Swenshuai.xi JPEG_free_all_blocks();
1779*53ee8cc1Swenshuai.xi
1780*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s:ERROR= %d\n", __FUNCTION__, _Error_code);
1781*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
1782*53ee8cc1Swenshuai.xi longjmp( _jmp_state, status );
1783*53ee8cc1Swenshuai.xi #endif
1784*53ee8cc1Swenshuai.xi }
1785*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1786*53ee8cc1Swenshuai.xi // Allocate a block of memory-- store block's address in list for
1787*53ee8cc1Swenshuai.xi // later deallocation by JPEG_free_all_blocks().
JPEG_alloc(MS_U32 n)1788*53ee8cc1Swenshuai.xi JPEG_STATIC void * JPEG_alloc(MS_U32 n)
1789*53ee8cc1Swenshuai.xi {
1790*53ee8cc1Swenshuai.xi MS_U8 i;
1791*53ee8cc1Swenshuai.xi void *q;
1792*53ee8cc1Swenshuai.xi
1793*53ee8cc1Swenshuai.xi // Find a free slot. The number of allocated slots will
1794*53ee8cc1Swenshuai.xi // always be very low, so a linear search is good enough.
1795*53ee8cc1Swenshuai.xi for ( i = 0; i < JPEG_MAXBLOCKS; i++ )
1796*53ee8cc1Swenshuai.xi {
1797*53ee8cc1Swenshuai.xi if ( _pBlocks[i] == NULL )
1798*53ee8cc1Swenshuai.xi {
1799*53ee8cc1Swenshuai.xi break;
1800*53ee8cc1Swenshuai.xi }
1801*53ee8cc1Swenshuai.xi }
1802*53ee8cc1Swenshuai.xi
1803*53ee8cc1Swenshuai.xi if ( i >= JPEG_MAXBLOCKS )
1804*53ee8cc1Swenshuai.xi {
1805*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_TOO_MANY_BLOCKS );
1806*53ee8cc1Swenshuai.xi return NULL;
1807*53ee8cc1Swenshuai.xi }
1808*53ee8cc1Swenshuai.xi
1809*53ee8cc1Swenshuai.xi //FixMe: eCos does not support aligned allocate ???
1810*53ee8cc1Swenshuai.xi q = JPEG_MEMORY_malloc( n + 8 );
1811*53ee8cc1Swenshuai.xi //q = MsOS_AllocateAlignedMemory(n+8, 8, gs32CachedPoolID);
1812*53ee8cc1Swenshuai.xi //q = MsOS_AllocateMemory(n+8, gs32CachedPoolID);
1813*53ee8cc1Swenshuai.xi
1814*53ee8cc1Swenshuai.xi if ( q == NULL )
1815*53ee8cc1Swenshuai.xi {
1816*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOTENOUGHMEM );
1817*53ee8cc1Swenshuai.xi return NULL;
1818*53ee8cc1Swenshuai.xi }
1819*53ee8cc1Swenshuai.xi
1820*53ee8cc1Swenshuai.xi JPEG_memset((void *)q, 0, n + 8 );
1821*53ee8cc1Swenshuai.xi
1822*53ee8cc1Swenshuai.xi _pBlocks[i] = q;
1823*53ee8cc1Swenshuai.xi
1824*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG %ld bytes allocated\n", n);
1825*53ee8cc1Swenshuai.xi
1826*53ee8cc1Swenshuai.xi return ( ( void* )q );
1827*53ee8cc1Swenshuai.xi }
1828*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_Tiff_EndianChangeL(MS_U32 u32Val)1829*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_Tiff_EndianChangeL(MS_U32 u32Val)
1830*53ee8cc1Swenshuai.xi {
1831*53ee8cc1Swenshuai.xi if (_bTiffBigEndian)
1832*53ee8cc1Swenshuai.xi return EndianChangeL(u32Val);
1833*53ee8cc1Swenshuai.xi else
1834*53ee8cc1Swenshuai.xi return u32Val;
1835*53ee8cc1Swenshuai.xi }
1836*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_Tiff_EndianChangeS(MS_U16 u16Val)1837*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_Tiff_EndianChangeS(MS_U16 u16Val)
1838*53ee8cc1Swenshuai.xi {
1839*53ee8cc1Swenshuai.xi if (_bTiffBigEndian)
1840*53ee8cc1Swenshuai.xi return EndianChangeS(u16Val);
1841*53ee8cc1Swenshuai.xi else
1842*53ee8cc1Swenshuai.xi return u16Val;
1843*53ee8cc1Swenshuai.xi }
1844*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_GetU16(MS_U8 * data)1845*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U16 JPEG_GetU16(MS_U8 *data)
1846*53ee8cc1Swenshuai.xi {
1847*53ee8cc1Swenshuai.xi MS_S8 i;
1848*53ee8cc1Swenshuai.xi MS_U16 val = 0;
1849*53ee8cc1Swenshuai.xi
1850*53ee8cc1Swenshuai.xi for(i = 1; i>=0; i--)
1851*53ee8cc1Swenshuai.xi val = (val << 8) + (MS_U8) *(data + i);
1852*53ee8cc1Swenshuai.xi
1853*53ee8cc1Swenshuai.xi
1854*53ee8cc1Swenshuai.xi return val;
1855*53ee8cc1Swenshuai.xi }
1856*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_GetU32(MS_U8 * data)1857*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_GetU32(MS_U8 *data)
1858*53ee8cc1Swenshuai.xi {
1859*53ee8cc1Swenshuai.xi MS_S8 i;
1860*53ee8cc1Swenshuai.xi MS_U32 val = 0;
1861*53ee8cc1Swenshuai.xi
1862*53ee8cc1Swenshuai.xi for(i = 3; i>=0; i--)
1863*53ee8cc1Swenshuai.xi val = (val << 8) + (MS_U8) *(data + i);
1864*53ee8cc1Swenshuai.xi
1865*53ee8cc1Swenshuai.xi return val;
1866*53ee8cc1Swenshuai.xi }
1867*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1868*53ee8cc1Swenshuai.xi //***************************************************
1869*53ee8cc1Swenshuai.xi //Parse EXIF header
1870*53ee8cc1Swenshuai.xi //***************************************************
JPEG_DecodeExifInfo(MS_U8 * data,MS_U32 data_length)1871*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_DecodeExifInfo(MS_U8 *data, MS_U32 data_length)
1872*53ee8cc1Swenshuai.xi {
1873*53ee8cc1Swenshuai.xi MS_U8 *pJpegBuff = data;
1874*53ee8cc1Swenshuai.xi // MS_U32 u32tmp, u32Len;
1875*53ee8cc1Swenshuai.xi MS_U32 u32tmp;
1876*53ee8cc1Swenshuai.xi MS_U16 u16Marker, u16Len, u16NumOfEntry, i;
1877*53ee8cc1Swenshuai.xi MS_U8 *pTiffHdrPtr, *pNextIfd;
1878*53ee8cc1Swenshuai.xi MS_U32 u32DataValue;
1879*53ee8cc1Swenshuai.xi MS_U8 *pExifHdr = NULL, *pExifHdrOffet = NULL;
1880*53ee8cc1Swenshuai.xi MS_BOOL bIFD_pt_found = FALSE;
1881*53ee8cc1Swenshuai.xi
1882*53ee8cc1Swenshuai.xi u32tmp = JPEG_GetU32(pJpegBuff);
1883*53ee8cc1Swenshuai.xi if (JPEG_TAG_EXIF != u32tmp)
1884*53ee8cc1Swenshuai.xi {
1885*53ee8cc1Swenshuai.xi return FALSE;
1886*53ee8cc1Swenshuai.xi }
1887*53ee8cc1Swenshuai.xi
1888*53ee8cc1Swenshuai.xi // Exif starts here
1889*53ee8cc1Swenshuai.xi pJpegBuff += 6;
1890*53ee8cc1Swenshuai.xi pExifHdr = pJpegBuff;
1891*53ee8cc1Swenshuai.xi u16Marker = JPEG_GetU16(pJpegBuff);
1892*53ee8cc1Swenshuai.xi if (JPEG_TIFF_BIG_ENDIAN == u16Marker)
1893*53ee8cc1Swenshuai.xi _bTiffBigEndian = TRUE;
1894*53ee8cc1Swenshuai.xi else if (JPEG_TIFF_LITTLE_ENDIAN == u16Marker)
1895*53ee8cc1Swenshuai.xi _bTiffBigEndian = FALSE;
1896*53ee8cc1Swenshuai.xi else
1897*53ee8cc1Swenshuai.xi return FALSE;
1898*53ee8cc1Swenshuai.xi
1899*53ee8cc1Swenshuai.xi _u32ThumbnailOffset += 6;
1900*53ee8cc1Swenshuai.xi pTiffHdrPtr = pJpegBuff;
1901*53ee8cc1Swenshuai.xi
1902*53ee8cc1Swenshuai.xi pJpegBuff += 2;
1903*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1904*53ee8cc1Swenshuai.xi if (u16Marker != 0x002A)
1905*53ee8cc1Swenshuai.xi return FALSE;
1906*53ee8cc1Swenshuai.xi
1907*53ee8cc1Swenshuai.xi pJpegBuff += 2;
1908*53ee8cc1Swenshuai.xi u16Len = (MS_U16)JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
1909*53ee8cc1Swenshuai.xi pJpegBuff += (u16Len - 4); //ENDIAN(2byte) + 0x002A(2byte)
1910*53ee8cc1Swenshuai.xi
1911*53ee8cc1Swenshuai.xi // 0th IFD start here
1912*53ee8cc1Swenshuai.xi u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1913*53ee8cc1Swenshuai.xi pJpegBuff += 2;
1914*53ee8cc1Swenshuai.xi
1915*53ee8cc1Swenshuai.xi // Boundary check, prevent from buffer over-run
1916*53ee8cc1Swenshuai.xi if((((MS_U32) pJpegBuff) - INTERNAL_BUFFER_ADDR + u16NumOfEntry*12)>=data_length)
1917*53ee8cc1Swenshuai.xi {
1918*53ee8cc1Swenshuai.xi return FALSE;
1919*53ee8cc1Swenshuai.xi }
1920*53ee8cc1Swenshuai.xi
1921*53ee8cc1Swenshuai.xi // pJpegBuff += 12*u16NumOfEntry;
1922*53ee8cc1Swenshuai.xi
1923*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("IFD0 : u16NumOfEntry = %d\n", u16NumOfEntry);
1924*53ee8cc1Swenshuai.xi
1925*53ee8cc1Swenshuai.xi //Retrieve orientation
1926*53ee8cc1Swenshuai.xi for(i = 0; i < u16NumOfEntry; i++)
1927*53ee8cc1Swenshuai.xi {
1928*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1929*53ee8cc1Swenshuai.xi pJpegBuff += 8;
1930*53ee8cc1Swenshuai.xi
1931*53ee8cc1Swenshuai.xi if((JPEG_EXIF_TAG_ORIENTATION == u16Marker)
1932*53ee8cc1Swenshuai.xi && (E_JPEG_EXIF_ORIENT_NOT_FOUND == _eEXIF_Orientation))
1933*53ee8cc1Swenshuai.xi {
1934*53ee8cc1Swenshuai.xi //The datatype of orientation is short
1935*53ee8cc1Swenshuai.xi u32DataValue = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1936*53ee8cc1Swenshuai.xi if((E_JPEG_EXIF_ORIENT_ROTATE_0 > u32DataValue)
1937*53ee8cc1Swenshuai.xi || (E_JPEG_EXIF_ORIENT_ROTATE_270 < u32DataValue))
1938*53ee8cc1Swenshuai.xi {
1939*53ee8cc1Swenshuai.xi _eEXIF_Orientation = E_JPEG_EXIF_ORIENT_RESERVED;
1940*53ee8cc1Swenshuai.xi }
1941*53ee8cc1Swenshuai.xi else
1942*53ee8cc1Swenshuai.xi {
1943*53ee8cc1Swenshuai.xi _eEXIF_Orientation = (JPEG_EXIF_Orientation)u32DataValue;
1944*53ee8cc1Swenshuai.xi }
1945*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", _eEXIF_Orientation);
1946*53ee8cc1Swenshuai.xi }
1947*53ee8cc1Swenshuai.xi else if(JPEG_EXIF_TAG_IFD_POINTER == u16Marker)
1948*53ee8cc1Swenshuai.xi {
1949*53ee8cc1Swenshuai.xi bIFD_pt_found = TRUE;
1950*53ee8cc1Swenshuai.xi //datavalue is an offset from exif marker for datetime
1951*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
1952*53ee8cc1Swenshuai.xi pExifHdrOffet = pExifHdr + u32DataValue;
1953*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifHdrOffet, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
1954*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Exif IFD pointer = 0x%lx\n", (MS_U32)pExifHdrOffet);
1955*53ee8cc1Swenshuai.xi }
1956*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
1957*53ee8cc1Swenshuai.xi else if(JPEG_EXIF_TAG_MANUFACTURER == u16Marker)
1958*53ee8cc1Swenshuai.xi {
1959*53ee8cc1Swenshuai.xi MS_U8 *pIFDPtrOffset;
1960*53ee8cc1Swenshuai.xi pIFDPtrOffset = pJpegBuff;
1961*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pIFDPtrOffset));
1962*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MANUFACTURER Offset = 0x%lx\n", u32DataValue);
1963*53ee8cc1Swenshuai.xi pIFDPtrOffset = pExifHdr + u32DataValue;
1964*53ee8cc1Swenshuai.xi if(JPEG_OVER_BUFFER((MS_U32)pIFDPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE))
1965*53ee8cc1Swenshuai.xi {
1966*53ee8cc1Swenshuai.xi pJpegBuff += 4;
1967*53ee8cc1Swenshuai.xi continue;
1968*53ee8cc1Swenshuai.xi }
1969*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("MANUFACTURER addr = 0x%lx\n", (MS_U32)pIFDPtrOffset);
1970*53ee8cc1Swenshuai.xi MS_U8 u8i=0;
1971*53ee8cc1Swenshuai.xi while(*(pIFDPtrOffset+u8i) && u8i<JPEG_MANUFACTURER_SIZE)
1972*53ee8cc1Swenshuai.xi {
1973*53ee8cc1Swenshuai.xi _u8EXIF_Manufacturer[u8i] = *(pIFDPtrOffset+u8i);
1974*53ee8cc1Swenshuai.xi u8i++;
1975*53ee8cc1Swenshuai.xi }
1976*53ee8cc1Swenshuai.xi }
1977*53ee8cc1Swenshuai.xi else if(JPEG_EXIF_TAG_MODEL== u16Marker)
1978*53ee8cc1Swenshuai.xi {
1979*53ee8cc1Swenshuai.xi MS_U8 *pIFDPtrOffset;
1980*53ee8cc1Swenshuai.xi pIFDPtrOffset = pJpegBuff;
1981*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pIFDPtrOffset));
1982*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MODEL Offset = 0x%lx\n", u32DataValue);
1983*53ee8cc1Swenshuai.xi pIFDPtrOffset = pExifHdr + u32DataValue;
1984*53ee8cc1Swenshuai.xi if(JPEG_OVER_BUFFER((MS_U32)pIFDPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE))
1985*53ee8cc1Swenshuai.xi {
1986*53ee8cc1Swenshuai.xi pJpegBuff += 4;
1987*53ee8cc1Swenshuai.xi continue;
1988*53ee8cc1Swenshuai.xi }
1989*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("MODEL addr = 0x%lx\n", (MS_U32)pIFDPtrOffset);
1990*53ee8cc1Swenshuai.xi MS_U8 u8i=0;
1991*53ee8cc1Swenshuai.xi while(*(pIFDPtrOffset+u8i) && u8i<JPEG_MODEL_SIZE)
1992*53ee8cc1Swenshuai.xi {
1993*53ee8cc1Swenshuai.xi _u8EXIF_Model[u8i] = *(pIFDPtrOffset+u8i);
1994*53ee8cc1Swenshuai.xi u8i++;
1995*53ee8cc1Swenshuai.xi }
1996*53ee8cc1Swenshuai.xi }
1997*53ee8cc1Swenshuai.xi #endif
1998*53ee8cc1Swenshuai.xi #if 0
1999*53ee8cc1Swenshuai.xi else if((JPEG_EXIF_TAG_DATETIME_MOD == u16Marker)
2000*53ee8cc1Swenshuai.xi && (FALSE == _stEXIF_DateTime.bHasDataTime))
2001*53ee8cc1Swenshuai.xi {
2002*53ee8cc1Swenshuai.xi _stEXIF_DateTime.bHasDataTime = TRUE;
2003*53ee8cc1Swenshuai.xi //datavalue is an offset from exif marker for datetime
2004*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2005*53ee8cc1Swenshuai.xi pExifOffset = pExifHdr + u32DataValue;
2006*53ee8cc1Swenshuai.xi printf("pExifOffset1 = 0x%lx\n", (MS_U32)pExifOffset);
2007*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Year);
2008*53ee8cc1Swenshuai.xi pExifOffset++;
2009*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Month);
2010*53ee8cc1Swenshuai.xi pExifOffset++;
2011*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Day);
2012*53ee8cc1Swenshuai.xi pExifOffset++;
2013*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Hour);
2014*53ee8cc1Swenshuai.xi pExifOffset++;
2015*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Minute);
2016*53ee8cc1Swenshuai.xi pExifOffset++;
2017*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifOffset, _stEXIF_DateTime.u32Second);
2018*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", _eEXIF_Orientation);
2019*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime======= Exist = %d, Original = %d \n", _stEXIF_DateTime.bHasDataTime, bOriDateTimeFound);
2020*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
2021*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
2022*53ee8cc1Swenshuai.xi }
2023*53ee8cc1Swenshuai.xi #endif
2024*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2025*53ee8cc1Swenshuai.xi }
2026*53ee8cc1Swenshuai.xi
2027*53ee8cc1Swenshuai.xi if(TRUE == bIFD_pt_found)
2028*53ee8cc1Swenshuai.xi {
2029*53ee8cc1Swenshuai.xi u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifHdrOffet));
2030*53ee8cc1Swenshuai.xi pExifHdrOffet += 2;
2031*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EXIF IFD : u16NumOfEntry = %d\n", u16NumOfEntry);
2032*53ee8cc1Swenshuai.xi
2033*53ee8cc1Swenshuai.xi for(i = 0; i < u16NumOfEntry; i++)
2034*53ee8cc1Swenshuai.xi {
2035*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifHdrOffet));
2036*53ee8cc1Swenshuai.xi #if (SUPPORT_EXIF_EXTRA_INFO==false)
2037*53ee8cc1Swenshuai.xi if(JPEG_EXIF_TAG_DATETIME_ORI == u16Marker)
2038*53ee8cc1Swenshuai.xi {
2039*53ee8cc1Swenshuai.xi pExifHdrOffet += 8;
2040*53ee8cc1Swenshuai.xi _stEXIF_DateTime.bHasDataTime = TRUE;
2041*53ee8cc1Swenshuai.xi //datavalue is an offset from exif marker for datetime
2042*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifHdrOffet));;
2043*53ee8cc1Swenshuai.xi pExifHdrOffet = pExifHdr + u32DataValue;
2044*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifHdrOffet, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2045*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("pExifOriDateTime Offset = 0x%lx\n", (MS_U32)pExifHdrOffet);
2046*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Year);
2047*53ee8cc1Swenshuai.xi pExifHdrOffet++;
2048*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Month);
2049*53ee8cc1Swenshuai.xi pExifHdrOffet++;
2050*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Day);
2051*53ee8cc1Swenshuai.xi pExifHdrOffet++;
2052*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Hour);
2053*53ee8cc1Swenshuai.xi pExifHdrOffet++;
2054*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Minute);
2055*53ee8cc1Swenshuai.xi pExifHdrOffet++;
2056*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifHdrOffet, _stEXIF_DateTime.u32Second);
2057*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime=======\n");
2058*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
2059*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
2060*53ee8cc1Swenshuai.xi break;
2061*53ee8cc1Swenshuai.xi }
2062*53ee8cc1Swenshuai.xi #else
2063*53ee8cc1Swenshuai.xi MS_U8 *pExifPtrOffset;
2064*53ee8cc1Swenshuai.xi MS_U16 u16Type;
2065*53ee8cc1Swenshuai.xi MS_U32 u32Count;
2066*53ee8cc1Swenshuai.xi switch(u16Marker)
2067*53ee8cc1Swenshuai.xi {
2068*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_DATETIME_ORI:
2069*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2070*53ee8cc1Swenshuai.xi _stEXIF_DateTime.bHasDataTime = TRUE;
2071*53ee8cc1Swenshuai.xi //datavalue is an offset from exif marker for datetime
2072*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2073*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2074*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2075*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("pExifOriDateTime Offset = 0x%lx\n", (MS_U32)pExifPtrOffset);
2076*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Year);
2077*53ee8cc1Swenshuai.xi pExifPtrOffset++;
2078*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Month);
2079*53ee8cc1Swenshuai.xi pExifPtrOffset++;
2080*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Day);
2081*53ee8cc1Swenshuai.xi pExifPtrOffset++;
2082*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Hour);
2083*53ee8cc1Swenshuai.xi pExifPtrOffset++;
2084*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Minute);
2085*53ee8cc1Swenshuai.xi pExifPtrOffset++;
2086*53ee8cc1Swenshuai.xi JPEG_AtoU32(pExifPtrOffset, _stEXIF_DateTime.u32Second);
2087*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime=======\n");
2088*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
2089*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
2090*53ee8cc1Swenshuai.xi break;
2091*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_ISO_SPEED_RATING:
2092*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 2;
2093*53ee8cc1Swenshuai.xi u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2094*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 4;
2095*53ee8cc1Swenshuai.xi u32Count = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2096*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2097*53ee8cc1Swenshuai.xi if(u16Type==3)
2098*53ee8cc1Swenshuai.xi {
2099*53ee8cc1Swenshuai.xi if(u32Count==2)
2100*53ee8cc1Swenshuai.xi {
2101*53ee8cc1Swenshuai.xi _u32EXIF_ISOSpeedRatings=JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2102*53ee8cc1Swenshuai.xi }
2103*53ee8cc1Swenshuai.xi else if(u32Count==1)
2104*53ee8cc1Swenshuai.xi {
2105*53ee8cc1Swenshuai.xi _u32EXIF_ISOSpeedRatings=JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2106*53ee8cc1Swenshuai.xi }
2107*53ee8cc1Swenshuai.xi }
2108*53ee8cc1Swenshuai.xi else if(u16Type==4)
2109*53ee8cc1Swenshuai.xi {
2110*53ee8cc1Swenshuai.xi if(u32Count==1)
2111*53ee8cc1Swenshuai.xi {
2112*53ee8cc1Swenshuai.xi _u32EXIF_ISOSpeedRatings=JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2113*53ee8cc1Swenshuai.xi }
2114*53ee8cc1Swenshuai.xi }
2115*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ISO Speed Rating=%ld\n", _u32EXIF_ISOSpeedRatings);
2116*53ee8cc1Swenshuai.xi break;
2117*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_EXPOSURE_TIME:
2118*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2119*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2120*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureTime Offset = 0x%lx\n", u32DataValue);
2121*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2122*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("ExposureTime addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2123*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2124*53ee8cc1Swenshuai.xi _stEXIF_ExposureTime.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2125*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2126*53ee8cc1Swenshuai.xi _stEXIF_ExposureTime.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2127*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureTime numerator=%ld, denominator=%ld\n", _stEXIF_ExposureTime.numerator, _stEXIF_ExposureTime.denominator);
2128*53ee8cc1Swenshuai.xi break;
2129*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_F_NUMBER:
2130*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2131*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2132*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FNumber Offset = 0x%lx\n", u32DataValue);
2133*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2134*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("FNumber addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2135*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2136*53ee8cc1Swenshuai.xi _stEXIF_FNumber.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2137*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2138*53ee8cc1Swenshuai.xi _stEXIF_FNumber.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2139*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FNumber numerator=%ld, denominator=%ld\n", _stEXIF_FNumber.numerator, _stEXIF_FNumber.denominator);
2140*53ee8cc1Swenshuai.xi break;
2141*53ee8cc1Swenshuai.xi
2142*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_SHUTTER_SPEED:
2143*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2144*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2145*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ShutterSpeedValue Offset = 0x%lx\n", u32DataValue);
2146*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2147*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2148*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("ShutterSpeedValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2149*53ee8cc1Swenshuai.xi _stEXIF_ShutterSpeedValue.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2150*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2151*53ee8cc1Swenshuai.xi _stEXIF_ShutterSpeedValue.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2152*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ShutterSpeedValue numerator=%ld, denominator=%ld\n", _stEXIF_ShutterSpeedValue.numerator, _stEXIF_ShutterSpeedValue.denominator);
2153*53ee8cc1Swenshuai.xi break;
2154*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_APERTURE:
2155*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2156*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2157*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ApertureValue Offset = 0x%lx\n", u32DataValue);
2158*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2159*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("ApertureValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2160*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2161*53ee8cc1Swenshuai.xi _stEXIF_ApertureValue.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2162*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2163*53ee8cc1Swenshuai.xi _stEXIF_ApertureValue.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2164*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ApertureValue numerator=%ld, denominator=%ld\n", _stEXIF_ApertureValue.s_numerator, _stEXIF_ApertureValue.s_denominator);
2165*53ee8cc1Swenshuai.xi break;
2166*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_EXPOSURE_BIAS:
2167*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2168*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2169*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureBiasValue Offset = 0x%lx\n", u32DataValue);
2170*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2171*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2172*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("ExposureBiasValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2173*53ee8cc1Swenshuai.xi _stEXIF_ExposureBiasValue.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2174*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2175*53ee8cc1Swenshuai.xi _stEXIF_ExposureBiasValue.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2176*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureBiasValue numerator=%ld, denominator=%ld\n", _stEXIF_ExposureBiasValue.numerator, _stEXIF_ExposureBiasValue.denominator);
2177*53ee8cc1Swenshuai.xi break;
2178*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_FLASH:
2179*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2180*53ee8cc1Swenshuai.xi _u16EXIF_Flash = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2181*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EXIF_Flash=0x%x\n", _u16EXIF_Flash);
2182*53ee8cc1Swenshuai.xi break;
2183*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_FOCAL_LENGTH:
2184*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2185*53ee8cc1Swenshuai.xi u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2186*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FocalLength Offset = 0x%lx\n", u32DataValue);
2187*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdr + u32DataValue;
2188*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2189*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("FocalLength addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2190*53ee8cc1Swenshuai.xi _stEXIF_FocalLength.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2191*53ee8cc1Swenshuai.xi pExifPtrOffset+=4;
2192*53ee8cc1Swenshuai.xi _stEXIF_FocalLength.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2193*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FocalLength numerator=%ld, denominator=%ld\n", _stEXIF_FocalLength.s_numerator, _stEXIF_FocalLength.s_denominator);
2194*53ee8cc1Swenshuai.xi break;
2195*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_IMAGE_WIDTH:
2196*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 2;
2197*53ee8cc1Swenshuai.xi u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2198*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2199*53ee8cc1Swenshuai.xi if(u16Type==3)
2200*53ee8cc1Swenshuai.xi {
2201*53ee8cc1Swenshuai.xi _u32EXIF_ImageWidth = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2202*53ee8cc1Swenshuai.xi }
2203*53ee8cc1Swenshuai.xi else
2204*53ee8cc1Swenshuai.xi {
2205*53ee8cc1Swenshuai.xi _u32EXIF_ImageWidth = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2206*53ee8cc1Swenshuai.xi }
2207*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EXIF_ImageWidth=%ld\n", _u32EXIF_ImageWidth);
2208*53ee8cc1Swenshuai.xi break;
2209*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_IMAGE_HEIGHT:
2210*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 2;
2211*53ee8cc1Swenshuai.xi u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2212*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2213*53ee8cc1Swenshuai.xi if(u16Type==3)
2214*53ee8cc1Swenshuai.xi {
2215*53ee8cc1Swenshuai.xi _u32EXIF_ImageHeight = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2216*53ee8cc1Swenshuai.xi }
2217*53ee8cc1Swenshuai.xi else
2218*53ee8cc1Swenshuai.xi {
2219*53ee8cc1Swenshuai.xi _u32EXIF_ImageHeight = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2220*53ee8cc1Swenshuai.xi }
2221*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EXIF_ImageHeight=%ld\n", _u32EXIF_ImageHeight);
2222*53ee8cc1Swenshuai.xi break;
2223*53ee8cc1Swenshuai.xi case JPEG_EXIF_TAG_EXPOSURE_PROGRAM:
2224*53ee8cc1Swenshuai.xi pExifPtrOffset = pExifHdrOffet + 8;
2225*53ee8cc1Swenshuai.xi _u16EXIF_Exposureprogram = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2226*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EXIF_Exposureprogram=0x%x\n", _u16EXIF_Exposureprogram);
2227*53ee8cc1Swenshuai.xi break;
2228*53ee8cc1Swenshuai.xi default:
2229*53ee8cc1Swenshuai.xi break;
2230*53ee8cc1Swenshuai.xi }
2231*53ee8cc1Swenshuai.xi #endif
2232*53ee8cc1Swenshuai.xi pExifHdrOffet += 12;
2233*53ee8cc1Swenshuai.xi }
2234*53ee8cc1Swenshuai.xi }
2235*53ee8cc1Swenshuai.xi
2236*53ee8cc1Swenshuai.xi if(E_JPEG_TYPE_THUMBNAIL != _u8DecodeType)
2237*53ee8cc1Swenshuai.xi {
2238*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("decode type is not thumbnail...\n");
2239*53ee8cc1Swenshuai.xi return FALSE;
2240*53ee8cc1Swenshuai.xi }
2241*53ee8cc1Swenshuai.xi
2242*53ee8cc1Swenshuai.xi // 1th IFD
2243*53ee8cc1Swenshuai.xi u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2244*53ee8cc1Swenshuai.xi if (u32tmp == 0)
2245*53ee8cc1Swenshuai.xi return FALSE;
2246*53ee8cc1Swenshuai.xi else
2247*53ee8cc1Swenshuai.xi {
2248*53ee8cc1Swenshuai.xi if(u32tmp >= data_length)
2249*53ee8cc1Swenshuai.xi {
2250*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("u32tmp = %ld is invalid > %ld\n", u32tmp,data_length);
2251*53ee8cc1Swenshuai.xi return FALSE;
2252*53ee8cc1Swenshuai.xi }
2253*53ee8cc1Swenshuai.xi pNextIfd = &pTiffHdrPtr[u32tmp];
2254*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("1st IFD pNextIfd = 0x%lx, u32tmp = %ld\n", (MS_U32)pNextIfd, u32tmp);
2255*53ee8cc1Swenshuai.xi }
2256*53ee8cc1Swenshuai.xi
2257*53ee8cc1Swenshuai.xi u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pNextIfd));
2258*53ee8cc1Swenshuai.xi pNextIfd += 2;
2259*53ee8cc1Swenshuai.xi
2260*53ee8cc1Swenshuai.xi // Boundary check, prevent from buffer over-run
2261*53ee8cc1Swenshuai.xi if((((MS_U32) pNextIfd) - INTERNAL_BUFFER_ADDR + u16NumOfEntry*12)>=data_length)
2262*53ee8cc1Swenshuai.xi {
2263*53ee8cc1Swenshuai.xi return FALSE;
2264*53ee8cc1Swenshuai.xi }
2265*53ee8cc1Swenshuai.xi
2266*53ee8cc1Swenshuai.xi for (i = 0; i < u16NumOfEntry; i++)
2267*53ee8cc1Swenshuai.xi {
2268*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pNextIfd));
2269*53ee8cc1Swenshuai.xi // u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pNextIfd + 4));
2270*53ee8cc1Swenshuai.xi u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pNextIfd + 8));
2271*53ee8cc1Swenshuai.xi
2272*53ee8cc1Swenshuai.xi switch (u16Marker)
2273*53ee8cc1Swenshuai.xi {
2274*53ee8cc1Swenshuai.xi case JPEG_TIFF_JPEG_IMG_BYTES:
2275*53ee8cc1Swenshuai.xi _u16ThumbnailSize = u32tmp;
2276*53ee8cc1Swenshuai.xi break;
2277*53ee8cc1Swenshuai.xi case JPEG_TIFF_SOI_OFFSET:
2278*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Thumbnail marker found in 0x%lx!!\n", (MS_U32)pNextIfd);
2279*53ee8cc1Swenshuai.xi _bThumbnailFound = TRUE;
2280*53ee8cc1Swenshuai.xi _u32ThumbnailOffset += u32tmp;
2281*53ee8cc1Swenshuai.xi break;
2282*53ee8cc1Swenshuai.xi default:
2283*53ee8cc1Swenshuai.xi break;
2284*53ee8cc1Swenshuai.xi }
2285*53ee8cc1Swenshuai.xi
2286*53ee8cc1Swenshuai.xi pNextIfd += 12;
2287*53ee8cc1Swenshuai.xi }
2288*53ee8cc1Swenshuai.xi
2289*53ee8cc1Swenshuai.xi // Boundary check, prevent from buffer over-run
2290*53ee8cc1Swenshuai.xi if(_bThumbnailFound)
2291*53ee8cc1Swenshuai.xi {
2292*53ee8cc1Swenshuai.xi if((_u32ThumbnailOffset + _u16ThumbnailSize) > data_length)
2293*53ee8cc1Swenshuai.xi _bThumbnailFound = FALSE;
2294*53ee8cc1Swenshuai.xi
2295*53ee8cc1Swenshuai.xi // means it only contains SOI header..
2296*53ee8cc1Swenshuai.xi if(_u16ThumbnailSize<=2)
2297*53ee8cc1Swenshuai.xi _bThumbnailFound = FALSE;
2298*53ee8cc1Swenshuai.xi }
2299*53ee8cc1Swenshuai.xi
2300*53ee8cc1Swenshuai.xi return _bThumbnailFound;
2301*53ee8cc1Swenshuai.xi }
2302*53ee8cc1Swenshuai.xi
2303*53ee8cc1Swenshuai.xi // Used to skip unrecognized markers.
JPEG_skip_bytes(MS_U32 count)2304*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_skip_bytes(MS_U32 count)
2305*53ee8cc1Swenshuai.xi {
2306*53ee8cc1Swenshuai.xi while(count!=0)
2307*53ee8cc1Swenshuai.xi {
2308*53ee8cc1Swenshuai.xi // Any bytes remaining in buffer?
2309*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
2310*53ee8cc1Swenshuai.xi {
2311*53ee8cc1Swenshuai.xi // Try to get more bytes.
2312*53ee8cc1Swenshuai.xi if(!JPEG_fill_read_buffer())
2313*53ee8cc1Swenshuai.xi {
2314*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer failed!!!\n");
2315*53ee8cc1Swenshuai.xi _u32In_buf_left = 0;
2316*53ee8cc1Swenshuai.xi }
2317*53ee8cc1Swenshuai.xi // Still nothing to get?
2318*53ee8cc1Swenshuai.xi if ( !_u32In_buf_left )
2319*53ee8cc1Swenshuai.xi {
2320*53ee8cc1Swenshuai.xi // should not happen
2321*53ee8cc1Swenshuai.xi break;
2322*53ee8cc1Swenshuai.xi }
2323*53ee8cc1Swenshuai.xi }
2324*53ee8cc1Swenshuai.xi
2325*53ee8cc1Swenshuai.xi if(count<_u32In_buf_left)
2326*53ee8cc1Swenshuai.xi {
2327*53ee8cc1Swenshuai.xi _u32In_buf_left -= count;
2328*53ee8cc1Swenshuai.xi _pu8In_buf_ofs += count;
2329*53ee8cc1Swenshuai.xi count = 0;
2330*53ee8cc1Swenshuai.xi }
2331*53ee8cc1Swenshuai.xi else
2332*53ee8cc1Swenshuai.xi {
2333*53ee8cc1Swenshuai.xi count -= _u32In_buf_left;
2334*53ee8cc1Swenshuai.xi _u32In_buf_left = 0;
2335*53ee8cc1Swenshuai.xi }
2336*53ee8cc1Swenshuai.xi }
2337*53ee8cc1Swenshuai.xi }
2338*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2339*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
2340*53ee8cc1Swenshuai.xi #define JPEG_TAG_MPO EndianChangeL(0x4D504600)
2341*53ee8cc1Swenshuai.xi #define JPEG_MPO_TAG_MPF_VERSION 0xB000
2342*53ee8cc1Swenshuai.xi #define JPEG_MPO_TAG_NUM_OF_IMAGES 0xB001
2343*53ee8cc1Swenshuai.xi #define JPEG_MPO_TAG_MP_ENTRY 0xB002
2344*53ee8cc1Swenshuai.xi
2345*53ee8cc1Swenshuai.xi static JPEG_MPO_INDEX_INFO _stMPOIndex;
2346*53ee8cc1Swenshuai.xi static JPEG_MPO_ATTRIBUTE_INFO _stMPOAttri[JPEG_MPO_MAX_SUPPORT_IMAGE];
2347*53ee8cc1Swenshuai.xi //For start of offset of MPO(only for first MPO picture)
2348*53ee8cc1Swenshuai.xi static MS_U32 _u32App2MarkerOffset = 0;
2349*53ee8cc1Swenshuai.xi
2350*53ee8cc1Swenshuai.xi typedef enum
2351*53ee8cc1Swenshuai.xi {
2352*53ee8cc1Swenshuai.xi E_JPEG_MPO_ATTR_IMAGE_NO = 0xB101
2353*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_PAN_ORIENTATION = 0xB201
2354*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_PAN_OVERLAP_H = 0xB202
2355*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_PAN_OVERLAP_V = 0xB203
2356*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_BASE_VIEWPOINT_NO = 0xB204
2357*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_CONVERGENCE_ANGLE = 0xB205
2358*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_BASELINE_LENGTH = 0xB206
2359*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_DIVERGENCE_ANGLE = 0xB207
2360*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_AXIS_DISTANCE_X = 0xB208
2361*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_AXIS_DISTANCE_Y = 0xB209
2362*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_AXIS_DISTANCE_Z = 0xB20A
2363*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_YAW_ANGLE = 0xB20B
2364*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_PITCH_ANGLE = 0xB20C
2365*53ee8cc1Swenshuai.xi , E_JPEG_MPO_ATTR_ROLL_ANGLE = 0xB20D
2366*53ee8cc1Swenshuai.xi } JPEG_MPO_ATTR_TAG;
2367*53ee8cc1Swenshuai.xi
2368*53ee8cc1Swenshuai.xi #define MAX_MPO_ATTR_TAG_NUM 14 // from E_JPEG_MPO_ATTR_IMAGE_NO to E_JPEG_MPO_ATTR_ROLL_ANGLE
2369*53ee8cc1Swenshuai.xi
2370*53ee8cc1Swenshuai.xi //***************************************************
2371*53ee8cc1Swenshuai.xi //Initialize EXIF MPO database
2372*53ee8cc1Swenshuai.xi //***************************************************
JPEG_InitMPO(void)2373*53ee8cc1Swenshuai.xi static void JPEG_InitMPO(void)
2374*53ee8cc1Swenshuai.xi {
2375*53ee8cc1Swenshuai.xi MS_U32 i = 0;
2376*53ee8cc1Swenshuai.xi
2377*53ee8cc1Swenshuai.xi //init MPO Index structure
2378*53ee8cc1Swenshuai.xi _stMPOIndex.num_of_image = 1;
2379*53ee8cc1Swenshuai.xi for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2380*53ee8cc1Swenshuai.xi {
2381*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].attribute = 0;
2382*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].size = 0;
2383*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].offset = 0;
2384*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].image1_no = 0;
2385*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].image2_no = 0;
2386*53ee8cc1Swenshuai.xi }
2387*53ee8cc1Swenshuai.xi
2388*53ee8cc1Swenshuai.xi // init MPO Attribute structure
2389*53ee8cc1Swenshuai.xi for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2390*53ee8cc1Swenshuai.xi {
2391*53ee8cc1Swenshuai.xi _stMPOAttri[i].MPIndividualNum = 0;
2392*53ee8cc1Swenshuai.xi _stMPOAttri[i].PanOrientation= 0;
2393*53ee8cc1Swenshuai.xi _stMPOAttri[i].PanOverlap_H.numerator = 0;
2394*53ee8cc1Swenshuai.xi _stMPOAttri[i].PanOverlap_H.denominator = 0;
2395*53ee8cc1Swenshuai.xi _stMPOAttri[i].PanOverlap_V.numerator = 0;
2396*53ee8cc1Swenshuai.xi _stMPOAttri[i].PanOverlap_V.denominator = 0;
2397*53ee8cc1Swenshuai.xi _stMPOAttri[i].BaseViewpointNum = 0;
2398*53ee8cc1Swenshuai.xi _stMPOAttri[i].ConvergenceAngle.s_numerator = 0;
2399*53ee8cc1Swenshuai.xi _stMPOAttri[i].ConvergenceAngle.s_denominator = 0;
2400*53ee8cc1Swenshuai.xi _stMPOAttri[i].BaselineLength.numerator = 0;
2401*53ee8cc1Swenshuai.xi _stMPOAttri[i].BaselineLength.denominator = 0;
2402*53ee8cc1Swenshuai.xi _stMPOAttri[i].VerticalDivergence.s_numerator = 0;
2403*53ee8cc1Swenshuai.xi _stMPOAttri[i].VerticalDivergence.s_denominator = 0;
2404*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_X.s_numerator = 0;
2405*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_X.s_denominator = 0;
2406*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_Y.s_numerator = 0;
2407*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_Y.s_denominator = 0;
2408*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_Z.s_numerator = 0;
2409*53ee8cc1Swenshuai.xi _stMPOAttri[i].AxisDistance_Z.s_denominator = 0;
2410*53ee8cc1Swenshuai.xi _stMPOAttri[i].YawAngle.s_numerator = 0;
2411*53ee8cc1Swenshuai.xi _stMPOAttri[i].YawAngle.s_denominator = 0;
2412*53ee8cc1Swenshuai.xi _stMPOAttri[i].PitchAngle.s_numerator = 0;
2413*53ee8cc1Swenshuai.xi _stMPOAttri[i].PitchAngle.s_denominator = 0;
2414*53ee8cc1Swenshuai.xi _stMPOAttri[i].RollAngle.s_numerator = 0;
2415*53ee8cc1Swenshuai.xi _stMPOAttri[i].RollAngle.s_denominator = 0;
2416*53ee8cc1Swenshuai.xi _stMPOAttri[i].used = FALSE;
2417*53ee8cc1Swenshuai.xi }
2418*53ee8cc1Swenshuai.xi }
2419*53ee8cc1Swenshuai.xi //***************************************************
2420*53ee8cc1Swenshuai.xi //Parse EXIF MPO Attribute header
2421*53ee8cc1Swenshuai.xi //***************************************************
JPEG_DecodeMPAttrIFD(MS_U8 * data,MS_U8 * start_of_offset,MS_U32 count)2422*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_DecodeMPAttrIFD(MS_U8 *data, MS_U8 *start_of_offset, MS_U32 count)
2423*53ee8cc1Swenshuai.xi {
2424*53ee8cc1Swenshuai.xi MS_U8 *pMPOAttrPtr = data;
2425*53ee8cc1Swenshuai.xi MS_U8 *pMPO_offset;
2426*53ee8cc1Swenshuai.xi MS_U16 u16Marker, i = 0, image_idx = 0;
2427*53ee8cc1Swenshuai.xi
2428*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_DecodeMPAttrIFD, count = %ld\n", count);
2429*53ee8cc1Swenshuai.xi
2430*53ee8cc1Swenshuai.xi if(count >MAX_MPO_ATTR_TAG_NUM)
2431*53ee8cc1Swenshuai.xi {
2432*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Warning!!!unreasonable attribute IFD number !!!\n");
2433*53ee8cc1Swenshuai.xi return TRUE;
2434*53ee8cc1Swenshuai.xi }
2435*53ee8cc1Swenshuai.xi
2436*53ee8cc1Swenshuai.xi for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2437*53ee8cc1Swenshuai.xi {
2438*53ee8cc1Swenshuai.xi if(FALSE == _stMPOAttri[i].used)
2439*53ee8cc1Swenshuai.xi {
2440*53ee8cc1Swenshuai.xi image_idx = i;
2441*53ee8cc1Swenshuai.xi break;
2442*53ee8cc1Swenshuai.xi }
2443*53ee8cc1Swenshuai.xi }
2444*53ee8cc1Swenshuai.xi
2445*53ee8cc1Swenshuai.xi if(JPEG_MPO_MAX_SUPPORT_IMAGE <= i)
2446*53ee8cc1Swenshuai.xi {
2447*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Not support too much images in MPO!!\n");
2448*53ee8cc1Swenshuai.xi return FALSE;
2449*53ee8cc1Swenshuai.xi }
2450*53ee8cc1Swenshuai.xi
2451*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].used = TRUE;
2452*53ee8cc1Swenshuai.xi
2453*53ee8cc1Swenshuai.xi for(i = 0; i < count; i++)
2454*53ee8cc1Swenshuai.xi {
2455*53ee8cc1Swenshuai.xi u16Marker = (JPEG_MPO_ATTR_TAG)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pMPOAttrPtr));
2456*53ee8cc1Swenshuai.xi pMPOAttrPtr += 8;
2457*53ee8cc1Swenshuai.xi switch(u16Marker)
2458*53ee8cc1Swenshuai.xi {
2459*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_IMAGE_NO:
2460*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].MPIndividualNum = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2461*53ee8cc1Swenshuai.xi break;
2462*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_PAN_ORIENTATION:
2463*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PanOrientation = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2464*53ee8cc1Swenshuai.xi break;
2465*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_PAN_OVERLAP_H:
2466*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2467*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2468*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PanOverlap_H.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2469*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2470*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PanOverlap_H.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2471*53ee8cc1Swenshuai.xi break;
2472*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_PAN_OVERLAP_V:
2473*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2474*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2475*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PanOverlap_V.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2476*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2477*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PanOverlap_V.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2478*53ee8cc1Swenshuai.xi break;
2479*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_BASE_VIEWPOINT_NO:
2480*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].BaseViewpointNum = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2481*53ee8cc1Swenshuai.xi break;
2482*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_CONVERGENCE_ANGLE:
2483*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2484*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2485*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].ConvergenceAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2486*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2487*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].ConvergenceAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2488*53ee8cc1Swenshuai.xi break;
2489*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_BASELINE_LENGTH:
2490*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2491*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2492*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].BaselineLength.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2493*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2494*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].BaselineLength.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2495*53ee8cc1Swenshuai.xi break;
2496*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_DIVERGENCE_ANGLE:
2497*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2498*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2499*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].VerticalDivergence.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2500*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2501*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].VerticalDivergence.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2502*53ee8cc1Swenshuai.xi break;
2503*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_AXIS_DISTANCE_X:
2504*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2505*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2506*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_X.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2507*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2508*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_X.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2509*53ee8cc1Swenshuai.xi break;
2510*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_AXIS_DISTANCE_Y:
2511*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2512*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2513*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_Y.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2514*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2515*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_Y.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2516*53ee8cc1Swenshuai.xi break;
2517*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_AXIS_DISTANCE_Z:
2518*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2519*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2520*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_Z.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2521*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2522*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].AxisDistance_Z.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2523*53ee8cc1Swenshuai.xi break;
2524*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_YAW_ANGLE:
2525*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2526*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2527*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].YawAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2528*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2529*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].YawAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2530*53ee8cc1Swenshuai.xi break;
2531*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_PITCH_ANGLE:
2532*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2533*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2534*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PitchAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2535*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2536*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].PitchAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2537*53ee8cc1Swenshuai.xi break;
2538*53ee8cc1Swenshuai.xi case E_JPEG_MPO_ATTR_ROLL_ANGLE:
2539*53ee8cc1Swenshuai.xi pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2540*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2541*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].RollAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2542*53ee8cc1Swenshuai.xi pMPO_offset += 4;
2543*53ee8cc1Swenshuai.xi _stMPOAttri[image_idx].RollAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2544*53ee8cc1Swenshuai.xi break;
2545*53ee8cc1Swenshuai.xi default:
2546*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Unknown MPO attribute marker =0x%x!!!!!!\n", u16Marker);
2547*53ee8cc1Swenshuai.xi break;
2548*53ee8cc1Swenshuai.xi }
2549*53ee8cc1Swenshuai.xi pMPOAttrPtr += 4;
2550*53ee8cc1Swenshuai.xi }
2551*53ee8cc1Swenshuai.xi return TRUE;
2552*53ee8cc1Swenshuai.xi }
2553*53ee8cc1Swenshuai.xi //***************************************************
2554*53ee8cc1Swenshuai.xi //Parse EXIF MPO header
2555*53ee8cc1Swenshuai.xi //***************************************************
JPEG_DecodeMPOInfo(MS_U8 * data)2556*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_DecodeMPOInfo(MS_U8 *data)
2557*53ee8cc1Swenshuai.xi {
2558*53ee8cc1Swenshuai.xi MS_U8 *pJpegBuff = data;
2559*53ee8cc1Swenshuai.xi MS_U8 *pMPOHdrPtr;
2560*53ee8cc1Swenshuai.xi MS_U32 u32tmp, u32Len;
2561*53ee8cc1Swenshuai.xi MS_U16 u16Marker, u16NumOfEntry, i;
2562*53ee8cc1Swenshuai.xi
2563*53ee8cc1Swenshuai.xi u32tmp = JPEG_GetU32(pJpegBuff);
2564*53ee8cc1Swenshuai.xi if (u32tmp != JPEG_TAG_MPO)
2565*53ee8cc1Swenshuai.xi {
2566*53ee8cc1Swenshuai.xi return FALSE;
2567*53ee8cc1Swenshuai.xi }
2568*53ee8cc1Swenshuai.xi
2569*53ee8cc1Swenshuai.xi // mpo header start from here
2570*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2571*53ee8cc1Swenshuai.xi u16Marker = JPEG_GetU16(pJpegBuff);
2572*53ee8cc1Swenshuai.xi if (u16Marker == JPEG_TIFF_BIG_ENDIAN)
2573*53ee8cc1Swenshuai.xi _bTiffBigEndian = TRUE;
2574*53ee8cc1Swenshuai.xi else if (u16Marker == JPEG_TIFF_LITTLE_ENDIAN)
2575*53ee8cc1Swenshuai.xi _bTiffBigEndian = FALSE;
2576*53ee8cc1Swenshuai.xi else
2577*53ee8cc1Swenshuai.xi return FALSE;
2578*53ee8cc1Swenshuai.xi
2579*53ee8cc1Swenshuai.xi // _u32ThumbnailOffset += 4;
2580*53ee8cc1Swenshuai.xi pMPOHdrPtr = pJpegBuff;
2581*53ee8cc1Swenshuai.xi
2582*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2583*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2584*53ee8cc1Swenshuai.xi if (u16Marker != 0x002A)
2585*53ee8cc1Swenshuai.xi return FALSE;
2586*53ee8cc1Swenshuai.xi
2587*53ee8cc1Swenshuai.xi //offset to 1st MPO IFD
2588*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2589*53ee8cc1Swenshuai.xi u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2590*53ee8cc1Swenshuai.xi
2591*53ee8cc1Swenshuai.xi //1st MPO IFD start from here(either MP Index IFD or MP Attribute IFD)
2592*53ee8cc1Swenshuai.xi //Count Info
2593*53ee8cc1Swenshuai.xi pJpegBuff = pMPOHdrPtr + u32Len;
2594*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pJpegBuff, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2595*53ee8cc1Swenshuai.xi
2596*53ee8cc1Swenshuai.xi u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2597*53ee8cc1Swenshuai.xi
2598*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("num of entry = %d\n", u16NumOfEntry);
2599*53ee8cc1Swenshuai.xi
2600*53ee8cc1Swenshuai.xi //MPFVersion
2601*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2602*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2603*53ee8cc1Swenshuai.xi if(u16Marker == JPEG_MPO_TAG_MPF_VERSION)
2604*53ee8cc1Swenshuai.xi {
2605*53ee8cc1Swenshuai.xi pJpegBuff += 12;
2606*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2607*53ee8cc1Swenshuai.xi if(u16Marker == JPEG_MPO_TAG_NUM_OF_IMAGES)
2608*53ee8cc1Swenshuai.xi {
2609*53ee8cc1Swenshuai.xi //It is a MP Index IFD
2610*53ee8cc1Swenshuai.xi //Check number of images
2611*53ee8cc1Swenshuai.xi pJpegBuff += 8;
2612*53ee8cc1Swenshuai.xi u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2613*53ee8cc1Swenshuai.xi
2614*53ee8cc1Swenshuai.xi if(JPEG_MPO_MAX_SUPPORT_IMAGE < u32tmp)
2615*53ee8cc1Swenshuai.xi {
2616*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Not support %ld images in MPO!!\n", u32tmp);
2617*53ee8cc1Swenshuai.xi _stMPOIndex.num_of_image = 0xFFFFFFFF;
2618*53ee8cc1Swenshuai.xi return FALSE;
2619*53ee8cc1Swenshuai.xi }
2620*53ee8cc1Swenshuai.xi
2621*53ee8cc1Swenshuai.xi //Init MPO database
2622*53ee8cc1Swenshuai.xi JPEG_InitMPO();
2623*53ee8cc1Swenshuai.xi
2624*53ee8cc1Swenshuai.xi //start of offset for every individual picture
2625*53ee8cc1Swenshuai.xi _stMPOIndex.start_of_offset = _u32App2MarkerOffset + 8 - MRC_BUFFER_ADDR;
2626*53ee8cc1Swenshuai.xi
2627*53ee8cc1Swenshuai.xi //the numbers of image
2628*53ee8cc1Swenshuai.xi _stMPOIndex.num_of_image = u32tmp;
2629*53ee8cc1Swenshuai.xi
2630*53ee8cc1Swenshuai.xi printf_red("detected _stMPOIndex.num_of_image=0x%lx\n", _stMPOIndex.num_of_image);
2631*53ee8cc1Swenshuai.xi //MP Entry
2632*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2633*53ee8cc1Swenshuai.xi u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2634*53ee8cc1Swenshuai.xi if(u16Marker != JPEG_MPO_TAG_MP_ENTRY)
2635*53ee8cc1Swenshuai.xi {
2636*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("No MP Entry in MP index IFD!!\n");
2637*53ee8cc1Swenshuai.xi return FALSE;
2638*53ee8cc1Swenshuai.xi }
2639*53ee8cc1Swenshuai.xi
2640*53ee8cc1Swenshuai.xi //offset to next IFD(MP Attribute IFD)
2641*53ee8cc1Swenshuai.xi pJpegBuff = pMPOHdrPtr + 10 + u16NumOfEntry*12;
2642*53ee8cc1Swenshuai.xi u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2643*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("pJpegBuff = %lx, u32Len = %ld\n", (MS_U32)pJpegBuff, u32Len);
2644*53ee8cc1Swenshuai.xi
2645*53ee8cc1Swenshuai.xi //MP Entry Internal Fields
2646*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2647*53ee8cc1Swenshuai.xi for(i = 0; i < _stMPOIndex.num_of_image; i++)
2648*53ee8cc1Swenshuai.xi {
2649*53ee8cc1Swenshuai.xi //Image Attribute
2650*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].attribute = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2651*53ee8cc1Swenshuai.xi //Image size
2652*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2653*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].size = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2654*53ee8cc1Swenshuai.xi //Image size
2655*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2656*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].offset = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2657*53ee8cc1Swenshuai.xi //Image size
2658*53ee8cc1Swenshuai.xi pJpegBuff += 4;
2659*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].image1_no = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2660*53ee8cc1Swenshuai.xi //Image size
2661*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2662*53ee8cc1Swenshuai.xi _stMPOIndex.mp_entry[i].image2_no = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2663*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2664*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%d th : attribute = %lx\n", i, _stMPOIndex.mp_entry[i].attribute);
2665*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%d th : size = %lx\n", i, _stMPOIndex.mp_entry[i].size);
2666*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%d th : offset = %lx\n", i, _stMPOIndex.mp_entry[i].offset);
2667*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%d th : image1_no = %x\n", i, _stMPOIndex.mp_entry[i].image1_no);
2668*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%d th : image2_no = %x\n", i, _stMPOIndex.mp_entry[i].image2_no);
2669*53ee8cc1Swenshuai.xi }
2670*53ee8cc1Swenshuai.xi
2671*53ee8cc1Swenshuai.xi //get MPO Attribute count
2672*53ee8cc1Swenshuai.xi pJpegBuff = pMPOHdrPtr + u32Len;
2673*53ee8cc1Swenshuai.xi JPEG_OVER_BUFFER_RET(pJpegBuff, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2674*53ee8cc1Swenshuai.xi
2675*53ee8cc1Swenshuai.xi u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2676*53ee8cc1Swenshuai.xi
2677*53ee8cc1Swenshuai.xi pJpegBuff += 2;
2678*53ee8cc1Swenshuai.xi }
2679*53ee8cc1Swenshuai.xi }
2680*53ee8cc1Swenshuai.xi
2681*53ee8cc1Swenshuai.xi //Decode MP Attr header
2682*53ee8cc1Swenshuai.xi return JPEG_DecodeMPAttrIFD(pJpegBuff, pMPOHdrPtr, u16NumOfEntry);
2683*53ee8cc1Swenshuai.xi }
2684*53ee8cc1Swenshuai.xi
2685*53ee8cc1Swenshuai.xi
2686*53ee8cc1Swenshuai.xi #endif
2687*53ee8cc1Swenshuai.xi
2688*53ee8cc1Swenshuai.xi // Parse APP0 to get X&Y density.
JPEG_read_app0_marker(void)2689*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_read_app0_marker( void )
2690*53ee8cc1Swenshuai.xi {
2691*53ee8cc1Swenshuai.xi
2692*53ee8cc1Swenshuai.xi MS_U32 left;
2693*53ee8cc1Swenshuai.xi MS_U8 u8Xthumbnail, u8Ythumbnail;
2694*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP0\n");
2695*53ee8cc1Swenshuai.xi
2696*53ee8cc1Swenshuai.xi //Get APP0 length
2697*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2698*53ee8cc1Swenshuai.xi
2699*53ee8cc1Swenshuai.xi left-= 2;
2700*53ee8cc1Swenshuai.xi
2701*53ee8cc1Swenshuai.xi if(left < 8)
2702*53ee8cc1Swenshuai.xi {
2703*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP0_MARKER );
2704*53ee8cc1Swenshuai.xi return FALSE;
2705*53ee8cc1Swenshuai.xi }
2706*53ee8cc1Swenshuai.xi
2707*53ee8cc1Swenshuai.xi //Skip Block ID "JFIF"
2708*53ee8cc1Swenshuai.xi JPEG_skip_bytes(5);
2709*53ee8cc1Swenshuai.xi
2710*53ee8cc1Swenshuai.xi left-= 5;
2711*53ee8cc1Swenshuai.xi
2712*53ee8cc1Swenshuai.xi //Skip Version Number
2713*53ee8cc1Swenshuai.xi JPEG_skip_bytes(2);
2714*53ee8cc1Swenshuai.xi
2715*53ee8cc1Swenshuai.xi left-= 2;
2716*53ee8cc1Swenshuai.xi
2717*53ee8cc1Swenshuai.xi //Get units
2718*53ee8cc1Swenshuai.xi App0_Unit_Data.u8Unit = JPEG_get_char();
2719*53ee8cc1Swenshuai.xi App0_Unit_Data.u16Xdensity= (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2720*53ee8cc1Swenshuai.xi App0_Unit_Data.u16Ydensity= (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2721*53ee8cc1Swenshuai.xi
2722*53ee8cc1Swenshuai.xi left-= 5;
2723*53ee8cc1Swenshuai.xi
2724*53ee8cc1Swenshuai.xi //Get thumbnail x,y
2725*53ee8cc1Swenshuai.xi u8Xthumbnail = JPEG_get_char();
2726*53ee8cc1Swenshuai.xi u8Ythumbnail = JPEG_get_char();
2727*53ee8cc1Swenshuai.xi
2728*53ee8cc1Swenshuai.xi left-= 2;
2729*53ee8cc1Swenshuai.xi
2730*53ee8cc1Swenshuai.xi //Skip Version Number
2731*53ee8cc1Swenshuai.xi JPEG_skip_bytes(3*u8Xthumbnail*u8Ythumbnail);
2732*53ee8cc1Swenshuai.xi
2733*53ee8cc1Swenshuai.xi left-= 3*u8Xthumbnail*u8Ythumbnail;
2734*53ee8cc1Swenshuai.xi
2735*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP0 : unit : %d\n",(MS_U16)App0_Unit_Data.u8Unit);
2736*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP0 : Xdensity : %d\n",App0_Unit_Data.u16Xdensity);
2737*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP0 : Ydensity : %d\n",App0_Unit_Data.u16Ydensity);
2738*53ee8cc1Swenshuai.xi
2739*53ee8cc1Swenshuai.xi if(left > 0)
2740*53ee8cc1Swenshuai.xi JPEG_skip_bytes(left);
2741*53ee8cc1Swenshuai.xi
2742*53ee8cc1Swenshuai.xi return TRUE;
2743*53ee8cc1Swenshuai.xi }
2744*53ee8cc1Swenshuai.xi
_msAPI_JPEG_get_APP0_info(MS_U8 * unit,MS_U16 * x,MS_U16 * y)2745*53ee8cc1Swenshuai.xi void _msAPI_JPEG_get_APP0_info( MS_U8 *unit, MS_U16 *x, MS_U16 *y )
2746*53ee8cc1Swenshuai.xi {
2747*53ee8cc1Swenshuai.xi *unit = App0_Unit_Data.u8Unit;
2748*53ee8cc1Swenshuai.xi *x = App0_Unit_Data.u16Xdensity;
2749*53ee8cc1Swenshuai.xi *y = App0_Unit_Data.u16Ydensity;
2750*53ee8cc1Swenshuai.xi }
2751*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2752*53ee8cc1Swenshuai.xi // Read exif info
JPEG_read_app1_marker(void)2753*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_app1_marker(void)
2754*53ee8cc1Swenshuai.xi {
2755*53ee8cc1Swenshuai.xi MS_U16 length;
2756*53ee8cc1Swenshuai.xi MS_U8 *exif_buffer = (MS_U8 *) INTERNAL_BUFFER_ADDR;
2757*53ee8cc1Swenshuai.xi MS_U16 i = 0;
2758*53ee8cc1Swenshuai.xi
2759*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP1\n");
2760*53ee8cc1Swenshuai.xi
2761*53ee8cc1Swenshuai.xi length = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2762*53ee8cc1Swenshuai.xi
2763*53ee8cc1Swenshuai.xi if ( length < 2 )
2764*53ee8cc1Swenshuai.xi {
2765*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
2766*53ee8cc1Swenshuai.xi return FALSE;
2767*53ee8cc1Swenshuai.xi }
2768*53ee8cc1Swenshuai.xi
2769*53ee8cc1Swenshuai.xi length -= 2;
2770*53ee8cc1Swenshuai.xi
2771*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
2772*53ee8cc1Swenshuai.xi u32MPFOffset = length;
2773*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("u32MPFOffset=0x%lx\n", u32MPFOffset);
2774*53ee8cc1Swenshuai.xi #endif
2775*53ee8cc1Swenshuai.xi while((length - i)!=0)
2776*53ee8cc1Swenshuai.xi {
2777*53ee8cc1Swenshuai.xi exif_buffer[i] = (MS_U8) JPEG_get_char();
2778*53ee8cc1Swenshuai.xi i++;
2779*53ee8cc1Swenshuai.xi }
2780*53ee8cc1Swenshuai.xi
2781*53ee8cc1Swenshuai.xi if(JPEG_DecodeExifInfo(exif_buffer, length) == TRUE)
2782*53ee8cc1Swenshuai.xi {
2783*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FOUND THUMBNAIL!\n");
2784*53ee8cc1Swenshuai.xi _u32ThumbnailBufferOffset = _u32ThumbnailOffset;
2785*53ee8cc1Swenshuai.xi _u16ThumbnailBufferSize = _u16ThumbnailSize;
2786*53ee8cc1Swenshuai.xi }
2787*53ee8cc1Swenshuai.xi else
2788*53ee8cc1Swenshuai.xi {
2789*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("NO THUMBNAIL!\n");
2790*53ee8cc1Swenshuai.xi }
2791*53ee8cc1Swenshuai.xi return TRUE;
2792*53ee8cc1Swenshuai.xi }
2793*53ee8cc1Swenshuai.xi
2794*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
2795*53ee8cc1Swenshuai.xi
2796*53ee8cc1Swenshuai.xi // Read exif app2 info
JPEG_read_app2_marker(void)2797*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_read_app2_marker( void )
2798*53ee8cc1Swenshuai.xi {
2799*53ee8cc1Swenshuai.xi MS_U16 length;
2800*53ee8cc1Swenshuai.xi MS_U8 *exif_buffer = (MS_U8 *) (INTERNAL_BUFFER_ADDR + u32MPFOffset);
2801*53ee8cc1Swenshuai.xi MS_U16 i = 0;
2802*53ee8cc1Swenshuai.xi
2803*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP2\n");
2804*53ee8cc1Swenshuai.xi
2805*53ee8cc1Swenshuai.xi //For start of offset of MPO(only for first MPO picture)
2806*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_pu8In_buf_ofs = %lx\n", (MS_U32)_pu8In_buf_ofs);
2807*53ee8cc1Swenshuai.xi _u32App2MarkerOffset = (MS_U32)_pu8In_buf_ofs - 2;
2808*53ee8cc1Swenshuai.xi
2809*53ee8cc1Swenshuai.xi length = (MS_U16)((JPEG_get_char()<<8)+JPEG_get_char());
2810*53ee8cc1Swenshuai.xi
2811*53ee8cc1Swenshuai.xi if ( length < 2 )
2812*53ee8cc1Swenshuai.xi {
2813*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP2_MARKER );
2814*53ee8cc1Swenshuai.xi return FALSE;
2815*53ee8cc1Swenshuai.xi }
2816*53ee8cc1Swenshuai.xi
2817*53ee8cc1Swenshuai.xi length -= 2;
2818*53ee8cc1Swenshuai.xi
2819*53ee8cc1Swenshuai.xi if(length > INTERNAL_BUFFER_SIZE - u32MPFOffset)
2820*53ee8cc1Swenshuai.xi {
2821*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOTENOUGHMEM );
2822*53ee8cc1Swenshuai.xi return FALSE;
2823*53ee8cc1Swenshuai.xi }
2824*53ee8cc1Swenshuai.xi
2825*53ee8cc1Swenshuai.xi while((length - i)!=0)
2826*53ee8cc1Swenshuai.xi {
2827*53ee8cc1Swenshuai.xi exif_buffer[i] = (MS_U8) JPEG_get_char();
2828*53ee8cc1Swenshuai.xi i++;
2829*53ee8cc1Swenshuai.xi }
2830*53ee8cc1Swenshuai.xi
2831*53ee8cc1Swenshuai.xi if(JPEG_DecodeMPOInfo(exif_buffer)==TRUE)
2832*53ee8cc1Swenshuai.xi {
2833*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FOUND MPO!\n");
2834*53ee8cc1Swenshuai.xi bIsMPOFormat = TRUE;
2835*53ee8cc1Swenshuai.xi u32MPFOffset = 0; // Reset to zero after FOUND MPO
2836*53ee8cc1Swenshuai.xi
2837*53ee8cc1Swenshuai.xi //// TODO: MPO format not support thumbnail now....
2838*53ee8cc1Swenshuai.xi //_u8DecodeType = E_JPEG_TYPE_MAIN;
2839*53ee8cc1Swenshuai.xi //printf_red("NOTE: MPO not support thumbnail now!!!\n");
2840*53ee8cc1Swenshuai.xi }
2841*53ee8cc1Swenshuai.xi else
2842*53ee8cc1Swenshuai.xi {
2843*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("NO MPO!\n");
2844*53ee8cc1Swenshuai.xi // Not clear num_of_image for the image with 2 app2 marker
2845*53ee8cc1Swenshuai.xi // _stMPOIndex.num_of_image = 0;
2846*53ee8cc1Swenshuai.xi }
2847*53ee8cc1Swenshuai.xi return TRUE;
2848*53ee8cc1Swenshuai.xi }
2849*53ee8cc1Swenshuai.xi
2850*53ee8cc1Swenshuai.xi
2851*53ee8cc1Swenshuai.xi #endif
2852*53ee8cc1Swenshuai.xi
2853*53ee8cc1Swenshuai.xi // Read app14 info
JPEG_read_app14_marker(void)2854*53ee8cc1Swenshuai.xi static MS_BOOL JPEG_read_app14_marker( void )
2855*53ee8cc1Swenshuai.xi {
2856*53ee8cc1Swenshuai.xi
2857*53ee8cc1Swenshuai.xi MS_U32 left;
2858*53ee8cc1Swenshuai.xi MS_U8 u8Transform;
2859*53ee8cc1Swenshuai.xi
2860*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("APP14\n");
2861*53ee8cc1Swenshuai.xi
2862*53ee8cc1Swenshuai.xi //Get APP14 length
2863*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2864*53ee8cc1Swenshuai.xi
2865*53ee8cc1Swenshuai.xi left-= 2;
2866*53ee8cc1Swenshuai.xi
2867*53ee8cc1Swenshuai.xi if(left < 8)
2868*53ee8cc1Swenshuai.xi {
2869*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP0_MARKER );
2870*53ee8cc1Swenshuai.xi return FALSE;
2871*53ee8cc1Swenshuai.xi }
2872*53ee8cc1Swenshuai.xi
2873*53ee8cc1Swenshuai.xi //Skip Block ID "Adobe"
2874*53ee8cc1Swenshuai.xi JPEG_skip_bytes(5);
2875*53ee8cc1Swenshuai.xi
2876*53ee8cc1Swenshuai.xi left-= 5;
2877*53ee8cc1Swenshuai.xi
2878*53ee8cc1Swenshuai.xi //Skip Version Number
2879*53ee8cc1Swenshuai.xi JPEG_skip_bytes(2);
2880*53ee8cc1Swenshuai.xi
2881*53ee8cc1Swenshuai.xi left-= 2;
2882*53ee8cc1Swenshuai.xi
2883*53ee8cc1Swenshuai.xi //Skip F0 Number
2884*53ee8cc1Swenshuai.xi JPEG_skip_bytes(2);
2885*53ee8cc1Swenshuai.xi
2886*53ee8cc1Swenshuai.xi left-= 2;
2887*53ee8cc1Swenshuai.xi
2888*53ee8cc1Swenshuai.xi //Skip F1 Number
2889*53ee8cc1Swenshuai.xi JPEG_skip_bytes(2);
2890*53ee8cc1Swenshuai.xi
2891*53ee8cc1Swenshuai.xi left-= 2;
2892*53ee8cc1Swenshuai.xi
2893*53ee8cc1Swenshuai.xi u8Transform= JPEG_get_char();
2894*53ee8cc1Swenshuai.xi
2895*53ee8cc1Swenshuai.xi left-= 1;
2896*53ee8cc1Swenshuai.xi
2897*53ee8cc1Swenshuai.xi if(u8Transform!=1)
2898*53ee8cc1Swenshuai.xi {
2899*53ee8cc1Swenshuai.xi // 0: RGB or CMYK, depends on SOF
2900*53ee8cc1Swenshuai.xi // 1: YCbCr
2901*53ee8cc1Swenshuai.xi // 2: YCCK
2902*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Unsupported Adobe Format with Transform=%d\n", u8Transform);
2903*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
2904*53ee8cc1Swenshuai.xi return FALSE;
2905*53ee8cc1Swenshuai.xi }
2906*53ee8cc1Swenshuai.xi
2907*53ee8cc1Swenshuai.xi if(left > 0)
2908*53ee8cc1Swenshuai.xi JPEG_skip_bytes(left);
2909*53ee8cc1Swenshuai.xi
2910*53ee8cc1Swenshuai.xi return TRUE;
2911*53ee8cc1Swenshuai.xi }
2912*53ee8cc1Swenshuai.xi
2913*53ee8cc1Swenshuai.xi /* END OF EXIF PARSING SECTION */
2914*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2915*53ee8cc1Swenshuai.xi // Read a Huffman code table.
JPEG_read_dht_marker(void)2916*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_dht_marker(void)
2917*53ee8cc1Swenshuai.xi {
2918*53ee8cc1Swenshuai.xi MS_U16 i, index, count;
2919*53ee8cc1Swenshuai.xi MS_U32 left;
2920*53ee8cc1Swenshuai.xi MS_U8 u8Huff_num[17];
2921*53ee8cc1Swenshuai.xi MS_U8 u8Huff_val[256];
2922*53ee8cc1Swenshuai.xi
2923*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("DHT\n");
2924*53ee8cc1Swenshuai.xi
2925*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2926*53ee8cc1Swenshuai.xi
2927*53ee8cc1Swenshuai.xi if ( left < 2 )
2928*53ee8cc1Swenshuai.xi {
2929*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DHT_MARKER );
2930*53ee8cc1Swenshuai.xi return FALSE;
2931*53ee8cc1Swenshuai.xi }
2932*53ee8cc1Swenshuai.xi
2933*53ee8cc1Swenshuai.xi left -= 2;
2934*53ee8cc1Swenshuai.xi
2935*53ee8cc1Swenshuai.xi while ( left )
2936*53ee8cc1Swenshuai.xi {
2937*53ee8cc1Swenshuai.xi // set it to zero, initialize
2938*53ee8cc1Swenshuai.xi JPEG_memset((void *)u8Huff_num, 0, 17);
2939*53ee8cc1Swenshuai.xi JPEG_memset((void *)u8Huff_val, 0, 256);
2940*53ee8cc1Swenshuai.xi
2941*53ee8cc1Swenshuai.xi index = JPEG_get_char();
2942*53ee8cc1Swenshuai.xi
2943*53ee8cc1Swenshuai.xi u8Huff_num[0] = 0;
2944*53ee8cc1Swenshuai.xi
2945*53ee8cc1Swenshuai.xi count = 0;
2946*53ee8cc1Swenshuai.xi
2947*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
2948*53ee8cc1Swenshuai.xi {
2949*53ee8cc1Swenshuai.xi u8Huff_num[i] = JPEG_get_char();
2950*53ee8cc1Swenshuai.xi count += u8Huff_num[i];
2951*53ee8cc1Swenshuai.xi }
2952*53ee8cc1Swenshuai.xi
2953*53ee8cc1Swenshuai.xi if ( count > 255 )
2954*53ee8cc1Swenshuai.xi {
2955*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DHT_COUNTS );
2956*53ee8cc1Swenshuai.xi return FALSE;
2957*53ee8cc1Swenshuai.xi }
2958*53ee8cc1Swenshuai.xi
2959*53ee8cc1Swenshuai.xi for ( i = 0; i < count; i++ )
2960*53ee8cc1Swenshuai.xi {
2961*53ee8cc1Swenshuai.xi u8Huff_val[i] = JPEG_get_char();
2962*53ee8cc1Swenshuai.xi }
2963*53ee8cc1Swenshuai.xi
2964*53ee8cc1Swenshuai.xi i = 1 + 16 + count;
2965*53ee8cc1Swenshuai.xi
2966*53ee8cc1Swenshuai.xi if ( left < ( MS_U32 )i )
2967*53ee8cc1Swenshuai.xi {
2968*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DHT_MARKER );
2969*53ee8cc1Swenshuai.xi return FALSE;
2970*53ee8cc1Swenshuai.xi }
2971*53ee8cc1Swenshuai.xi
2972*53ee8cc1Swenshuai.xi left -= i;
2973*53ee8cc1Swenshuai.xi
2974*53ee8cc1Swenshuai.xi index = ( index & 0x0F ) + ( ( index & 0x10 ) >> 4 ) * ( JPEG_MAXHUFFTABLES >> 1 ); //???
2975*53ee8cc1Swenshuai.xi
2976*53ee8cc1Swenshuai.xi if ( index >= JPEG_MAXHUFFTABLES )
2977*53ee8cc1Swenshuai.xi {
2978*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DHT_INDEX );
2979*53ee8cc1Swenshuai.xi return FALSE;
2980*53ee8cc1Swenshuai.xi }
2981*53ee8cc1Swenshuai.xi
2982*53ee8cc1Swenshuai.xi if(_Huff_info[index].bValid==FALSE)
2983*53ee8cc1Swenshuai.xi _Huff_info[index].bValid = TRUE;
2984*53ee8cc1Swenshuai.xi
2985*53ee8cc1Swenshuai.xi JPEG_memcpy( (void *)_Huff_info[index].u8Huff_num, (void *)u8Huff_num, 17 );
2986*53ee8cc1Swenshuai.xi JPEG_memcpy( (void *)_Huff_info[index].u8Huff_val, (void *)u8Huff_val, 256 );
2987*53ee8cc1Swenshuai.xi
2988*53ee8cc1Swenshuai.xi // Compute the inverse order of HuffNum. this step is only needed in JPD mode (baseline)
2989*53ee8cc1Swenshuai.xi for(i = 1; i<=16; i++)
2990*53ee8cc1Swenshuai.xi {
2991*53ee8cc1Swenshuai.xi if(u8Huff_num[17 - i]!=0)
2992*53ee8cc1Swenshuai.xi {
2993*53ee8cc1Swenshuai.xi count = count - u8Huff_num[17 - i];
2994*53ee8cc1Swenshuai.xi u8Huff_num[17 - i] = count;
2995*53ee8cc1Swenshuai.xi }
2996*53ee8cc1Swenshuai.xi else
2997*53ee8cc1Swenshuai.xi u8Huff_num[17 - i] = 0xFF;
2998*53ee8cc1Swenshuai.xi }
2999*53ee8cc1Swenshuai.xi JPEG_memcpy( (void *)_Huff_info[index].u8Symbol, (void *)u8Huff_num, 17 );
3000*53ee8cc1Swenshuai.xi }
3001*53ee8cc1Swenshuai.xi return TRUE;
3002*53ee8cc1Swenshuai.xi }
3003*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3004*53ee8cc1Swenshuai.xi // Read a quantization table.
JPEG_read_dqt_marker(void)3005*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_dqt_marker(void)
3006*53ee8cc1Swenshuai.xi {
3007*53ee8cc1Swenshuai.xi MS_U16 n, i, prec;
3008*53ee8cc1Swenshuai.xi MS_U32 left;
3009*53ee8cc1Swenshuai.xi MS_U32 temp;
3010*53ee8cc1Swenshuai.xi
3011*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("DQT\n");
3012*53ee8cc1Swenshuai.xi
3013*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3014*53ee8cc1Swenshuai.xi
3015*53ee8cc1Swenshuai.xi if ( left < 2 )
3016*53ee8cc1Swenshuai.xi {
3017*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DQT_MARKER );
3018*53ee8cc1Swenshuai.xi return FALSE;
3019*53ee8cc1Swenshuai.xi }
3020*53ee8cc1Swenshuai.xi
3021*53ee8cc1Swenshuai.xi left -= 2;
3022*53ee8cc1Swenshuai.xi
3023*53ee8cc1Swenshuai.xi while ( left )
3024*53ee8cc1Swenshuai.xi {
3025*53ee8cc1Swenshuai.xi n = JPEG_get_char();
3026*53ee8cc1Swenshuai.xi prec = n >> 4;
3027*53ee8cc1Swenshuai.xi n &= 0x0F;
3028*53ee8cc1Swenshuai.xi
3029*53ee8cc1Swenshuai.xi if ( n >= JPEG_MAXQUANTTABLES )
3030*53ee8cc1Swenshuai.xi {
3031*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DQT_TABLE );
3032*53ee8cc1Swenshuai.xi return FALSE;
3033*53ee8cc1Swenshuai.xi }
3034*53ee8cc1Swenshuai.xi
3035*53ee8cc1Swenshuai.xi if(_QuantTables[n].bValid == FALSE)
3036*53ee8cc1Swenshuai.xi _QuantTables[n].bValid = TRUE;
3037*53ee8cc1Swenshuai.xi
3038*53ee8cc1Swenshuai.xi // read quantization entries, in zag order
3039*53ee8cc1Swenshuai.xi for ( i = 0; i < 64; i++ )
3040*53ee8cc1Swenshuai.xi {
3041*53ee8cc1Swenshuai.xi temp = JPEG_get_char();
3042*53ee8cc1Swenshuai.xi
3043*53ee8cc1Swenshuai.xi if ( prec )
3044*53ee8cc1Swenshuai.xi {
3045*53ee8cc1Swenshuai.xi temp = ( temp << 8 ) + JPEG_get_char();
3046*53ee8cc1Swenshuai.xi }
3047*53ee8cc1Swenshuai.xi
3048*53ee8cc1Swenshuai.xi _QuantTables[n].s16Value[i] = temp;
3049*53ee8cc1Swenshuai.xi }
3050*53ee8cc1Swenshuai.xi
3051*53ee8cc1Swenshuai.xi i = 64 + 1;
3052*53ee8cc1Swenshuai.xi
3053*53ee8cc1Swenshuai.xi if ( prec )
3054*53ee8cc1Swenshuai.xi {
3055*53ee8cc1Swenshuai.xi i += 64;
3056*53ee8cc1Swenshuai.xi }
3057*53ee8cc1Swenshuai.xi
3058*53ee8cc1Swenshuai.xi if ( left < ( MS_U32 )i )
3059*53ee8cc1Swenshuai.xi {
3060*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DQT_LENGTH );
3061*53ee8cc1Swenshuai.xi return FALSE;
3062*53ee8cc1Swenshuai.xi }
3063*53ee8cc1Swenshuai.xi
3064*53ee8cc1Swenshuai.xi left -= i;
3065*53ee8cc1Swenshuai.xi }
3066*53ee8cc1Swenshuai.xi return TRUE;
3067*53ee8cc1Swenshuai.xi }
3068*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3069*53ee8cc1Swenshuai.xi // Read the start of frame (SOF) marker.
JPEG_read_sof_marker(void)3070*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_sof_marker(void)
3071*53ee8cc1Swenshuai.xi {
3072*53ee8cc1Swenshuai.xi MS_U8 i;
3073*53ee8cc1Swenshuai.xi MS_U32 left;
3074*53ee8cc1Swenshuai.xi MS_U16 JpegMaxWidth, JpegMaxHeight;
3075*53ee8cc1Swenshuai.xi MS_U8 c1;
3076*53ee8cc1Swenshuai.xi
3077*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("SOF\n");
3078*53ee8cc1Swenshuai.xi
3079*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3080*53ee8cc1Swenshuai.xi
3081*53ee8cc1Swenshuai.xi if ( JPEG_get_char() != 8 ) /* precision: sorry, only 8-bit precision is supported right now */
3082*53ee8cc1Swenshuai.xi {
3083*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_PRECISION );
3084*53ee8cc1Swenshuai.xi return FALSE;
3085*53ee8cc1Swenshuai.xi }
3086*53ee8cc1Swenshuai.xi
3087*53ee8cc1Swenshuai.xi _u16Image_y_size = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3088*53ee8cc1Swenshuai.xi _u16Image_x_size = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3089*53ee8cc1Swenshuai.xi
3090*53ee8cc1Swenshuai.xi // save the original image size
3091*53ee8cc1Swenshuai.xi _u16OriginalImage_x_size = _u16Image_x_size;
3092*53ee8cc1Swenshuai.xi _u16OriginalImage_y_size = _u16Image_y_size;
3093*53ee8cc1Swenshuai.xi
3094*53ee8cc1Swenshuai.xi if((_bProgressive_flag)
3095*53ee8cc1Swenshuai.xi && (E_JPEG_TYPE_MAIN == _u8DecodeType))
3096*53ee8cc1Swenshuai.xi {
3097*53ee8cc1Swenshuai.xi //Define MAX picture size for progressive, 8 is the max factor of scale down
3098*53ee8cc1Swenshuai.xi JpegMaxWidth = JPEG_PRO_MAX_WIDTH * 8;
3099*53ee8cc1Swenshuai.xi JpegMaxHeight = JPEG_PRO_MAX_HEIGHT * 8;
3100*53ee8cc1Swenshuai.xi
3101*53ee8cc1Swenshuai.xi //Calculate Internal Buffer size
3102*53ee8cc1Swenshuai.xi //check needed buffer for progressive jpeg decoding, for worst case:
3103*53ee8cc1Swenshuai.xi MS_U32 buff_size = _u16Image_x_size*_u16Image_y_size*3*2
3104*53ee8cc1Swenshuai.xi + _u16Image_x_size*_u16Image_y_size*3*2/64
3105*53ee8cc1Swenshuai.xi + JPEG_DEFAULT_EXIF_SIZE
3106*53ee8cc1Swenshuai.xi + 8*1024;
3107*53ee8cc1Swenshuai.xi // if( (MS_U32)(_u16Image_x_size*_u16Image_y_size*3*2) > (MS_U32)(INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE) )
3108*53ee8cc1Swenshuai.xi if( buff_size > INTERNAL_BUFFER_SIZE )
3109*53ee8cc1Swenshuai.xi {
3110*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Progressive image size too big... do not handle it\n");
3111*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOTENOUGHMEM );
3112*53ee8cc1Swenshuai.xi return FALSE;
3113*53ee8cc1Swenshuai.xi }
3114*53ee8cc1Swenshuai.xi }
3115*53ee8cc1Swenshuai.xi else
3116*53ee8cc1Swenshuai.xi {
3117*53ee8cc1Swenshuai.xi //Define MAX picture size for Baseline, 8 is the max factor of scale down
3118*53ee8cc1Swenshuai.xi JpegMaxWidth = JPEG_MAX_WIDTH*8;
3119*53ee8cc1Swenshuai.xi JpegMaxHeight = JPEG_MAX_HEIGHT*8;
3120*53ee8cc1Swenshuai.xi }
3121*53ee8cc1Swenshuai.xi
3122*53ee8cc1Swenshuai.xi if ((_u16Image_y_size < 1) || (_u16Image_y_size > JpegMaxHeight))
3123*53ee8cc1Swenshuai.xi {
3124*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_BAD_HEIGHT);
3125*53ee8cc1Swenshuai.xi return FALSE;
3126*53ee8cc1Swenshuai.xi }
3127*53ee8cc1Swenshuai.xi
3128*53ee8cc1Swenshuai.xi if ((_u16Image_x_size < 1) || (_u16Image_x_size > JpegMaxWidth))
3129*53ee8cc1Swenshuai.xi {
3130*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_BAD_WIDTH);
3131*53ee8cc1Swenshuai.xi return FALSE;
3132*53ee8cc1Swenshuai.xi }
3133*53ee8cc1Swenshuai.xi
3134*53ee8cc1Swenshuai.xi _u8Comps_in_frame = JPEG_get_char();
3135*53ee8cc1Swenshuai.xi
3136*53ee8cc1Swenshuai.xi if ( _u8Comps_in_frame > JPEG_MAXCOMPONENTS )
3137*53ee8cc1Swenshuai.xi {
3138*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_TOO_MANY_COMPONENTS );
3139*53ee8cc1Swenshuai.xi return FALSE;
3140*53ee8cc1Swenshuai.xi }
3141*53ee8cc1Swenshuai.xi
3142*53ee8cc1Swenshuai.xi if ( left != ( MS_U32 )( _u8Comps_in_frame * 3 + 8 ) )
3143*53ee8cc1Swenshuai.xi {
3144*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOF_LENGTH );
3145*53ee8cc1Swenshuai.xi return FALSE;
3146*53ee8cc1Swenshuai.xi }
3147*53ee8cc1Swenshuai.xi
3148*53ee8cc1Swenshuai.xi for ( i = 0; i < _u8Comps_in_frame; i++ )
3149*53ee8cc1Swenshuai.xi {
3150*53ee8cc1Swenshuai.xi _u8Comp_ident[i] = JPEG_get_char();
3151*53ee8cc1Swenshuai.xi if(_u8Comp_ident[i]==0) // The component ID is start from 0 (0 1 2). The normal case is start from 1 (1 2 3) for YUV
3152*53ee8cc1Swenshuai.xi {
3153*53ee8cc1Swenshuai.xi _u8LumaCi = 0;
3154*53ee8cc1Swenshuai.xi _u8ChromaCi = 1;
3155*53ee8cc1Swenshuai.xi _u8Chroma2Ci = 2;
3156*53ee8cc1Swenshuai.xi }
3157*53ee8cc1Swenshuai.xi
3158*53ee8cc1Swenshuai.xi c1 = JPEG_get_char();
3159*53ee8cc1Swenshuai.xi
3160*53ee8cc1Swenshuai.xi _u8Comp_h_samp[i] = (c1 & 0xf0)>>4;
3161*53ee8cc1Swenshuai.xi _u8Comp_v_samp[i] = (c1 & 0x0f);
3162*53ee8cc1Swenshuai.xi _u8Comp_quant[i] = JPEG_get_char();
3163*53ee8cc1Swenshuai.xi
3164*53ee8cc1Swenshuai.xi // patch from LG driver for the file with the following problem:
3165*53ee8cc1Swenshuai.xi // only has one component, but its sampling factor is 1x2
3166*53ee8cc1Swenshuai.xi // Per the JPEG spec A.2.2 (see the attached file, "regardless of the values of H1 and V1"),
3167*53ee8cc1Swenshuai.xi // please always set H=1 & V=1 to hw, when mono image.
3168*53ee8cc1Swenshuai.xi if(_u8Comps_in_frame==1) //allen.chang 2011/6/16 patch
3169*53ee8cc1Swenshuai.xi {
3170*53ee8cc1Swenshuai.xi _u8Comp_h_samp[0] =1;
3171*53ee8cc1Swenshuai.xi _u8Comp_v_samp[0] =1;
3172*53ee8cc1Swenshuai.xi }
3173*53ee8cc1Swenshuai.xi
3174*53ee8cc1Swenshuai.xi }
3175*53ee8cc1Swenshuai.xi return TRUE;
3176*53ee8cc1Swenshuai.xi }
3177*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3178*53ee8cc1Swenshuai.xi // Used to skip unrecognized markers.
JPEG_skip_variable_marker(void)3179*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_skip_variable_marker(void)
3180*53ee8cc1Swenshuai.xi {
3181*53ee8cc1Swenshuai.xi MS_U32 left;
3182*53ee8cc1Swenshuai.xi
3183*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("SKIP markers\n");
3184*53ee8cc1Swenshuai.xi
3185*53ee8cc1Swenshuai.xi left = (MS_U32)((JPEG_get_char()<<8)|JPEG_get_char());
3186*53ee8cc1Swenshuai.xi
3187*53ee8cc1Swenshuai.xi if ( left < 2 )
3188*53ee8cc1Swenshuai.xi {
3189*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_VARIABLE_MARKER );
3190*53ee8cc1Swenshuai.xi return FALSE;
3191*53ee8cc1Swenshuai.xi }
3192*53ee8cc1Swenshuai.xi
3193*53ee8cc1Swenshuai.xi left -= 2;
3194*53ee8cc1Swenshuai.xi
3195*53ee8cc1Swenshuai.xi JPEG_skip_bytes(left);
3196*53ee8cc1Swenshuai.xi return TRUE;
3197*53ee8cc1Swenshuai.xi }
3198*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3199*53ee8cc1Swenshuai.xi // Read a define restart interval (DRI) marker.
JPEG_read_dri_marker(void)3200*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_dri_marker(void)
3201*53ee8cc1Swenshuai.xi {
3202*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("DRI\n");
3203*53ee8cc1Swenshuai.xi
3204*53ee8cc1Swenshuai.xi if ( (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char()) != 4 )
3205*53ee8cc1Swenshuai.xi {
3206*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_DRI_LENGTH );
3207*53ee8cc1Swenshuai.xi return FALSE;
3208*53ee8cc1Swenshuai.xi }
3209*53ee8cc1Swenshuai.xi
3210*53ee8cc1Swenshuai.xi _u16Restart_interval = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3211*53ee8cc1Swenshuai.xi return TRUE;
3212*53ee8cc1Swenshuai.xi }
3213*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3214*53ee8cc1Swenshuai.xi // Read a start of scan (SOS) marker.
JPEG_read_sos_marker(void)3215*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_read_sos_marker(void)
3216*53ee8cc1Swenshuai.xi {
3217*53ee8cc1Swenshuai.xi MS_U32 left;
3218*53ee8cc1Swenshuai.xi MS_U16 i, ci, n, c, cc;
3219*53ee8cc1Swenshuai.xi MS_U8 c1;
3220*53ee8cc1Swenshuai.xi
3221*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("SOS\n");
3222*53ee8cc1Swenshuai.xi
3223*53ee8cc1Swenshuai.xi left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3224*53ee8cc1Swenshuai.xi
3225*53ee8cc1Swenshuai.xi n = JPEG_get_char();
3226*53ee8cc1Swenshuai.xi
3227*53ee8cc1Swenshuai.xi _u8Comps_in_scan = n;
3228*53ee8cc1Swenshuai.xi
3229*53ee8cc1Swenshuai.xi left -= 3;
3230*53ee8cc1Swenshuai.xi
3231*53ee8cc1Swenshuai.xi if ( ( left != ( MS_U32 )( n * 2 + 3 ) ) || ( n < 1 ) || ( n > JPEG_MAXCOMPSINSCAN ) )
3232*53ee8cc1Swenshuai.xi {
3233*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_LENGTH );
3234*53ee8cc1Swenshuai.xi return FALSE;
3235*53ee8cc1Swenshuai.xi }
3236*53ee8cc1Swenshuai.xi
3237*53ee8cc1Swenshuai.xi for ( i = 0; i < n; i++ )
3238*53ee8cc1Swenshuai.xi {
3239*53ee8cc1Swenshuai.xi cc = JPEG_get_char();
3240*53ee8cc1Swenshuai.xi c = JPEG_get_char();
3241*53ee8cc1Swenshuai.xi left -= 2;
3242*53ee8cc1Swenshuai.xi
3243*53ee8cc1Swenshuai.xi for ( ci = 0; ci < _u8Comps_in_frame; ci++ )
3244*53ee8cc1Swenshuai.xi {
3245*53ee8cc1Swenshuai.xi if ( cc == _u8Comp_ident[ci] )
3246*53ee8cc1Swenshuai.xi {
3247*53ee8cc1Swenshuai.xi break;
3248*53ee8cc1Swenshuai.xi }
3249*53ee8cc1Swenshuai.xi }
3250*53ee8cc1Swenshuai.xi
3251*53ee8cc1Swenshuai.xi if ( ci >= _u8Comps_in_frame )
3252*53ee8cc1Swenshuai.xi {
3253*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_COMP_ID );
3254*53ee8cc1Swenshuai.xi return FALSE;
3255*53ee8cc1Swenshuai.xi }
3256*53ee8cc1Swenshuai.xi
3257*53ee8cc1Swenshuai.xi _u8Comp_list[i] = ci;
3258*53ee8cc1Swenshuai.xi _u8Comp_dc_tab[ci] = ( c >> 4 ) & 15;
3259*53ee8cc1Swenshuai.xi _u8Comp_ac_tab[ci] = ( c & 15 ) + ( JPEG_MAXHUFFTABLES >> 1 );
3260*53ee8cc1Swenshuai.xi }
3261*53ee8cc1Swenshuai.xi
3262*53ee8cc1Swenshuai.xi #ifndef CMODEL
3263*53ee8cc1Swenshuai.xi //HW limitation, for baseline JPEG, U.V need to refer to the same DC and AC huffman table.
3264*53ee8cc1Swenshuai.xi if(!_bProgressive_flag && (_u8Comps_in_frame == 3)) //Y.U.V.
3265*53ee8cc1Swenshuai.xi {
3266*53ee8cc1Swenshuai.xi if((_u8Comp_dc_tab[1] != _u8Comp_dc_tab[2])
3267*53ee8cc1Swenshuai.xi || (_u8Comp_ac_tab[1] != _u8Comp_ac_tab[2]))
3268*53ee8cc1Swenshuai.xi {
3269*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
3270*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("U, V use different Huffman table~~\n");
3271*53ee8cc1Swenshuai.xi bIs3HuffTbl = TRUE;
3272*53ee8cc1Swenshuai.xi #else
3273*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_HUFF_DECODE );
3274*53ee8cc1Swenshuai.xi return FALSE;
3275*53ee8cc1Swenshuai.xi #endif
3276*53ee8cc1Swenshuai.xi }
3277*53ee8cc1Swenshuai.xi }
3278*53ee8cc1Swenshuai.xi #endif
3279*53ee8cc1Swenshuai.xi
3280*53ee8cc1Swenshuai.xi _u8Spectral_start = JPEG_get_char();
3281*53ee8cc1Swenshuai.xi _u8Spectral_end = JPEG_get_char();
3282*53ee8cc1Swenshuai.xi c1 = JPEG_get_char();
3283*53ee8cc1Swenshuai.xi _u8Successive_high = (c1 & 0xf0)>>4;
3284*53ee8cc1Swenshuai.xi _u8Successive_low = (c1 & 0x0f);
3285*53ee8cc1Swenshuai.xi
3286*53ee8cc1Swenshuai.xi if ( !_bProgressive_flag )
3287*53ee8cc1Swenshuai.xi {
3288*53ee8cc1Swenshuai.xi _u8Spectral_start = 0;
3289*53ee8cc1Swenshuai.xi _u8Spectral_end = 63;
3290*53ee8cc1Swenshuai.xi }
3291*53ee8cc1Swenshuai.xi
3292*53ee8cc1Swenshuai.xi left -= 3;
3293*53ee8cc1Swenshuai.xi
3294*53ee8cc1Swenshuai.xi JPEG_skip_bytes(left); /* read past whatever is left */
3295*53ee8cc1Swenshuai.xi return TRUE;
3296*53ee8cc1Swenshuai.xi }
3297*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3298*53ee8cc1Swenshuai.xi // Finds the next marker.
JPEG_next_marker(void)3299*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_next_marker(void) //ok
3300*53ee8cc1Swenshuai.xi {
3301*53ee8cc1Swenshuai.xi MS_U32 c, bytes;
3302*53ee8cc1Swenshuai.xi
3303*53ee8cc1Swenshuai.xi bytes = 0;
3304*53ee8cc1Swenshuai.xi
3305*53ee8cc1Swenshuai.xi do
3306*53ee8cc1Swenshuai.xi {
3307*53ee8cc1Swenshuai.xi do
3308*53ee8cc1Swenshuai.xi {
3309*53ee8cc1Swenshuai.xi bytes++;
3310*53ee8cc1Swenshuai.xi
3311*53ee8cc1Swenshuai.xi c = JPEG_get_char();
3312*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("c = %X\n",c);
3313*53ee8cc1Swenshuai.xi }
3314*53ee8cc1Swenshuai.xi while ( c != 0xFF );
3315*53ee8cc1Swenshuai.xi
3316*53ee8cc1Swenshuai.xi do
3317*53ee8cc1Swenshuai.xi {
3318*53ee8cc1Swenshuai.xi c = JPEG_get_char();
3319*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("c = %X\n",c);
3320*53ee8cc1Swenshuai.xi }
3321*53ee8cc1Swenshuai.xi while ( c == 0xFF );
3322*53ee8cc1Swenshuai.xi }
3323*53ee8cc1Swenshuai.xi while ( c == 0 );
3324*53ee8cc1Swenshuai.xi
3325*53ee8cc1Swenshuai.xi // If bytes > 0 here, there where extra bytes before the marker (not good).
3326*53ee8cc1Swenshuai.xi
3327*53ee8cc1Swenshuai.xi return c;
3328*53ee8cc1Swenshuai.xi }
3329*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3330*53ee8cc1Swenshuai.xi // Process markers. Returns when an SOFx, SOI, EOI, or SOS marker is
3331*53ee8cc1Swenshuai.xi // encountered.
JPEG_process_markers(void)3332*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_process_markers(void)
3333*53ee8cc1Swenshuai.xi {
3334*53ee8cc1Swenshuai.xi MS_U32 c;
3335*53ee8cc1Swenshuai.xi
3336*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_process_markers:\n");
3337*53ee8cc1Swenshuai.xi for ( ; ; )
3338*53ee8cc1Swenshuai.xi {
3339*53ee8cc1Swenshuai.xi c = JPEG_next_marker();
3340*53ee8cc1Swenshuai.xi
3341*53ee8cc1Swenshuai.xi switch ( c )
3342*53ee8cc1Swenshuai.xi {
3343*53ee8cc1Swenshuai.xi case E_JPEG_APP1:
3344*53ee8cc1Swenshuai.xi // Prevent from there's thumbnail in thumbnail... & multiple APP1
3345*53ee8cc1Swenshuai.xi // Although it's impossible.. =_=
3346*53ee8cc1Swenshuai.xi // if((E_JPEG_TYPE_THUMBNAIL == _u8DecodeType)
3347*53ee8cc1Swenshuai.xi // && (FALSE == _bThumbnailFound))
3348*53ee8cc1Swenshuai.xi // We need to get EXIF info for decoding main picture or thumbnail.
3349*53ee8cc1Swenshuai.xi if((__bIsMjpeg == FALSE)
3350*53ee8cc1Swenshuai.xi && (FALSE == _bThumbnailFound))
3351*53ee8cc1Swenshuai.xi {
3352*53ee8cc1Swenshuai.xi if( !JPEG_read_app1_marker() )
3353*53ee8cc1Swenshuai.xi return FALSE;
3354*53ee8cc1Swenshuai.xi }
3355*53ee8cc1Swenshuai.xi else
3356*53ee8cc1Swenshuai.xi {
3357*53ee8cc1Swenshuai.xi if( !JPEG_skip_variable_marker() )
3358*53ee8cc1Swenshuai.xi return FALSE;
3359*53ee8cc1Swenshuai.xi }
3360*53ee8cc1Swenshuai.xi break;
3361*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
3362*53ee8cc1Swenshuai.xi case E_JPEG_APP2:
3363*53ee8cc1Swenshuai.xi if( !JPEG_read_app2_marker() )
3364*53ee8cc1Swenshuai.xi return FALSE;
3365*53ee8cc1Swenshuai.xi break;
3366*53ee8cc1Swenshuai.xi
3367*53ee8cc1Swenshuai.xi #endif
3368*53ee8cc1Swenshuai.xi case E_JPEG_SOF0:
3369*53ee8cc1Swenshuai.xi case E_JPEG_SOF1:
3370*53ee8cc1Swenshuai.xi case E_JPEG_SOF2:
3371*53ee8cc1Swenshuai.xi case E_JPEG_SOF3:
3372*53ee8cc1Swenshuai.xi case E_JPEG_SOF5:
3373*53ee8cc1Swenshuai.xi case E_JPEG_SOF6:
3374*53ee8cc1Swenshuai.xi case E_JPEG_SOF7:
3375*53ee8cc1Swenshuai.xi // case E_JPEG_JPG:
3376*53ee8cc1Swenshuai.xi case E_JPEG_SOF9:
3377*53ee8cc1Swenshuai.xi case E_JPEG_SOF10:
3378*53ee8cc1Swenshuai.xi case E_JPEG_SOF11:
3379*53ee8cc1Swenshuai.xi case E_JPEG_SOF13:
3380*53ee8cc1Swenshuai.xi case E_JPEG_SOF14:
3381*53ee8cc1Swenshuai.xi case E_JPEG_SOF15:
3382*53ee8cc1Swenshuai.xi case E_JPEG_SOI:
3383*53ee8cc1Swenshuai.xi case E_JPEG_EOI:
3384*53ee8cc1Swenshuai.xi case E_JPEG_SOS:
3385*53ee8cc1Swenshuai.xi {
3386*53ee8cc1Swenshuai.xi return c;
3387*53ee8cc1Swenshuai.xi }
3388*53ee8cc1Swenshuai.xi case E_JPEG_DHT:
3389*53ee8cc1Swenshuai.xi {
3390*53ee8cc1Swenshuai.xi if( !JPEG_read_dht_marker() )
3391*53ee8cc1Swenshuai.xi return FALSE;
3392*53ee8cc1Swenshuai.xi _HeadCheck.DHT = TRUE;
3393*53ee8cc1Swenshuai.xi break;
3394*53ee8cc1Swenshuai.xi }
3395*53ee8cc1Swenshuai.xi // Sorry, no arithmitic support at this time. Dumb patents!
3396*53ee8cc1Swenshuai.xi case E_JPEG_DAC:
3397*53ee8cc1Swenshuai.xi {
3398*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NO_ARITHMETIC_SUPPORT );
3399*53ee8cc1Swenshuai.xi return FALSE;
3400*53ee8cc1Swenshuai.xi break;
3401*53ee8cc1Swenshuai.xi }
3402*53ee8cc1Swenshuai.xi case E_JPEG_DQT:
3403*53ee8cc1Swenshuai.xi {
3404*53ee8cc1Swenshuai.xi if( !JPEG_read_dqt_marker() )
3405*53ee8cc1Swenshuai.xi return FALSE;
3406*53ee8cc1Swenshuai.xi _HeadCheck.DQT = TRUE;
3407*53ee8cc1Swenshuai.xi break;
3408*53ee8cc1Swenshuai.xi }
3409*53ee8cc1Swenshuai.xi case E_JPEG_DRI:
3410*53ee8cc1Swenshuai.xi {
3411*53ee8cc1Swenshuai.xi if( !JPEG_read_dri_marker() )
3412*53ee8cc1Swenshuai.xi return FALSE;
3413*53ee8cc1Swenshuai.xi break;
3414*53ee8cc1Swenshuai.xi }
3415*53ee8cc1Swenshuai.xi //case E_JPEG_APP0: /* no need to read the JFIF marker */
3416*53ee8cc1Swenshuai.xi
3417*53ee8cc1Swenshuai.xi case E_JPEG_JPG:
3418*53ee8cc1Swenshuai.xi case E_JPEG_RST0:
3419*53ee8cc1Swenshuai.xi /* no parameters */
3420*53ee8cc1Swenshuai.xi case E_JPEG_RST1:
3421*53ee8cc1Swenshuai.xi case E_JPEG_RST2:
3422*53ee8cc1Swenshuai.xi case E_JPEG_RST3:
3423*53ee8cc1Swenshuai.xi case E_JPEG_RST4:
3424*53ee8cc1Swenshuai.xi case E_JPEG_RST5:
3425*53ee8cc1Swenshuai.xi case E_JPEG_RST6:
3426*53ee8cc1Swenshuai.xi case E_JPEG_RST7:
3427*53ee8cc1Swenshuai.xi case E_JPEG_TEM:
3428*53ee8cc1Swenshuai.xi {
3429*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
3430*53ee8cc1Swenshuai.xi return FALSE;
3431*53ee8cc1Swenshuai.xi break;
3432*53ee8cc1Swenshuai.xi }
3433*53ee8cc1Swenshuai.xi case E_JPEG_APP0:
3434*53ee8cc1Swenshuai.xi if (!bMHEG5)
3435*53ee8cc1Swenshuai.xi {
3436*53ee8cc1Swenshuai.xi if(!JPEG_skip_variable_marker())
3437*53ee8cc1Swenshuai.xi {
3438*53ee8cc1Swenshuai.xi return FALSE;
3439*53ee8cc1Swenshuai.xi }
3440*53ee8cc1Swenshuai.xi break;
3441*53ee8cc1Swenshuai.xi }
3442*53ee8cc1Swenshuai.xi if(!JPEG_read_app0_marker())
3443*53ee8cc1Swenshuai.xi {
3444*53ee8cc1Swenshuai.xi return FALSE;
3445*53ee8cc1Swenshuai.xi }
3446*53ee8cc1Swenshuai.xi break;
3447*53ee8cc1Swenshuai.xi case E_JPEG_APP14:
3448*53ee8cc1Swenshuai.xi if(__bIsMjpeg == FALSE)
3449*53ee8cc1Swenshuai.xi {
3450*53ee8cc1Swenshuai.xi if( !JPEG_read_app14_marker() )
3451*53ee8cc1Swenshuai.xi return FALSE;
3452*53ee8cc1Swenshuai.xi }
3453*53ee8cc1Swenshuai.xi else
3454*53ee8cc1Swenshuai.xi {
3455*53ee8cc1Swenshuai.xi if( !JPEG_skip_variable_marker() )
3456*53ee8cc1Swenshuai.xi return FALSE;
3457*53ee8cc1Swenshuai.xi }
3458*53ee8cc1Swenshuai.xi break;
3459*53ee8cc1Swenshuai.xi case E_JPEG_DNL:
3460*53ee8cc1Swenshuai.xi case E_JPEG_DHP:
3461*53ee8cc1Swenshuai.xi case E_JPEG_EXP:
3462*53ee8cc1Swenshuai.xi #if (SUPPORT_MPO_FORMAT == 0)
3463*53ee8cc1Swenshuai.xi case E_JPEG_APP2:
3464*53ee8cc1Swenshuai.xi #endif
3465*53ee8cc1Swenshuai.xi case E_JPEG_APP3:
3466*53ee8cc1Swenshuai.xi case E_JPEG_APP4:
3467*53ee8cc1Swenshuai.xi case E_JPEG_APP5:
3468*53ee8cc1Swenshuai.xi case E_JPEG_APP6:
3469*53ee8cc1Swenshuai.xi case E_JPEG_APP7:
3470*53ee8cc1Swenshuai.xi case E_JPEG_APP8:
3471*53ee8cc1Swenshuai.xi case E_JPEG_APP9:
3472*53ee8cc1Swenshuai.xi case E_JPEG_APP10:
3473*53ee8cc1Swenshuai.xi case E_JPEG_APP11:
3474*53ee8cc1Swenshuai.xi case E_JPEG_APP12:
3475*53ee8cc1Swenshuai.xi case E_JPEG_APP13:
3476*53ee8cc1Swenshuai.xi case E_JPEG_APP15:
3477*53ee8cc1Swenshuai.xi case E_JPEG_JPG0:
3478*53ee8cc1Swenshuai.xi case E_JPEG_JPG1:
3479*53ee8cc1Swenshuai.xi case E_JPEG_JPG2:
3480*53ee8cc1Swenshuai.xi case E_JPEG_JPG3:
3481*53ee8cc1Swenshuai.xi case E_JPEG_JPG4:
3482*53ee8cc1Swenshuai.xi case E_JPEG_JPG5:
3483*53ee8cc1Swenshuai.xi case E_JPEG_JPG6:
3484*53ee8cc1Swenshuai.xi case E_JPEG_JPG7:
3485*53ee8cc1Swenshuai.xi case E_JPEG_JPG8:
3486*53ee8cc1Swenshuai.xi case E_JPEG_JPG9:
3487*53ee8cc1Swenshuai.xi case E_JPEG_JPG10:
3488*53ee8cc1Swenshuai.xi case E_JPEG_JPG11:
3489*53ee8cc1Swenshuai.xi case E_JPEG_JPG12:
3490*53ee8cc1Swenshuai.xi case E_JPEG_JPG13:
3491*53ee8cc1Swenshuai.xi case E_JPEG_COM:
3492*53ee8cc1Swenshuai.xi /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */
3493*53ee8cc1Swenshuai.xi {
3494*53ee8cc1Swenshuai.xi if(!JPEG_skip_variable_marker())
3495*53ee8cc1Swenshuai.xi {
3496*53ee8cc1Swenshuai.xi return FALSE;
3497*53ee8cc1Swenshuai.xi }
3498*53ee8cc1Swenshuai.xi break;
3499*53ee8cc1Swenshuai.xi }
3500*53ee8cc1Swenshuai.xi default:
3501*53ee8cc1Swenshuai.xi break;
3502*53ee8cc1Swenshuai.xi }
3503*53ee8cc1Swenshuai.xi }
3504*53ee8cc1Swenshuai.xi return TRUE;
3505*53ee8cc1Swenshuai.xi }
3506*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3507*53ee8cc1Swenshuai.xi // Finds the start of image (SOI) marker.
3508*53ee8cc1Swenshuai.xi // This code is rather defensive: it only checks the first 512 bytes to avoid
3509*53ee8cc1Swenshuai.xi // false positives.
JPEG_locate_soi_marker(void)3510*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_locate_soi_marker(void)
3511*53ee8cc1Swenshuai.xi {
3512*53ee8cc1Swenshuai.xi MS_U32 lastchar, thischar;
3513*53ee8cc1Swenshuai.xi MS_U32 bytesleft;
3514*53ee8cc1Swenshuai.xi
3515*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
3516*53ee8cc1Swenshuai.xi
3517*53ee8cc1Swenshuai.xi lastchar = JPEG_get_char();
3518*53ee8cc1Swenshuai.xi
3519*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("0x%lx\n", lastchar);
3520*53ee8cc1Swenshuai.xi thischar = JPEG_get_char();
3521*53ee8cc1Swenshuai.xi
3522*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("0x%lx\n", thischar);
3523*53ee8cc1Swenshuai.xi /* ok if it's a normal JPEG file without a special header */
3524*53ee8cc1Swenshuai.xi
3525*53ee8cc1Swenshuai.xi if ((0xFF == lastchar)
3526*53ee8cc1Swenshuai.xi && (E_JPEG_SOI == thischar))
3527*53ee8cc1Swenshuai.xi {
3528*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("SOI\n");
3529*53ee8cc1Swenshuai.xi return TRUE;
3530*53ee8cc1Swenshuai.xi }
3531*53ee8cc1Swenshuai.xi
3532*53ee8cc1Swenshuai.xi // Set this value to 0x1000 for 4k alignment MPO case when parse 2nd/3rd/... JPEG file
3533*53ee8cc1Swenshuai.xi bytesleft = 0x1000; //Fix this number from 512 -> 640 for some cases
3534*53ee8cc1Swenshuai.xi
3535*53ee8cc1Swenshuai.xi for ( ; ; )
3536*53ee8cc1Swenshuai.xi {
3537*53ee8cc1Swenshuai.xi if ( --bytesleft == 0 )
3538*53ee8cc1Swenshuai.xi {
3539*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOT_JPEG );
3540*53ee8cc1Swenshuai.xi return FALSE;
3541*53ee8cc1Swenshuai.xi }
3542*53ee8cc1Swenshuai.xi
3543*53ee8cc1Swenshuai.xi lastchar = thischar;
3544*53ee8cc1Swenshuai.xi
3545*53ee8cc1Swenshuai.xi thischar = JPEG_get_char();
3546*53ee8cc1Swenshuai.xi
3547*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("%x ", (MS_U8)thischar);
3548*53ee8cc1Swenshuai.xi //if(bytesleft%8==0)
3549*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("\n");
3550*53ee8cc1Swenshuai.xi
3551*53ee8cc1Swenshuai.xi if ((0xFF == lastchar)
3552*53ee8cc1Swenshuai.xi && (E_JPEG_SOI == thischar))
3553*53ee8cc1Swenshuai.xi {
3554*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("SOI\n");
3555*53ee8cc1Swenshuai.xi break;
3556*53ee8cc1Swenshuai.xi }
3557*53ee8cc1Swenshuai.xi }
3558*53ee8cc1Swenshuai.xi
3559*53ee8cc1Swenshuai.xi /* Check the next character after marker: if it's not 0xFF, it can't
3560*53ee8cc1Swenshuai.xi be the start of the next marker, so it probably isn't a JPEG */
3561*53ee8cc1Swenshuai.xi /* need to check for more detail, currently _u32Bit_buf is not updated during JPEG_get_char()
3562*53ee8cc1Swenshuai.xi thischar = ( _u32Bit_buf >> 8 ) & 0xFF;
3563*53ee8cc1Swenshuai.xi
3564*53ee8cc1Swenshuai.xi if ( thischar != 0xFF )
3565*53ee8cc1Swenshuai.xi {
3566*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOT_JPEG );
3567*53ee8cc1Swenshuai.xi return FALSE;
3568*53ee8cc1Swenshuai.xi }
3569*53ee8cc1Swenshuai.xi */
3570*53ee8cc1Swenshuai.xi return TRUE;
3571*53ee8cc1Swenshuai.xi }
3572*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3573*53ee8cc1Swenshuai.xi // Find a start of frame (SOF) marker.
JPEG_locate_sof_marker(void)3574*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_locate_sof_marker(void)
3575*53ee8cc1Swenshuai.xi {
3576*53ee8cc1Swenshuai.xi MS_U32 c;
3577*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
3578*53ee8cc1Swenshuai.xi
3579*53ee8cc1Swenshuai.xi if(!JPEG_locate_soi_marker())
3580*53ee8cc1Swenshuai.xi return FALSE;
3581*53ee8cc1Swenshuai.xi
3582*53ee8cc1Swenshuai.xi c = JPEG_process_markers();
3583*53ee8cc1Swenshuai.xi
3584*53ee8cc1Swenshuai.xi if( c == FALSE )
3585*53ee8cc1Swenshuai.xi return FALSE;
3586*53ee8cc1Swenshuai.xi
3587*53ee8cc1Swenshuai.xi switch ( c )
3588*53ee8cc1Swenshuai.xi {
3589*53ee8cc1Swenshuai.xi case E_JPEG_SOF2:
3590*53ee8cc1Swenshuai.xi {
3591*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Progressive\n");
3592*53ee8cc1Swenshuai.xi _bProgressive_flag = TRUE;
3593*53ee8cc1Swenshuai.xi u32SOFOffset = u32DataOffset + JPEG_GetECS() - 2;
3594*53ee8cc1Swenshuai.xi if(!JPEG_read_sof_marker())
3595*53ee8cc1Swenshuai.xi return FALSE;
3596*53ee8cc1Swenshuai.xi break;
3597*53ee8cc1Swenshuai.xi }
3598*53ee8cc1Swenshuai.xi case E_JPEG_SOF0:
3599*53ee8cc1Swenshuai.xi /* baseline DCT */
3600*53ee8cc1Swenshuai.xi case E_JPEG_SOF1:
3601*53ee8cc1Swenshuai.xi /* extended sequential DCT */
3602*53ee8cc1Swenshuai.xi {
3603*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Baseline\n");
3604*53ee8cc1Swenshuai.xi u32SOFOffset = u32DataOffset + JPEG_GetECS() - 2;
3605*53ee8cc1Swenshuai.xi if(!JPEG_read_sof_marker())
3606*53ee8cc1Swenshuai.xi return FALSE;
3607*53ee8cc1Swenshuai.xi break;
3608*53ee8cc1Swenshuai.xi }
3609*53ee8cc1Swenshuai.xi case E_JPEG_SOF9:
3610*53ee8cc1Swenshuai.xi /* Arithmitic coding */
3611*53ee8cc1Swenshuai.xi {
3612*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NO_ARITHMETIC_SUPPORT );
3613*53ee8cc1Swenshuai.xi return FALSE;
3614*53ee8cc1Swenshuai.xi break;
3615*53ee8cc1Swenshuai.xi }
3616*53ee8cc1Swenshuai.xi
3617*53ee8cc1Swenshuai.xi default:
3618*53ee8cc1Swenshuai.xi {
3619*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("parsed unsupported marker = 0x%04lX\n", c);
3620*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_MARKER );
3621*53ee8cc1Swenshuai.xi return FALSE;
3622*53ee8cc1Swenshuai.xi break;
3623*53ee8cc1Swenshuai.xi }
3624*53ee8cc1Swenshuai.xi }
3625*53ee8cc1Swenshuai.xi return TRUE;
3626*53ee8cc1Swenshuai.xi }
3627*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3628*53ee8cc1Swenshuai.xi // Find a start of scan (SOS) marker.
JPEG_locate_sos_marker(void)3629*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_locate_sos_marker(void)
3630*53ee8cc1Swenshuai.xi {
3631*53ee8cc1Swenshuai.xi MS_U32 c;
3632*53ee8cc1Swenshuai.xi
3633*53ee8cc1Swenshuai.xi c = JPEG_process_markers();
3634*53ee8cc1Swenshuai.xi
3635*53ee8cc1Swenshuai.xi if ( c == E_JPEG_EOI )
3636*53ee8cc1Swenshuai.xi {
3637*53ee8cc1Swenshuai.xi return FALSE;
3638*53ee8cc1Swenshuai.xi }
3639*53ee8cc1Swenshuai.xi else if ( c != E_JPEG_SOS )
3640*53ee8cc1Swenshuai.xi {
3641*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
3642*53ee8cc1Swenshuai.xi return FALSE;
3643*53ee8cc1Swenshuai.xi }
3644*53ee8cc1Swenshuai.xi
3645*53ee8cc1Swenshuai.xi if(!JPEG_read_sos_marker())
3646*53ee8cc1Swenshuai.xi return FALSE;
3647*53ee8cc1Swenshuai.xi
3648*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG(" _pu8In_buf_MPO_ofs=0x%lx, _u32In_buf_MPO_left=0x%lx===========================\n", (MS_U32)_pu8In_buf_ofs, (MS_U32)_u32In_buf_left);
3649*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%02x %02x %02x %02x %02x %02x %02x %02x \n",
3650*53ee8cc1Swenshuai.xi *_pu8In_buf_ofs, *(_pu8In_buf_ofs+1), *(_pu8In_buf_ofs+2), *(_pu8In_buf_ofs+3),
3651*53ee8cc1Swenshuai.xi *(_pu8In_buf_ofs+4), *(_pu8In_buf_ofs+5), *(_pu8In_buf_ofs+6), *(_pu8In_buf_ofs+7)
3652*53ee8cc1Swenshuai.xi );
3653*53ee8cc1Swenshuai.xi
3654*53ee8cc1Swenshuai.xi return TRUE;
3655*53ee8cc1Swenshuai.xi }
3656*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3657*53ee8cc1Swenshuai.xi // Reset thumbnail parameters
JPEG_init_thumbnail(void)3658*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_init_thumbnail(void)
3659*53ee8cc1Swenshuai.xi {
3660*53ee8cc1Swenshuai.xi _bThumbnailFound = FALSE;
3661*53ee8cc1Swenshuai.xi _u32ThumbnailOffset = 0;
3662*53ee8cc1Swenshuai.xi _u16ThumbnailSize = 0;
3663*53ee8cc1Swenshuai.xi _bTiffBigEndian = FALSE;
3664*53ee8cc1Swenshuai.xi
3665*53ee8cc1Swenshuai.xi _u32ThumbnailBufferOffset = 0;
3666*53ee8cc1Swenshuai.xi _u16ThumbnailSize = 0;
3667*53ee8cc1Swenshuai.xi _bThumbnailAccessMode = FALSE;
3668*53ee8cc1Swenshuai.xi
3669*53ee8cc1Swenshuai.xi _stEXIF_DateTime.bHasDataTime = FALSE;
3670*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Year = 0;
3671*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Month = 0;
3672*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Day = 0;
3673*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Hour = 0;
3674*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Minute = 0;
3675*53ee8cc1Swenshuai.xi _stEXIF_DateTime.u32Second = 0;
3676*53ee8cc1Swenshuai.xi _eEXIF_Orientation = E_JPEG_EXIF_ORIENT_NOT_FOUND;
3677*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
3678*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8EXIF_Manufacturer, 0, JPEG_MANUFACTURER_SIZE);
3679*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8EXIF_Model, 0, JPEG_MODEL_SIZE);
3680*53ee8cc1Swenshuai.xi _u16EXIF_Flash = 0;
3681*53ee8cc1Swenshuai.xi _u16EXIF_Exposureprogram = 0;
3682*53ee8cc1Swenshuai.xi _u32EXIF_ISOSpeedRatings = 0;
3683*53ee8cc1Swenshuai.xi _stEXIF_ShutterSpeedValue.numerator = 0;
3684*53ee8cc1Swenshuai.xi _stEXIF_ShutterSpeedValue.denominator= 0;
3685*53ee8cc1Swenshuai.xi _stEXIF_ApertureValue.s_numerator= 0;
3686*53ee8cc1Swenshuai.xi _stEXIF_ApertureValue.s_denominator= 0;
3687*53ee8cc1Swenshuai.xi _stEXIF_ExposureBiasValue.numerator= 0;
3688*53ee8cc1Swenshuai.xi _stEXIF_ExposureBiasValue.denominator= 0;
3689*53ee8cc1Swenshuai.xi _stEXIF_FocalLength.s_numerator= 0;
3690*53ee8cc1Swenshuai.xi _stEXIF_FocalLength.s_denominator= 0;
3691*53ee8cc1Swenshuai.xi _u32EXIF_ImageWidth = 0;
3692*53ee8cc1Swenshuai.xi _u32EXIF_ImageHeight = 0;
3693*53ee8cc1Swenshuai.xi _stEXIF_ExposureTime.numerator = 0;
3694*53ee8cc1Swenshuai.xi _stEXIF_ExposureTime.denominator =0;
3695*53ee8cc1Swenshuai.xi _stEXIF_FNumber.numerator = 0;
3696*53ee8cc1Swenshuai.xi _stEXIF_FNumber.denominator =0;
3697*53ee8cc1Swenshuai.xi #endif
3698*53ee8cc1Swenshuai.xi }
3699*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3700*53ee8cc1Swenshuai.xi // Reset everything to default/uninitialized state.
JPEG_init(void)3701*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init(void)
3702*53ee8cc1Swenshuai.xi {
3703*53ee8cc1Swenshuai.xi MS_U16 i;
3704*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s!!\n", __FUNCTION__);
3705*53ee8cc1Swenshuai.xi _u8LumaCi = 1;
3706*53ee8cc1Swenshuai.xi _u8ChromaCi = 2;
3707*53ee8cc1Swenshuai.xi _u8Chroma2Ci = 3;
3708*53ee8cc1Swenshuai.xi bIs3HuffTbl = FALSE;
3709*53ee8cc1Swenshuai.xi
3710*53ee8cc1Swenshuai.xi _Error_code = E_JPEG_NO_ERROR;
3711*53ee8cc1Swenshuai.xi
3712*53ee8cc1Swenshuai.xi #ifdef CMODEL
3713*53ee8cc1Swenshuai.xi _bReady_flag = FALSE;
3714*53ee8cc1Swenshuai.xi #endif
3715*53ee8cc1Swenshuai.xi
3716*53ee8cc1Swenshuai.xi _u16Image_x_size = _u16Image_y_size = 0;
3717*53ee8cc1Swenshuai.xi _u16OriginalImage_x_size = _u16OriginalImage_y_size = 0;
3718*53ee8cc1Swenshuai.xi _u16AlignedImageWidth = _u16AlignedImagePitch = _u16AlignedImageHeight = 0;
3719*53ee8cc1Swenshuai.xi _u16AlignedImagePitch_H = 0;
3720*53ee8cc1Swenshuai.xi
3721*53ee8cc1Swenshuai.xi //// _pStream = _Pstream;
3722*53ee8cc1Swenshuai.xi
3723*53ee8cc1Swenshuai.xi _bProgressive_flag = FALSE;
3724*53ee8cc1Swenshuai.xi #ifndef CMODEL
3725*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
3726*53ee8cc1Swenshuai.xi #endif
3727*53ee8cc1Swenshuai.xi _u32RLEOffset = 0;
3728*53ee8cc1Swenshuai.xi _bFirstRLE = TRUE;
3729*53ee8cc1Swenshuai.xi
3730*53ee8cc1Swenshuai.xi _s16dc_pred[0] = _s16dc_pred[1] = _s16dc_pred[2] = 0;
3731*53ee8cc1Swenshuai.xi
3732*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE; //For H/W bug, some cases can not exit after decode done.
3733*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = 0; //For H/W bug, some cases can not exit after decode done, record repeat time.
3734*53ee8cc1Swenshuai.xi _JPD_PreVIdx = 0; //For H/W bug, some cases can not exit after decode done, record previous Vidx.
3735*53ee8cc1Swenshuai.xi
3736*53ee8cc1Swenshuai.xi _Progressive_ROI_flag = FALSE; //CL82399
3737*53ee8cc1Swenshuai.xi ROI_width = 0; //CL82399
3738*53ee8cc1Swenshuai.xi
3739*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_NONE;
3740*53ee8cc1Swenshuai.xi
3741*53ee8cc1Swenshuai.xi u32MRCheckCount = 0;
3742*53ee8cc1Swenshuai.xi
3743*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MAXHUFFTABLES; i++)
3744*53ee8cc1Swenshuai.xi {
3745*53ee8cc1Swenshuai.xi _Huff_info[i].bValid = FALSE;
3746*53ee8cc1Swenshuai.xi JPEG_memset((void *)_Huff_info[i].u8Huff_num, 0, 17);
3747*53ee8cc1Swenshuai.xi JPEG_memset((void *)_Huff_info[i].u8Huff_val, 0, 256);
3748*53ee8cc1Swenshuai.xi JPEG_memset((void *)_Huff_info[i].u8Symbol, 0, 17);
3749*53ee8cc1Swenshuai.xi JPEG_memset((void *)_Huff_info[i].u16Code, 0, 17);
3750*53ee8cc1Swenshuai.xi }
3751*53ee8cc1Swenshuai.xi
3752*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MAXQUANTTABLES; i++)
3753*53ee8cc1Swenshuai.xi {
3754*53ee8cc1Swenshuai.xi _QuantTables[i].bValid = FALSE;
3755*53ee8cc1Swenshuai.xi JPEG_memset(_QuantTables[i].s16Value, 0, 64);
3756*53ee8cc1Swenshuai.xi }
3757*53ee8cc1Swenshuai.xi
3758*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_GRAYSCALE;
3759*53ee8cc1Swenshuai.xi
3760*53ee8cc1Swenshuai.xi _u8Comps_in_frame = 0;
3761*53ee8cc1Swenshuai.xi
3762*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_h_samp, 0, sizeof( _u8Comp_h_samp ) );
3763*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_v_samp, 0, sizeof( _u8Comp_v_samp ) );
3764*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_quant, 0, sizeof( _u8Comp_quant ) );
3765*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_ident, 0, sizeof( _u8Comp_ident ) );
3766*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u16Comp_h_blocks, 0, sizeof( _u16Comp_h_blocks ) );
3767*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u16Comp_v_blocks, 0, sizeof( _u16Comp_v_blocks ) );
3768*53ee8cc1Swenshuai.xi
3769*53ee8cc1Swenshuai.xi _u8Comps_in_scan = 0;
3770*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_list, 0, sizeof( _u8Comp_list ) );
3771*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_dc_tab, 0, sizeof( _u8Comp_dc_tab ) );
3772*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Comp_ac_tab, 0, sizeof( _u8Comp_ac_tab ) );
3773*53ee8cc1Swenshuai.xi
3774*53ee8cc1Swenshuai.xi _u8Spectral_start = 0;
3775*53ee8cc1Swenshuai.xi _u8Spectral_end = 0;
3776*53ee8cc1Swenshuai.xi _u8Successive_low = 0;
3777*53ee8cc1Swenshuai.xi _u8Successive_high = 0;
3778*53ee8cc1Swenshuai.xi
3779*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 0;
3780*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 0;
3781*53ee8cc1Swenshuai.xi
3782*53ee8cc1Swenshuai.xi _u8Blocks_per_mcu = 0;
3783*53ee8cc1Swenshuai.xi _u32Max_blocks_per_row = 0;
3784*53ee8cc1Swenshuai.xi _u16Mcus_per_row = 0;
3785*53ee8cc1Swenshuai.xi _u16Mcus_per_col = 0;
3786*53ee8cc1Swenshuai.xi
3787*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u8Mcu_org, 0, sizeof( _u8Mcu_org ) );
3788*53ee8cc1Swenshuai.xi
3789*53ee8cc1Swenshuai.xi #ifdef CMODEL
3790*53ee8cc1Swenshuai.xi gu16Real_dest_bytes_per_scan_line = 0;
3791*53ee8cc1Swenshuai.xi gu16Dest_bytes_per_scan_line = 0;
3792*53ee8cc1Swenshuai.xi gu8Dest_bytes_per_pixel = 0;
3793*53ee8cc1Swenshuai.xi #endif
3794*53ee8cc1Swenshuai.xi
3795*53ee8cc1Swenshuai.xi JPEG_memset((void *)_pBlocks, 0, sizeof( _pBlocks ) );
3796*53ee8cc1Swenshuai.xi
3797*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3798*53ee8cc1Swenshuai.xi _u16Total_lines_left = 0;
3799*53ee8cc1Swenshuai.xi #ifdef CMODEL
3800*53ee8cc1Swenshuai.xi gu16Mcu_lines_left = 0;
3801*53ee8cc1Swenshuai.xi #endif
3802*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u32Block_y_mcu, 0, sizeof( _u32Block_y_mcu ) );
3803*53ee8cc1Swenshuai.xi JPEG_memset((void *)_Huff_tbls, 0, sizeof( _Huff_tbls ) );
3804*53ee8cc1Swenshuai.xi JPEG_memset((void *)_DC_Coeffs, 0, sizeof( _DC_Coeffs ) );
3805*53ee8cc1Swenshuai.xi JPEG_memset((void *)_AC_Coeffs, 0, sizeof( _AC_Coeffs ) );
3806*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u32Last_dc_val, 0, sizeof( _u32Last_dc_val ) );
3807*53ee8cc1Swenshuai.xi
3808*53ee8cc1Swenshuai.xi _u32EOB_run = 0;
3809*53ee8cc1Swenshuai.xi #endif
3810*53ee8cc1Swenshuai.xi
3811*53ee8cc1Swenshuai.xi _pu8In_buf_ofs = _pu8In_buf;
3812*53ee8cc1Swenshuai.xi //// _u32In_buf_left = 0;
3813*53ee8cc1Swenshuai.xi //// _bEOF_flag = FALSE;
3814*53ee8cc1Swenshuai.xi _u8Tem_flag = 0;
3815*53ee8cc1Swenshuai.xi
3816*53ee8cc1Swenshuai.xi //sharon JPEG_memset((void *)_pu8In_buf, 0, sizeof(MS_U8)*(MRC_BUFFER_SIZE + 128) );
3817*53ee8cc1Swenshuai.xi
3818*53ee8cc1Swenshuai.xi _u16Restart_interval = 0;
3819*53ee8cc1Swenshuai.xi _u16Restarts_left = 0;
3820*53ee8cc1Swenshuai.xi _u16Next_restart_num = 0;
3821*53ee8cc1Swenshuai.xi
3822*53ee8cc1Swenshuai.xi gu16Max_mcus_per_row = 0;
3823*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 0;
3824*53ee8cc1Swenshuai.xi _u16Max_mcus_per_col = 0;
3825*53ee8cc1Swenshuai.xi
3826*53ee8cc1Swenshuai.xi #ifdef CMODEL
3827*53ee8cc1Swenshuai.xi JPEG_memset((void *)gps16Block_seg, 0, sizeof( gps16Block_seg ) );
3828*53ee8cc1Swenshuai.xi gpu8Sample_buf = NULL;
3829*53ee8cc1Swenshuai.xi #endif
3830*53ee8cc1Swenshuai.xi
3831*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
3832*53ee8cc1Swenshuai.xi JPEG_memset( _ps16Block_seg, 0, sizeof( _ps16Block_seg ) );
3833*53ee8cc1Swenshuai.xi gpu8Sample_buf = NULL;
3834*53ee8cc1Swenshuai.xi #endif
3835*53ee8cc1Swenshuai.xi
3836*53ee8cc1Swenshuai.xi // Tell the stream we're going to use it.
3837*53ee8cc1Swenshuai.xi //_pStream->attach();
3838*53ee8cc1Swenshuai.xi
3839*53ee8cc1Swenshuai.xi // Ready the input buffer.
3840*53ee8cc1Swenshuai.xi if(_bThumbnailAccessMode)
3841*53ee8cc1Swenshuai.xi {
3842*53ee8cc1Swenshuai.xi // It means that thumbnail is found and re-call JPEG_init()
3843*53ee8cc1Swenshuai.xi // to re-fill thumbnail data to internal buffer.
3844*53ee8cc1Swenshuai.xi if(!JPEG_fill_read_buffer())
3845*53ee8cc1Swenshuai.xi {
3846*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_init : JPEG_fill_read_buffer failed!!!\n");
3847*53ee8cc1Swenshuai.xi return FALSE;
3848*53ee8cc1Swenshuai.xi }
3849*53ee8cc1Swenshuai.xi }
3850*53ee8cc1Swenshuai.xi else
3851*53ee8cc1Swenshuai.xi {
3852*53ee8cc1Swenshuai.xi //// _u32In_buf_left = MRC_BUFFER_SIZE; //sharon
3853*53ee8cc1Swenshuai.xi //// _Total_Decoded_Size = MRC_BUFFER_SIZE; //sharon
3854*53ee8cc1Swenshuai.xi //// _u32Total_bytes_read = MRC_BUFFER_SIZE; //sharon
3855*53ee8cc1Swenshuai.xi _u32Total_bytes_read = _u32In_buf_left;
3856*53ee8cc1Swenshuai.xi }
3857*53ee8cc1Swenshuai.xi
3858*53ee8cc1Swenshuai.xi // Prime the bit buffer.
3859*53ee8cc1Swenshuai.xi _s16Bits_left = 0;
3860*53ee8cc1Swenshuai.xi _u32Bit_buf = 0;
3861*53ee8cc1Swenshuai.xi
3862*53ee8cc1Swenshuai.xi // _pu32ExifHeaderAddr = 0;
3863*53ee8cc1Swenshuai.xi
3864*53ee8cc1Swenshuai.xi #ifdef CMODEL
3865*53ee8cc1Swenshuai.xi for ( i = 0; i < JPEG_MAXBLOCKSPERROW; i++ )
3866*53ee8cc1Swenshuai.xi {
3867*53ee8cc1Swenshuai.xi gu8Block_max_zag_set[i] = 64;
3868*53ee8cc1Swenshuai.xi }
3869*53ee8cc1Swenshuai.xi #endif
3870*53ee8cc1Swenshuai.xi
3871*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
3872*53ee8cc1Swenshuai.xi for ( i = 0; i < JPEG_MAXBLOCKSPERROW; i++ )
3873*53ee8cc1Swenshuai.xi {
3874*53ee8cc1Swenshuai.xi _u8Block_max_zag_set[i] = 64;
3875*53ee8cc1Swenshuai.xi }
3876*53ee8cc1Swenshuai.xi #endif
3877*53ee8cc1Swenshuai.xi return TRUE;
3878*53ee8cc1Swenshuai.xi }
3879*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3880*53ee8cc1Swenshuai.xi // The coeff_buf series of methods originally stored the coefficients
3881*53ee8cc1Swenshuai.xi // into a "virtual" file which was located in EMS, XMS, or a disk file. A cache
3882*53ee8cc1Swenshuai.xi // was used to make this process more efficient. Now, we can store the entire
3883*53ee8cc1Swenshuai.xi // thing in RAM.
JPEG_coeff_buf_open(MS_U16 block_num_x,MS_U16 block_num_y,MS_U8 block_len_x,MS_U8 block_len_y)3884*53ee8cc1Swenshuai.xi JPEG_STATIC PJPEG_CoeffBuf JPEG_coeff_buf_open(MS_U16 block_num_x, MS_U16 block_num_y, MS_U8 block_len_x, MS_U8 block_len_y)
3885*53ee8cc1Swenshuai.xi {
3886*53ee8cc1Swenshuai.xi PJPEG_CoeffBuf cb = ( PJPEG_CoeffBuf )JPEG_alloc( sizeof( JPEG_CoeffBuf ) );
3887*53ee8cc1Swenshuai.xi
3888*53ee8cc1Swenshuai.xi if(cb == NULL)
3889*53ee8cc1Swenshuai.xi return NULL;
3890*53ee8cc1Swenshuai.xi
3891*53ee8cc1Swenshuai.xi cb->u16Block_num_x = block_num_x;
3892*53ee8cc1Swenshuai.xi cb->u16Block_num_y = block_num_y;
3893*53ee8cc1Swenshuai.xi
3894*53ee8cc1Swenshuai.xi cb->u8Block_len_x = block_len_x;
3895*53ee8cc1Swenshuai.xi cb->u8Block_len_y = block_len_y;
3896*53ee8cc1Swenshuai.xi
3897*53ee8cc1Swenshuai.xi cb->u16Block_size = ( block_len_x * block_len_y ) * sizeof( JPEG_BLOCK_TYPE );
3898*53ee8cc1Swenshuai.xi
3899*53ee8cc1Swenshuai.xi cb->pu8Data = ( MS_U8 * )JPEG_alloc( cb->u16Block_size * block_num_x * block_num_y );
3900*53ee8cc1Swenshuai.xi
3901*53ee8cc1Swenshuai.xi if(cb->pu8Data == NULL)
3902*53ee8cc1Swenshuai.xi return NULL;
3903*53ee8cc1Swenshuai.xi
3904*53ee8cc1Swenshuai.xi return cb;
3905*53ee8cc1Swenshuai.xi }
3906*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_coeff_buf_getp(PJPEG_CoeffBuf cb,MS_U16 block_x,MS_U16 block_y)3907*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_BLOCK_TYPE * JPEG_coeff_buf_getp( PJPEG_CoeffBuf cb, MS_U16 block_x, MS_U16 block_y )
3908*53ee8cc1Swenshuai.xi {
3909*53ee8cc1Swenshuai.xi if ( block_x >= cb->u16Block_num_x )
3910*53ee8cc1Swenshuai.xi {
3911*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_ASSERTION_ERROR );
3912*53ee8cc1Swenshuai.xi return NULL;
3913*53ee8cc1Swenshuai.xi }
3914*53ee8cc1Swenshuai.xi
3915*53ee8cc1Swenshuai.xi if ( block_y >= cb->u16Block_num_y )
3916*53ee8cc1Swenshuai.xi {
3917*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_ASSERTION_ERROR );
3918*53ee8cc1Swenshuai.xi return NULL;
3919*53ee8cc1Swenshuai.xi }
3920*53ee8cc1Swenshuai.xi
3921*53ee8cc1Swenshuai.xi return ( JPEG_BLOCK_TYPE * )((MS_U32)( cb->pu8Data + block_x * cb->u16Block_size
3922*53ee8cc1Swenshuai.xi + block_y * (cb->u16Block_size * cb->u16Block_num_x)));
3923*53ee8cc1Swenshuai.xi }
3924*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3925*53ee8cc1Swenshuai.xi // Creates the tables needed for efficient Huffman decoding.
JPEG_make_huff_table(MS_U8 index)3926*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_make_huff_table(MS_U8 index)
3927*53ee8cc1Swenshuai.xi {
3928*53ee8cc1Swenshuai.xi MS_U16 p, i, l, si;
3929*53ee8cc1Swenshuai.xi MS_U8 huffsize[257];
3930*53ee8cc1Swenshuai.xi MS_U16 huffcode[257];
3931*53ee8cc1Swenshuai.xi MS_U16 _code;
3932*53ee8cc1Swenshuai.xi MS_U16 subtree;
3933*53ee8cc1Swenshuai.xi MS_U16 code_size;
3934*53ee8cc1Swenshuai.xi MS_U16 lastp;
3935*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3936*53ee8cc1Swenshuai.xi MS_S16 nextfreeentry;
3937*53ee8cc1Swenshuai.xi #endif
3938*53ee8cc1Swenshuai.xi MS_S16 currententry;
3939*53ee8cc1Swenshuai.xi
3940*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3941*53ee8cc1Swenshuai.xi JPEG_HuffTbl *hs = &_Huff_tbls[index];
3942*53ee8cc1Swenshuai.xi #endif
3943*53ee8cc1Swenshuai.xi
3944*53ee8cc1Swenshuai.xi JPEG_memset((void *)huffsize, 0, sizeof(huffsize));
3945*53ee8cc1Swenshuai.xi JPEG_memset((void *)huffcode, 0, sizeof(huffcode));
3946*53ee8cc1Swenshuai.xi
3947*53ee8cc1Swenshuai.xi p = 0;
3948*53ee8cc1Swenshuai.xi
3949*53ee8cc1Swenshuai.xi for ( l = 1; l <= 16; l++ )
3950*53ee8cc1Swenshuai.xi {
3951*53ee8cc1Swenshuai.xi for ( i = 1; i <= _Huff_info[index].u8Huff_num[l]; i++ )
3952*53ee8cc1Swenshuai.xi {
3953*53ee8cc1Swenshuai.xi huffsize[p++] = l;
3954*53ee8cc1Swenshuai.xi
3955*53ee8cc1Swenshuai.xi //kevinhuang, add protection
3956*53ee8cc1Swenshuai.xi if ( p >= 257 )
3957*53ee8cc1Swenshuai.xi {
3958*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
3959*53ee8cc1Swenshuai.xi return FALSE;
3960*53ee8cc1Swenshuai.xi }
3961*53ee8cc1Swenshuai.xi }
3962*53ee8cc1Swenshuai.xi }
3963*53ee8cc1Swenshuai.xi
3964*53ee8cc1Swenshuai.xi huffsize[p] = 0;
3965*53ee8cc1Swenshuai.xi
3966*53ee8cc1Swenshuai.xi lastp = p;
3967*53ee8cc1Swenshuai.xi
3968*53ee8cc1Swenshuai.xi _code = 0;
3969*53ee8cc1Swenshuai.xi si = huffsize[0];
3970*53ee8cc1Swenshuai.xi p = 0;
3971*53ee8cc1Swenshuai.xi
3972*53ee8cc1Swenshuai.xi while ( huffsize[p] )
3973*53ee8cc1Swenshuai.xi {
3974*53ee8cc1Swenshuai.xi while ( huffsize[p] == si )
3975*53ee8cc1Swenshuai.xi {
3976*53ee8cc1Swenshuai.xi huffcode[p++] = _code;
3977*53ee8cc1Swenshuai.xi _code++;
3978*53ee8cc1Swenshuai.xi
3979*53ee8cc1Swenshuai.xi //kevinhuang, add protection
3980*53ee8cc1Swenshuai.xi if ( p >= 257 )
3981*53ee8cc1Swenshuai.xi {
3982*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
3983*53ee8cc1Swenshuai.xi return FALSE;
3984*53ee8cc1Swenshuai.xi }
3985*53ee8cc1Swenshuai.xi }
3986*53ee8cc1Swenshuai.xi
3987*53ee8cc1Swenshuai.xi _code <<= 1;
3988*53ee8cc1Swenshuai.xi si++;
3989*53ee8cc1Swenshuai.xi }
3990*53ee8cc1Swenshuai.xi
3991*53ee8cc1Swenshuai.xi // Calculate the min code
3992*53ee8cc1Swenshuai.xi for(i = 1; i<=16; i++)
3993*53ee8cc1Swenshuai.xi _Huff_info[index].u16Code[i] = huffcode[_Huff_info[index].u8Symbol[i]] << (15 - (i - 1));
3994*53ee8cc1Swenshuai.xi
3995*53ee8cc1Swenshuai.xi
3996*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
3997*53ee8cc1Swenshuai.xi // In JPD mode, SW doesn't need huff table when baseline decoding
3998*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
3999*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK != gu8Scan_type)
4000*53ee8cc1Swenshuai.xi && (E_JPEG_RGB != gu8Scan_type))
4001*53ee8cc1Swenshuai.xi #endif
4002*53ee8cc1Swenshuai.xi {
4003*53ee8cc1Swenshuai.xi #ifndef CMODEL
4004*53ee8cc1Swenshuai.xi if(_bProgressive_flag==FALSE)
4005*53ee8cc1Swenshuai.xi return TRUE;
4006*53ee8cc1Swenshuai.xi #endif
4007*53ee8cc1Swenshuai.xi }
4008*53ee8cc1Swenshuai.xi
4009*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Make HUFF TABLE\n");
4010*53ee8cc1Swenshuai.xi
4011*53ee8cc1Swenshuai.xi JPEG_memset((void *)(hs->s16Look_up), 0, sizeof( hs->s16Look_up ) );
4012*53ee8cc1Swenshuai.xi JPEG_memset((void *)(hs->s16Tree), 0, sizeof( hs->s16Tree ) );
4013*53ee8cc1Swenshuai.xi JPEG_memset((void *)(hs->u8Code_size), 0, sizeof( hs->u8Code_size ) );
4014*53ee8cc1Swenshuai.xi
4015*53ee8cc1Swenshuai.xi nextfreeentry = -1;
4016*53ee8cc1Swenshuai.xi
4017*53ee8cc1Swenshuai.xi p = 0;
4018*53ee8cc1Swenshuai.xi
4019*53ee8cc1Swenshuai.xi while ( p < lastp )
4020*53ee8cc1Swenshuai.xi {
4021*53ee8cc1Swenshuai.xi i = _Huff_info[index].u8Huff_val[p];
4022*53ee8cc1Swenshuai.xi _code = huffcode[p];
4023*53ee8cc1Swenshuai.xi code_size = huffsize[p];
4024*53ee8cc1Swenshuai.xi
4025*53ee8cc1Swenshuai.xi hs->u8Code_size[i] = code_size;
4026*53ee8cc1Swenshuai.xi
4027*53ee8cc1Swenshuai.xi if ( code_size <= 8 )
4028*53ee8cc1Swenshuai.xi {
4029*53ee8cc1Swenshuai.xi _code <<= ( 8 - code_size );
4030*53ee8cc1Swenshuai.xi
4031*53ee8cc1Swenshuai.xi for ( l = 1 << ( 8 - code_size ); l > 0; l-- )
4032*53ee8cc1Swenshuai.xi {
4033*53ee8cc1Swenshuai.xi hs->s16Look_up[_code] = i;
4034*53ee8cc1Swenshuai.xi _code++;
4035*53ee8cc1Swenshuai.xi }
4036*53ee8cc1Swenshuai.xi }
4037*53ee8cc1Swenshuai.xi else
4038*53ee8cc1Swenshuai.xi {
4039*53ee8cc1Swenshuai.xi subtree = ( _code >> ( code_size - 8 ) ) & 0xFF;
4040*53ee8cc1Swenshuai.xi
4041*53ee8cc1Swenshuai.xi currententry = hs->s16Look_up[subtree];
4042*53ee8cc1Swenshuai.xi
4043*53ee8cc1Swenshuai.xi if ( currententry == 0 )
4044*53ee8cc1Swenshuai.xi {
4045*53ee8cc1Swenshuai.xi hs->s16Look_up[subtree] = currententry = nextfreeentry;
4046*53ee8cc1Swenshuai.xi
4047*53ee8cc1Swenshuai.xi nextfreeentry -= 2;
4048*53ee8cc1Swenshuai.xi }
4049*53ee8cc1Swenshuai.xi
4050*53ee8cc1Swenshuai.xi _code <<= ( 16 - ( code_size - 8 ) );
4051*53ee8cc1Swenshuai.xi
4052*53ee8cc1Swenshuai.xi for ( l = code_size; l > 9; l-- )
4053*53ee8cc1Swenshuai.xi {
4054*53ee8cc1Swenshuai.xi if ( ( _code & 0x8000 ) == 0 )
4055*53ee8cc1Swenshuai.xi {
4056*53ee8cc1Swenshuai.xi currententry--;
4057*53ee8cc1Swenshuai.xi }
4058*53ee8cc1Swenshuai.xi
4059*53ee8cc1Swenshuai.xi if ( hs->s16Tree[-currententry - 1] == 0 )
4060*53ee8cc1Swenshuai.xi {
4061*53ee8cc1Swenshuai.xi hs->s16Tree[-currententry - 1] = nextfreeentry;
4062*53ee8cc1Swenshuai.xi
4063*53ee8cc1Swenshuai.xi currententry = nextfreeentry;
4064*53ee8cc1Swenshuai.xi
4065*53ee8cc1Swenshuai.xi nextfreeentry -= 2;
4066*53ee8cc1Swenshuai.xi }
4067*53ee8cc1Swenshuai.xi else
4068*53ee8cc1Swenshuai.xi {
4069*53ee8cc1Swenshuai.xi currententry = hs->s16Tree[-currententry - 1];
4070*53ee8cc1Swenshuai.xi }
4071*53ee8cc1Swenshuai.xi
4072*53ee8cc1Swenshuai.xi _code <<= 1;
4073*53ee8cc1Swenshuai.xi }
4074*53ee8cc1Swenshuai.xi
4075*53ee8cc1Swenshuai.xi if ( ( _code & 0x8000 ) == 0 )
4076*53ee8cc1Swenshuai.xi {
4077*53ee8cc1Swenshuai.xi currententry--;
4078*53ee8cc1Swenshuai.xi }
4079*53ee8cc1Swenshuai.xi
4080*53ee8cc1Swenshuai.xi hs->s16Tree[-currententry - 1] = i;
4081*53ee8cc1Swenshuai.xi }
4082*53ee8cc1Swenshuai.xi
4083*53ee8cc1Swenshuai.xi p++;
4084*53ee8cc1Swenshuai.xi }
4085*53ee8cc1Swenshuai.xi #endif //SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
4086*53ee8cc1Swenshuai.xi return TRUE;
4087*53ee8cc1Swenshuai.xi }
4088*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4089*53ee8cc1Swenshuai.xi // Verifies the quantization tables needed for this scan are available.
JPEG_check_quant_tables(void)4090*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_check_quant_tables( void ) //ok
4091*53ee8cc1Swenshuai.xi {
4092*53ee8cc1Swenshuai.xi MS_U8 i;
4093*53ee8cc1Swenshuai.xi
4094*53ee8cc1Swenshuai.xi for ( i = 0; i < _u8Comps_in_scan; i++ )
4095*53ee8cc1Swenshuai.xi {
4096*53ee8cc1Swenshuai.xi if ( _QuantTables[_u8Comp_quant[_u8Comp_list[i]]].bValid==FALSE )
4097*53ee8cc1Swenshuai.xi {
4098*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNDEFINED_QUANT_TABLE );
4099*53ee8cc1Swenshuai.xi return FALSE;
4100*53ee8cc1Swenshuai.xi }
4101*53ee8cc1Swenshuai.xi }
4102*53ee8cc1Swenshuai.xi return TRUE;
4103*53ee8cc1Swenshuai.xi }
4104*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4105*53ee8cc1Swenshuai.xi // Verifies that all the Huffman tables needed for this scan are available.
JPEG_check_huff_tables(void)4106*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_check_huff_tables( void )
4107*53ee8cc1Swenshuai.xi {
4108*53ee8cc1Swenshuai.xi MS_U8 i;
4109*53ee8cc1Swenshuai.xi
4110*53ee8cc1Swenshuai.xi for ( i = 0; i < _u8Comps_in_scan; i++ )
4111*53ee8cc1Swenshuai.xi {
4112*53ee8cc1Swenshuai.xi if ( ( _u8Spectral_start == 0 ) && ( _Huff_info[_u8Comp_dc_tab[_u8Comp_list[i]]].bValid== FALSE ) )
4113*53ee8cc1Swenshuai.xi {
4114*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
4115*53ee8cc1Swenshuai.xi return FALSE;
4116*53ee8cc1Swenshuai.xi }
4117*53ee8cc1Swenshuai.xi
4118*53ee8cc1Swenshuai.xi if ( ( _u8Spectral_end > 0 ) && ( _Huff_info[_u8Comp_ac_tab[_u8Comp_list[i]]].bValid== FALSE ) )
4119*53ee8cc1Swenshuai.xi {
4120*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
4121*53ee8cc1Swenshuai.xi return FALSE;
4122*53ee8cc1Swenshuai.xi }
4123*53ee8cc1Swenshuai.xi }
4124*53ee8cc1Swenshuai.xi
4125*53ee8cc1Swenshuai.xi for ( i = 0; i < JPEG_MAXHUFFTABLES; i++ )
4126*53ee8cc1Swenshuai.xi {
4127*53ee8cc1Swenshuai.xi if ( _Huff_info[i].bValid )
4128*53ee8cc1Swenshuai.xi {
4129*53ee8cc1Swenshuai.xi if(!JPEG_make_huff_table(i))
4130*53ee8cc1Swenshuai.xi return FALSE;
4131*53ee8cc1Swenshuai.xi }
4132*53ee8cc1Swenshuai.xi }
4133*53ee8cc1Swenshuai.xi return TRUE;
4134*53ee8cc1Swenshuai.xi }
4135*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4136*53ee8cc1Swenshuai.xi // Determines the component order inside each MCU.
4137*53ee8cc1Swenshuai.xi // Also calcs how many MCU's are on each row, etc.
JPEG_calc_mcu_block_order(void)4138*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_calc_mcu_block_order( void ) //ok
4139*53ee8cc1Swenshuai.xi {
4140*53ee8cc1Swenshuai.xi MS_U8 component_num, component_id;
4141*53ee8cc1Swenshuai.xi MS_U8 max_h_samp = 0, max_v_samp = 0;
4142*53ee8cc1Swenshuai.xi
4143*53ee8cc1Swenshuai.xi for ( component_id = 0; component_id < _u8Comps_in_frame; component_id++ )
4144*53ee8cc1Swenshuai.xi {
4145*53ee8cc1Swenshuai.xi if ( _u8Comp_h_samp[component_id] > max_h_samp )
4146*53ee8cc1Swenshuai.xi {
4147*53ee8cc1Swenshuai.xi max_h_samp = _u8Comp_h_samp[component_id];
4148*53ee8cc1Swenshuai.xi }
4149*53ee8cc1Swenshuai.xi
4150*53ee8cc1Swenshuai.xi if ( _u8Comp_v_samp[component_id] > max_v_samp )
4151*53ee8cc1Swenshuai.xi {
4152*53ee8cc1Swenshuai.xi max_v_samp = _u8Comp_v_samp[component_id];
4153*53ee8cc1Swenshuai.xi }
4154*53ee8cc1Swenshuai.xi }
4155*53ee8cc1Swenshuai.xi
4156*53ee8cc1Swenshuai.xi if((max_h_samp == 0) || (max_v_samp == 0))
4157*53ee8cc1Swenshuai.xi {
4158*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NOT_ENOUGH_HEADER_INFO );
4159*53ee8cc1Swenshuai.xi return;
4160*53ee8cc1Swenshuai.xi }
4161*53ee8cc1Swenshuai.xi
4162*53ee8cc1Swenshuai.xi for ( component_id = 0; component_id < _u8Comps_in_frame; component_id++ )
4163*53ee8cc1Swenshuai.xi {
4164*53ee8cc1Swenshuai.xi _u16Comp_h_blocks[component_id] = ( ( ( ( _u16Image_x_size * _u8Comp_h_samp[component_id] ) + ( max_h_samp - 1 ) ) / max_h_samp ) + 7 ) / 8;
4165*53ee8cc1Swenshuai.xi _u16Comp_v_blocks[component_id] = ( ( ( ( _u16Image_y_size * _u8Comp_v_samp[component_id] ) + ( max_v_samp - 1 ) ) / max_v_samp ) + 7 ) / 8;
4166*53ee8cc1Swenshuai.xi }
4167*53ee8cc1Swenshuai.xi
4168*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
4169*53ee8cc1Swenshuai.xi {
4170*53ee8cc1Swenshuai.xi _u16Mcus_per_row = _u16Comp_h_blocks[_u8Comp_list[0]];
4171*53ee8cc1Swenshuai.xi _u16Mcus_per_col = _u16Comp_v_blocks[_u8Comp_list[0]];
4172*53ee8cc1Swenshuai.xi }
4173*53ee8cc1Swenshuai.xi else
4174*53ee8cc1Swenshuai.xi {
4175*53ee8cc1Swenshuai.xi _u16Mcus_per_row = ( ( ( _u16Image_x_size + 7 ) / 8 ) + ( max_h_samp - 1 ) ) / max_h_samp;
4176*53ee8cc1Swenshuai.xi _u16Mcus_per_col = ( ( ( _u16Image_y_size + 7 ) / 8 ) + ( max_v_samp - 1 ) ) / max_v_samp;
4177*53ee8cc1Swenshuai.xi }
4178*53ee8cc1Swenshuai.xi
4179*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
4180*53ee8cc1Swenshuai.xi {
4181*53ee8cc1Swenshuai.xi _u8Mcu_org[0] = _u8Comp_list[0];
4182*53ee8cc1Swenshuai.xi
4183*53ee8cc1Swenshuai.xi _u8Blocks_per_mcu = 1;
4184*53ee8cc1Swenshuai.xi }
4185*53ee8cc1Swenshuai.xi else
4186*53ee8cc1Swenshuai.xi {
4187*53ee8cc1Swenshuai.xi _u8Blocks_per_mcu = 0;
4188*53ee8cc1Swenshuai.xi
4189*53ee8cc1Swenshuai.xi for ( component_num = 0; component_num < _u8Comps_in_scan; component_num++ )
4190*53ee8cc1Swenshuai.xi {
4191*53ee8cc1Swenshuai.xi MS_U8 num_blocks;
4192*53ee8cc1Swenshuai.xi
4193*53ee8cc1Swenshuai.xi component_id = _u8Comp_list[component_num];
4194*53ee8cc1Swenshuai.xi
4195*53ee8cc1Swenshuai.xi num_blocks = _u8Comp_h_samp[component_id] * _u8Comp_v_samp[component_id];
4196*53ee8cc1Swenshuai.xi
4197*53ee8cc1Swenshuai.xi while ( num_blocks-- )
4198*53ee8cc1Swenshuai.xi {
4199*53ee8cc1Swenshuai.xi _u8Mcu_org[_u8Blocks_per_mcu++] = component_id;
4200*53ee8cc1Swenshuai.xi }
4201*53ee8cc1Swenshuai.xi }
4202*53ee8cc1Swenshuai.xi }
4203*53ee8cc1Swenshuai.xi }
4204*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4205*53ee8cc1Swenshuai.xi /* Get current access byte address in MRC buffer relative to MRC start address */
JPEG_GetECS(void)4206*53ee8cc1Swenshuai.xi JPEG_STATIC MS_U32 JPEG_GetECS(void)
4207*53ee8cc1Swenshuai.xi {
4208*53ee8cc1Swenshuai.xi MS_U32 data_end_addr = (MS_U32)_pu8In_buf_ofs;
4209*53ee8cc1Swenshuai.xi MS_U32 data_start_addr =(MS_U32) _pu8In_buf;
4210*53ee8cc1Swenshuai.xi
4211*53ee8cc1Swenshuai.xi return (data_end_addr - data_start_addr);
4212*53ee8cc1Swenshuai.xi }
4213*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4214*53ee8cc1Swenshuai.xi //*************************************************
4215*53ee8cc1Swenshuai.xi //write symbol table
4216*53ee8cc1Swenshuai.xi //*************************************************
4217*53ee8cc1Swenshuai.xi #ifndef CMODEL
4218*53ee8cc1Swenshuai.xi #if 0
4219*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_write_symidx(void)
4220*53ee8cc1Swenshuai.xi {
4221*53ee8cc1Swenshuai.xi MS_U16 i, tbl_num_luma, tbl_num_chroma;
4222*53ee8cc1Swenshuai.xi MS_U8 ci, luma_ci = 0, chroma_ci = 0;
4223*53ee8cc1Swenshuai.xi
4224*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SYMIDX_BASE);
4225*53ee8cc1Swenshuai.xi if (_HeadCheck.DHT)
4226*53ee8cc1Swenshuai.xi {
4227*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4228*53ee8cc1Swenshuai.xi {
4229*53ee8cc1Swenshuai.xi if(_u8LumaCi==_u8Comp_ident[ci])
4230*53ee8cc1Swenshuai.xi {
4231*53ee8cc1Swenshuai.xi luma_ci = ci;
4232*53ee8cc1Swenshuai.xi break;
4233*53ee8cc1Swenshuai.xi }
4234*53ee8cc1Swenshuai.xi }
4235*53ee8cc1Swenshuai.xi
4236*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4237*53ee8cc1Swenshuai.xi {
4238*53ee8cc1Swenshuai.xi if(_u8ChromaCi==_u8Comp_ident[ci])
4239*53ee8cc1Swenshuai.xi {
4240*53ee8cc1Swenshuai.xi chroma_ci = ci;
4241*53ee8cc1Swenshuai.xi break;
4242*53ee8cc1Swenshuai.xi }
4243*53ee8cc1Swenshuai.xi }
4244*53ee8cc1Swenshuai.xi
4245*53ee8cc1Swenshuai.xi tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4246*53ee8cc1Swenshuai.xi tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4247*53ee8cc1Swenshuai.xi
4248*53ee8cc1Swenshuai.xi for ( i = 0; i < 256; i++ )
4249*53ee8cc1Swenshuai.xi {
4250*53ee8cc1Swenshuai.xi MDrv_Write2Byte( BK_JPD_TID_DAT, ( _Huff_info[tbl_num_chroma].u8Huff_val[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Huff_val[i] ) );
4251*53ee8cc1Swenshuai.xi }
4252*53ee8cc1Swenshuai.xi
4253*53ee8cc1Swenshuai.xi tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4254*53ee8cc1Swenshuai.xi tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4255*53ee8cc1Swenshuai.xi
4256*53ee8cc1Swenshuai.xi for ( i = 0; i < 16; i++ )
4257*53ee8cc1Swenshuai.xi {
4258*53ee8cc1Swenshuai.xi MDrv_Write2Byte( BK_JPD_TID_DAT, ( _Huff_info[tbl_num_chroma].u8Huff_val[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Huff_val[i] ) );
4259*53ee8cc1Swenshuai.xi }
4260*53ee8cc1Swenshuai.xi }
4261*53ee8cc1Swenshuai.xi else
4262*53ee8cc1Swenshuai.xi {
4263*53ee8cc1Swenshuai.xi for(i=0;i<272;i++)
4264*53ee8cc1Swenshuai.xi MDrv_Write2Byte( BK_JPD_TID_DAT, g16SYMIDX_TBL[i]);
4265*53ee8cc1Swenshuai.xi }
4266*53ee8cc1Swenshuai.xi }
4267*53ee8cc1Swenshuai.xi #endif
4268*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_WriteSymidx(void)4269*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_WriteSymidx(void)
4270*53ee8cc1Swenshuai.xi {
4271*53ee8cc1Swenshuai.xi //MS_U16 i, tbl_num_luma, tbl_num_chroma;
4272*53ee8cc1Swenshuai.xi MS_U16 ac_tbl_num_luma = 0, ac_tbl_num_chroma = 0;
4273*53ee8cc1Swenshuai.xi MS_U16 dc_tbl_num_luma = 0, dc_tbl_num_chroma = 0;
4274*53ee8cc1Swenshuai.xi MS_U8 ci, luma_ci = 0, chroma_ci = 0;
4275*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4276*53ee8cc1Swenshuai.xi MS_U16 ac_tbl_num_chroma2 = 0;
4277*53ee8cc1Swenshuai.xi MS_U16 dc_tbl_num_chroma2 = 0;
4278*53ee8cc1Swenshuai.xi MS_U8 chroma2_ci = 0;
4279*53ee8cc1Swenshuai.xi #endif
4280*53ee8cc1Swenshuai.xi JPD_Symidx structSymidx;
4281*53ee8cc1Swenshuai.xi
4282*53ee8cc1Swenshuai.xi JPEG_memset((void *)(&structSymidx), 0, sizeof(structSymidx));
4283*53ee8cc1Swenshuai.xi
4284*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteSymidx()
4285*53ee8cc1Swenshuai.xi //MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SYMIDX_BASE);
4286*53ee8cc1Swenshuai.xi
4287*53ee8cc1Swenshuai.xi if (_HeadCheck.DHT)
4288*53ee8cc1Swenshuai.xi {
4289*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4290*53ee8cc1Swenshuai.xi {
4291*53ee8cc1Swenshuai.xi if(_u8LumaCi==_u8Comp_ident[ci])
4292*53ee8cc1Swenshuai.xi {
4293*53ee8cc1Swenshuai.xi luma_ci = ci;
4294*53ee8cc1Swenshuai.xi break;
4295*53ee8cc1Swenshuai.xi }
4296*53ee8cc1Swenshuai.xi }
4297*53ee8cc1Swenshuai.xi
4298*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4299*53ee8cc1Swenshuai.xi {
4300*53ee8cc1Swenshuai.xi if(_u8ChromaCi==_u8Comp_ident[ci])
4301*53ee8cc1Swenshuai.xi {
4302*53ee8cc1Swenshuai.xi chroma_ci = ci;
4303*53ee8cc1Swenshuai.xi break;
4304*53ee8cc1Swenshuai.xi }
4305*53ee8cc1Swenshuai.xi }
4306*53ee8cc1Swenshuai.xi
4307*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4308*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4309*53ee8cc1Swenshuai.xi {
4310*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4311*53ee8cc1Swenshuai.xi {
4312*53ee8cc1Swenshuai.xi if(_u8Chroma2Ci==_u8Comp_ident[ci])
4313*53ee8cc1Swenshuai.xi {
4314*53ee8cc1Swenshuai.xi chroma2_ci = ci;
4315*53ee8cc1Swenshuai.xi break;
4316*53ee8cc1Swenshuai.xi }
4317*53ee8cc1Swenshuai.xi }
4318*53ee8cc1Swenshuai.xi }
4319*53ee8cc1Swenshuai.xi #endif
4320*53ee8cc1Swenshuai.xi
4321*53ee8cc1Swenshuai.xi //tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4322*53ee8cc1Swenshuai.xi ac_tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4323*53ee8cc1Swenshuai.xi //tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4324*53ee8cc1Swenshuai.xi ac_tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4325*53ee8cc1Swenshuai.xi
4326*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteSymidx()
4327*53ee8cc1Swenshuai.xi #if 0
4328*53ee8cc1Swenshuai.xi for ( i = 0; i < 256; i++ )
4329*53ee8cc1Swenshuai.xi {
4330*53ee8cc1Swenshuai.xi MDrv_Write2Byte( BK_JPD_TID_DAT, ( _Huff_info[tbl_num_chroma].u8Huff_val[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Huff_val[i] ) );
4331*53ee8cc1Swenshuai.xi }
4332*53ee8cc1Swenshuai.xi #endif
4333*53ee8cc1Swenshuai.xi
4334*53ee8cc1Swenshuai.xi dc_tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4335*53ee8cc1Swenshuai.xi dc_tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4336*53ee8cc1Swenshuai.xi #if 0
4337*53ee8cc1Swenshuai.xi for ( i = 0; i < 16; i++ )
4338*53ee8cc1Swenshuai.xi {
4339*53ee8cc1Swenshuai.xi MDrv_Write2Byte( BK_JPD_TID_DAT, ( _Huff_info[tbl_num_chroma].u8Huff_val[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Huff_val[i] ) );
4340*53ee8cc1Swenshuai.xi }
4341*53ee8cc1Swenshuai.xi #endif
4342*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4343*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4344*53ee8cc1Swenshuai.xi {
4345*53ee8cc1Swenshuai.xi ac_tbl_num_chroma2 = _u8Comp_ac_tab[chroma2_ci];
4346*53ee8cc1Swenshuai.xi dc_tbl_num_chroma2 = _u8Comp_dc_tab[chroma2_ci];
4347*53ee8cc1Swenshuai.xi }
4348*53ee8cc1Swenshuai.xi #endif
4349*53ee8cc1Swenshuai.xi }
4350*53ee8cc1Swenshuai.xi else
4351*53ee8cc1Swenshuai.xi {
4352*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteSymidx()
4353*53ee8cc1Swenshuai.xi #if 0
4354*53ee8cc1Swenshuai.xi for(i=0;i<272;i++)
4355*53ee8cc1Swenshuai.xi MDrv_Write2Byte( BK_JPD_TID_DAT, g16SYMIDX_TBL[i]);
4356*53ee8cc1Swenshuai.xi #endif
4357*53ee8cc1Swenshuai.xi }
4358*53ee8cc1Swenshuai.xi
4359*53ee8cc1Swenshuai.xi structSymidx.DHT = _HeadCheck.DHT;
4360*53ee8cc1Swenshuai.xi structSymidx.bUVHuffman = bIs3HuffTbl;
4361*53ee8cc1Swenshuai.xi structSymidx.u8DcLumaHuffVal = _Huff_info[dc_tbl_num_luma].u8Huff_val;
4362*53ee8cc1Swenshuai.xi structSymidx.u8DcChromaHuffVal = _Huff_info[dc_tbl_num_chroma].u8Huff_val;
4363*53ee8cc1Swenshuai.xi structSymidx.u8AcLumaHuffVal = _Huff_info[ac_tbl_num_luma].u8Huff_val;
4364*53ee8cc1Swenshuai.xi structSymidx.u8AcChromaHuffVal = _Huff_info[ac_tbl_num_chroma].u8Huff_val;
4365*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4366*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4367*53ee8cc1Swenshuai.xi {
4368*53ee8cc1Swenshuai.xi structSymidx.u8DcChroma2HuffVal = _Huff_info[dc_tbl_num_chroma2].u8Huff_val;
4369*53ee8cc1Swenshuai.xi structSymidx.u8AcChroma2HuffVal = _Huff_info[ac_tbl_num_chroma2].u8Huff_val;
4370*53ee8cc1Swenshuai.xi }
4371*53ee8cc1Swenshuai.xi #endif
4372*53ee8cc1Swenshuai.xi MDrv_JPD_WriteSymidx(structSymidx);
4373*53ee8cc1Swenshuai.xi }
4374*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4375*53ee8cc1Swenshuai.xi //***************************************************
4376*53ee8cc1Swenshuai.xi //write quantization table
4377*53ee8cc1Swenshuai.xi //***************************************************
4378*53ee8cc1Swenshuai.xi #if 0
4379*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_write_Qtbl(void)
4380*53ee8cc1Swenshuai.xi {
4381*53ee8cc1Swenshuai.xi MS_U8 i, j;
4382*53ee8cc1Swenshuai.xi MS_U8 com_num = 0;
4383*53ee8cc1Swenshuai.xi MS_U8 comp[JPEG_MAXCOMPONENTS];
4384*53ee8cc1Swenshuai.xi
4385*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_QTBL_BASE);
4386*53ee8cc1Swenshuai.xi
4387*53ee8cc1Swenshuai.xi if (_HeadCheck.DQT)
4388*53ee8cc1Swenshuai.xi {
4389*53ee8cc1Swenshuai.xi // Calculate how many valid quantization tables
4390*53ee8cc1Swenshuai.xi JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
4391*53ee8cc1Swenshuai.xi for(i = 0; i<_u8Comps_in_frame; i++)
4392*53ee8cc1Swenshuai.xi {
4393*53ee8cc1Swenshuai.xi comp[_u8Comp_quant[i]] = 1;
4394*53ee8cc1Swenshuai.xi }
4395*53ee8cc1Swenshuai.xi
4396*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
4397*53ee8cc1Swenshuai.xi {
4398*53ee8cc1Swenshuai.xi if(comp[i]==1)
4399*53ee8cc1Swenshuai.xi com_num++;
4400*53ee8cc1Swenshuai.xi }
4401*53ee8cc1Swenshuai.xi
4402*53ee8cc1Swenshuai.xi for ( i = 0; i < com_num; i++ )
4403*53ee8cc1Swenshuai.xi {
4404*53ee8cc1Swenshuai.xi for(j = 0; j<64; j++)
4405*53ee8cc1Swenshuai.xi {
4406*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4407*53ee8cc1Swenshuai.xi }
4408*53ee8cc1Swenshuai.xi }
4409*53ee8cc1Swenshuai.xi
4410*53ee8cc1Swenshuai.xi // if all compoents refer to the same Qtable, need to write Qtable twice
4411*53ee8cc1Swenshuai.xi if(com_num==1)
4412*53ee8cc1Swenshuai.xi {
4413*53ee8cc1Swenshuai.xi for ( i = 0; i < com_num; i++ )
4414*53ee8cc1Swenshuai.xi {
4415*53ee8cc1Swenshuai.xi for(j = 0; j<64; j++)
4416*53ee8cc1Swenshuai.xi {
4417*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4418*53ee8cc1Swenshuai.xi }
4419*53ee8cc1Swenshuai.xi }
4420*53ee8cc1Swenshuai.xi }
4421*53ee8cc1Swenshuai.xi }
4422*53ee8cc1Swenshuai.xi else
4423*53ee8cc1Swenshuai.xi {
4424*53ee8cc1Swenshuai.xi for (i=0; i<128; i++)
4425*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, g16IQ_TBL[i]);
4426*53ee8cc1Swenshuai.xi }
4427*53ee8cc1Swenshuai.xi }
4428*53ee8cc1Swenshuai.xi #endif
JPEG_WriteIQTbl(void)4429*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_WriteIQTbl(void)
4430*53ee8cc1Swenshuai.xi {
4431*53ee8cc1Swenshuai.xi //MS_U8 i, j;
4432*53ee8cc1Swenshuai.xi MS_U8 i;
4433*53ee8cc1Swenshuai.xi MS_U8 com_num = 0;
4434*53ee8cc1Swenshuai.xi MS_U8 comp[JPEG_MAXCOMPONENTS];
4435*53ee8cc1Swenshuai.xi JPD_IQTbl structIqtbl;
4436*53ee8cc1Swenshuai.xi
4437*53ee8cc1Swenshuai.xi JPEG_memset((void *)&structIqtbl, 0, sizeof(structIqtbl));
4438*53ee8cc1Swenshuai.xi
4439*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteIQTbl()
4440*53ee8cc1Swenshuai.xi //MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_QTBL_BASE);
4441*53ee8cc1Swenshuai.xi
4442*53ee8cc1Swenshuai.xi if (_HeadCheck.DQT)
4443*53ee8cc1Swenshuai.xi {
4444*53ee8cc1Swenshuai.xi // Calculate how many valid quantization tables
4445*53ee8cc1Swenshuai.xi JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
4446*53ee8cc1Swenshuai.xi for(i = 0; i<_u8Comps_in_frame; i++)
4447*53ee8cc1Swenshuai.xi {
4448*53ee8cc1Swenshuai.xi comp[_u8Comp_quant[i]] = 1;
4449*53ee8cc1Swenshuai.xi }
4450*53ee8cc1Swenshuai.xi
4451*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
4452*53ee8cc1Swenshuai.xi {
4453*53ee8cc1Swenshuai.xi if(comp[i]==1)
4454*53ee8cc1Swenshuai.xi com_num++;
4455*53ee8cc1Swenshuai.xi }
4456*53ee8cc1Swenshuai.xi
4457*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteIQTbl
4458*53ee8cc1Swenshuai.xi #if 0
4459*53ee8cc1Swenshuai.xi for ( i = 0; i < com_num; i++ )
4460*53ee8cc1Swenshuai.xi {
4461*53ee8cc1Swenshuai.xi for(j = 0; j<64; j++)
4462*53ee8cc1Swenshuai.xi {
4463*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4464*53ee8cc1Swenshuai.xi }
4465*53ee8cc1Swenshuai.xi }
4466*53ee8cc1Swenshuai.xi
4467*53ee8cc1Swenshuai.xi // if all compoents refer to the same Qtable, need to write Qtable twice
4468*53ee8cc1Swenshuai.xi if(com_num==1)
4469*53ee8cc1Swenshuai.xi {
4470*53ee8cc1Swenshuai.xi for ( i = 0; i < com_num; i++ )
4471*53ee8cc1Swenshuai.xi {
4472*53ee8cc1Swenshuai.xi for(j = 0; j<64; j++)
4473*53ee8cc1Swenshuai.xi {
4474*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, _QuantTables[_u8Comp_quant[i]].s16Value[_u8Jpeg_zigzag_order[j]]);
4475*53ee8cc1Swenshuai.xi }
4476*53ee8cc1Swenshuai.xi }
4477*53ee8cc1Swenshuai.xi }
4478*53ee8cc1Swenshuai.xi #endif
4479*53ee8cc1Swenshuai.xi }
4480*53ee8cc1Swenshuai.xi else
4481*53ee8cc1Swenshuai.xi {
4482*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteIQTbl()
4483*53ee8cc1Swenshuai.xi #if 0
4484*53ee8cc1Swenshuai.xi for (i=0; i<128; i++)
4485*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, g16IQ_TBL[i]);
4486*53ee8cc1Swenshuai.xi #endif
4487*53ee8cc1Swenshuai.xi }
4488*53ee8cc1Swenshuai.xi
4489*53ee8cc1Swenshuai.xi structIqtbl.DQT = _HeadCheck.DQT;
4490*53ee8cc1Swenshuai.xi structIqtbl.u8CompNum = com_num;
4491*53ee8cc1Swenshuai.xi structIqtbl.u8CompQuant = _u8Comp_quant;
4492*53ee8cc1Swenshuai.xi structIqtbl.QuantTables = (JPD_QuanTbl *)_QuantTables;
4493*53ee8cc1Swenshuai.xi MDrv_JPD_WriteIQTbl(structIqtbl);
4494*53ee8cc1Swenshuai.xi }
4495*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4496*53ee8cc1Swenshuai.xi //*************************************************
4497*53ee8cc1Swenshuai.xi //write group information
4498*53ee8cc1Swenshuai.xi //*************************************************
4499*53ee8cc1Swenshuai.xi #if 0
4500*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_write_Scwgif(void) //type : luma=>0 chroma=>1
4501*53ee8cc1Swenshuai.xi {
4502*53ee8cc1Swenshuai.xi MS_U32 reg_value;
4503*53ee8cc1Swenshuai.xi MS_U16 i, ci, valid, tbl_num_luma, tbl_num_chroma;
4504*53ee8cc1Swenshuai.xi MS_U8 luma_ci = 0, chroma_ci = 0;
4505*53ee8cc1Swenshuai.xi
4506*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SCWGIF_BASE);
4507*53ee8cc1Swenshuai.xi if (_HeadCheck.DHT)
4508*53ee8cc1Swenshuai.xi {
4509*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4510*53ee8cc1Swenshuai.xi {
4511*53ee8cc1Swenshuai.xi if(_u8LumaCi==_u8Comp_ident[ci])
4512*53ee8cc1Swenshuai.xi {
4513*53ee8cc1Swenshuai.xi luma_ci = ci;
4514*53ee8cc1Swenshuai.xi break;
4515*53ee8cc1Swenshuai.xi }
4516*53ee8cc1Swenshuai.xi }
4517*53ee8cc1Swenshuai.xi
4518*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4519*53ee8cc1Swenshuai.xi {
4520*53ee8cc1Swenshuai.xi if(_u8ChromaCi==_u8Comp_ident[ci])
4521*53ee8cc1Swenshuai.xi {
4522*53ee8cc1Swenshuai.xi chroma_ci = ci;
4523*53ee8cc1Swenshuai.xi break;
4524*53ee8cc1Swenshuai.xi }
4525*53ee8cc1Swenshuai.xi }
4526*53ee8cc1Swenshuai.xi
4527*53ee8cc1Swenshuai.xi tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4528*53ee8cc1Swenshuai.xi tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4529*53ee8cc1Swenshuai.xi
4530*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4531*53ee8cc1Swenshuai.xi {
4532*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4533*53ee8cc1Swenshuai.xi valid = 0;
4534*53ee8cc1Swenshuai.xi else
4535*53ee8cc1Swenshuai.xi valid = 1;
4536*53ee8cc1Swenshuai.xi
4537*53ee8cc1Swenshuai.xi if ( valid )
4538*53ee8cc1Swenshuai.xi {
4539*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] << 4 );
4540*53ee8cc1Swenshuai.xi }
4541*53ee8cc1Swenshuai.xi else
4542*53ee8cc1Swenshuai.xi {
4543*53ee8cc1Swenshuai.xi reg_value = 0;
4544*53ee8cc1Swenshuai.xi }
4545*53ee8cc1Swenshuai.xi
4546*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4547*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4548*53ee8cc1Swenshuai.xi }
4549*53ee8cc1Swenshuai.xi
4550*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4551*53ee8cc1Swenshuai.xi {
4552*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4553*53ee8cc1Swenshuai.xi valid = 0;
4554*53ee8cc1Swenshuai.xi else
4555*53ee8cc1Swenshuai.xi valid = 1;
4556*53ee8cc1Swenshuai.xi
4557*53ee8cc1Swenshuai.xi if ( valid )
4558*53ee8cc1Swenshuai.xi {
4559*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] << 4 );
4560*53ee8cc1Swenshuai.xi }
4561*53ee8cc1Swenshuai.xi else
4562*53ee8cc1Swenshuai.xi {
4563*53ee8cc1Swenshuai.xi reg_value = 0;
4564*53ee8cc1Swenshuai.xi }
4565*53ee8cc1Swenshuai.xi
4566*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4567*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4568*53ee8cc1Swenshuai.xi }
4569*53ee8cc1Swenshuai.xi
4570*53ee8cc1Swenshuai.xi tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4571*53ee8cc1Swenshuai.xi tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4572*53ee8cc1Swenshuai.xi
4573*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4574*53ee8cc1Swenshuai.xi {
4575*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4576*53ee8cc1Swenshuai.xi valid = 0;
4577*53ee8cc1Swenshuai.xi else
4578*53ee8cc1Swenshuai.xi valid = 1;
4579*53ee8cc1Swenshuai.xi
4580*53ee8cc1Swenshuai.xi if ( valid )
4581*53ee8cc1Swenshuai.xi {
4582*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] );
4583*53ee8cc1Swenshuai.xi }
4584*53ee8cc1Swenshuai.xi else
4585*53ee8cc1Swenshuai.xi {
4586*53ee8cc1Swenshuai.xi reg_value = 0;
4587*53ee8cc1Swenshuai.xi }
4588*53ee8cc1Swenshuai.xi
4589*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4590*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4591*53ee8cc1Swenshuai.xi }
4592*53ee8cc1Swenshuai.xi
4593*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4594*53ee8cc1Swenshuai.xi {
4595*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4596*53ee8cc1Swenshuai.xi valid = 0;
4597*53ee8cc1Swenshuai.xi else
4598*53ee8cc1Swenshuai.xi valid = 1;
4599*53ee8cc1Swenshuai.xi
4600*53ee8cc1Swenshuai.xi if ( valid )
4601*53ee8cc1Swenshuai.xi {
4602*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] );
4603*53ee8cc1Swenshuai.xi }
4604*53ee8cc1Swenshuai.xi else
4605*53ee8cc1Swenshuai.xi {
4606*53ee8cc1Swenshuai.xi reg_value = 0;
4607*53ee8cc1Swenshuai.xi }
4608*53ee8cc1Swenshuai.xi
4609*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4610*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4611*53ee8cc1Swenshuai.xi }
4612*53ee8cc1Swenshuai.xi }
4613*53ee8cc1Swenshuai.xi else
4614*53ee8cc1Swenshuai.xi {
4615*53ee8cc1Swenshuai.xi for( i = 0; i < 128; i++ )
4616*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, g16GRPINFO_TBL[i]);
4617*53ee8cc1Swenshuai.xi }
4618*53ee8cc1Swenshuai.xi }
4619*53ee8cc1Swenshuai.xi #endif
JPEG_WriteGrpinf(void)4620*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_WriteGrpinf(void) //type : luma=>0 chroma=>1
4621*53ee8cc1Swenshuai.xi {
4622*53ee8cc1Swenshuai.xi //MS_U32 reg_value;
4623*53ee8cc1Swenshuai.xi //MS_U16 i, ci, valid, tbl_num_luma, tbl_num_chroma;
4624*53ee8cc1Swenshuai.xi MS_U16 ci, dc_tbl_num_luma = 0, dc_tbl_num_chroma = 0;
4625*53ee8cc1Swenshuai.xi MS_U16 ac_tbl_num_luma = 0, ac_tbl_num_chroma = 0;
4626*53ee8cc1Swenshuai.xi MS_U8 luma_ci = 0, chroma_ci = 0;
4627*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4628*53ee8cc1Swenshuai.xi MS_U16 dc_tbl_num_chroma2 = 0;
4629*53ee8cc1Swenshuai.xi MS_U16 ac_tbl_num_chroma2 = 0;
4630*53ee8cc1Swenshuai.xi MS_U8 chroma2_ci = 0;
4631*53ee8cc1Swenshuai.xi #endif
4632*53ee8cc1Swenshuai.xi JPD_Grpinf structGrpinf;
4633*53ee8cc1Swenshuai.xi
4634*53ee8cc1Swenshuai.xi JPEG_memset((void *)&structGrpinf, 0, sizeof(structGrpinf));
4635*53ee8cc1Swenshuai.xi
4636*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteGrpinf()
4637*53ee8cc1Swenshuai.xi #if 0
4638*53ee8cc1Swenshuai.xi //MDrv_Write2Byte(BK_JPD_TID_ADR, JPD_MEM_SCWGIF_BASE);
4639*53ee8cc1Swenshuai.xi #endif
4640*53ee8cc1Swenshuai.xi if (_HeadCheck.DHT)
4641*53ee8cc1Swenshuai.xi {
4642*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4643*53ee8cc1Swenshuai.xi {
4644*53ee8cc1Swenshuai.xi if(_u8LumaCi==_u8Comp_ident[ci])
4645*53ee8cc1Swenshuai.xi {
4646*53ee8cc1Swenshuai.xi luma_ci = ci;
4647*53ee8cc1Swenshuai.xi break;
4648*53ee8cc1Swenshuai.xi }
4649*53ee8cc1Swenshuai.xi }
4650*53ee8cc1Swenshuai.xi
4651*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4652*53ee8cc1Swenshuai.xi {
4653*53ee8cc1Swenshuai.xi if(_u8ChromaCi==_u8Comp_ident[ci])
4654*53ee8cc1Swenshuai.xi {
4655*53ee8cc1Swenshuai.xi chroma_ci = ci;
4656*53ee8cc1Swenshuai.xi break;
4657*53ee8cc1Swenshuai.xi }
4658*53ee8cc1Swenshuai.xi }
4659*53ee8cc1Swenshuai.xi
4660*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4661*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4662*53ee8cc1Swenshuai.xi {
4663*53ee8cc1Swenshuai.xi for(ci = 0; ci<_u8Comps_in_frame; ci++)
4664*53ee8cc1Swenshuai.xi {
4665*53ee8cc1Swenshuai.xi if(_u8Chroma2Ci==_u8Comp_ident[ci])
4666*53ee8cc1Swenshuai.xi {
4667*53ee8cc1Swenshuai.xi chroma2_ci = ci;
4668*53ee8cc1Swenshuai.xi break;
4669*53ee8cc1Swenshuai.xi }
4670*53ee8cc1Swenshuai.xi }
4671*53ee8cc1Swenshuai.xi }
4672*53ee8cc1Swenshuai.xi #endif
4673*53ee8cc1Swenshuai.xi
4674*53ee8cc1Swenshuai.xi dc_tbl_num_luma = _u8Comp_dc_tab[luma_ci];
4675*53ee8cc1Swenshuai.xi dc_tbl_num_chroma = _u8Comp_dc_tab[chroma_ci];
4676*53ee8cc1Swenshuai.xi
4677*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteGrpinf()
4678*53ee8cc1Swenshuai.xi #if 0
4679*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4680*53ee8cc1Swenshuai.xi {
4681*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4682*53ee8cc1Swenshuai.xi valid = 0;
4683*53ee8cc1Swenshuai.xi else
4684*53ee8cc1Swenshuai.xi valid = 1;
4685*53ee8cc1Swenshuai.xi
4686*53ee8cc1Swenshuai.xi if ( valid )
4687*53ee8cc1Swenshuai.xi {
4688*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] << 4 );
4689*53ee8cc1Swenshuai.xi }
4690*53ee8cc1Swenshuai.xi else
4691*53ee8cc1Swenshuai.xi {
4692*53ee8cc1Swenshuai.xi reg_value = 0;
4693*53ee8cc1Swenshuai.xi }
4694*53ee8cc1Swenshuai.xi
4695*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4696*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4697*53ee8cc1Swenshuai.xi }
4698*53ee8cc1Swenshuai.xi
4699*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4700*53ee8cc1Swenshuai.xi {
4701*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4702*53ee8cc1Swenshuai.xi valid = 0;
4703*53ee8cc1Swenshuai.xi else
4704*53ee8cc1Swenshuai.xi valid = 1;
4705*53ee8cc1Swenshuai.xi
4706*53ee8cc1Swenshuai.xi if ( valid )
4707*53ee8cc1Swenshuai.xi {
4708*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] << 4 );
4709*53ee8cc1Swenshuai.xi }
4710*53ee8cc1Swenshuai.xi else
4711*53ee8cc1Swenshuai.xi {
4712*53ee8cc1Swenshuai.xi reg_value = 0;
4713*53ee8cc1Swenshuai.xi }
4714*53ee8cc1Swenshuai.xi
4715*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4716*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4717*53ee8cc1Swenshuai.xi }
4718*53ee8cc1Swenshuai.xi #endif
4719*53ee8cc1Swenshuai.xi
4720*53ee8cc1Swenshuai.xi ac_tbl_num_luma = _u8Comp_ac_tab[luma_ci];
4721*53ee8cc1Swenshuai.xi ac_tbl_num_chroma = _u8Comp_ac_tab[chroma_ci];
4722*53ee8cc1Swenshuai.xi // Moved to MDrv_JPD_WriteGrpinf()
4723*53ee8cc1Swenshuai.xi #if 0
4724*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4725*53ee8cc1Swenshuai.xi {
4726*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_luma].u8Symbol[i] == 0xFF)
4727*53ee8cc1Swenshuai.xi valid = 0;
4728*53ee8cc1Swenshuai.xi else
4729*53ee8cc1Swenshuai.xi valid = 1;
4730*53ee8cc1Swenshuai.xi
4731*53ee8cc1Swenshuai.xi if ( valid )
4732*53ee8cc1Swenshuai.xi {
4733*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_luma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_luma].u8Symbol[i] );
4734*53ee8cc1Swenshuai.xi }
4735*53ee8cc1Swenshuai.xi else
4736*53ee8cc1Swenshuai.xi {
4737*53ee8cc1Swenshuai.xi reg_value = 0;
4738*53ee8cc1Swenshuai.xi }
4739*53ee8cc1Swenshuai.xi
4740*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4741*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4742*53ee8cc1Swenshuai.xi }
4743*53ee8cc1Swenshuai.xi
4744*53ee8cc1Swenshuai.xi for ( i = 1; i <= 16; i++ )
4745*53ee8cc1Swenshuai.xi {
4746*53ee8cc1Swenshuai.xi if(_Huff_info[tbl_num_chroma].u8Symbol[i] == 0xFF)
4747*53ee8cc1Swenshuai.xi valid = 0;
4748*53ee8cc1Swenshuai.xi else
4749*53ee8cc1Swenshuai.xi valid = 1;
4750*53ee8cc1Swenshuai.xi
4751*53ee8cc1Swenshuai.xi if ( valid )
4752*53ee8cc1Swenshuai.xi {
4753*53ee8cc1Swenshuai.xi reg_value = ( valid << 24 ) | ( _Huff_info[tbl_num_chroma].u16Code[i] << 8 ) | ( _Huff_info[tbl_num_chroma].u8Symbol[i] );
4754*53ee8cc1Swenshuai.xi }
4755*53ee8cc1Swenshuai.xi else
4756*53ee8cc1Swenshuai.xi {
4757*53ee8cc1Swenshuai.xi reg_value = 0;
4758*53ee8cc1Swenshuai.xi }
4759*53ee8cc1Swenshuai.xi
4760*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value & 0xffff);
4761*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, reg_value >> 16);
4762*53ee8cc1Swenshuai.xi }
4763*53ee8cc1Swenshuai.xi #endif
4764*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4765*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4766*53ee8cc1Swenshuai.xi {
4767*53ee8cc1Swenshuai.xi dc_tbl_num_chroma2 = _u8Comp_dc_tab[chroma2_ci];
4768*53ee8cc1Swenshuai.xi ac_tbl_num_chroma2 = _u8Comp_ac_tab[chroma2_ci];
4769*53ee8cc1Swenshuai.xi }
4770*53ee8cc1Swenshuai.xi #endif
4771*53ee8cc1Swenshuai.xi }
4772*53ee8cc1Swenshuai.xi else
4773*53ee8cc1Swenshuai.xi {
4774*53ee8cc1Swenshuai.xi #if 0
4775*53ee8cc1Swenshuai.xi for( i = 0; i < 128; i++ )
4776*53ee8cc1Swenshuai.xi MDrv_Write2Byte(BK_JPD_TID_DAT, g16GRPINFO_TBL[i]);
4777*53ee8cc1Swenshuai.xi #endif
4778*53ee8cc1Swenshuai.xi }
4779*53ee8cc1Swenshuai.xi
4780*53ee8cc1Swenshuai.xi structGrpinf.DHT = _HeadCheck.DHT;
4781*53ee8cc1Swenshuai.xi structGrpinf.bUVHuffman = bIs3HuffTbl;
4782*53ee8cc1Swenshuai.xi structGrpinf.u8DcLumaSymbol = _Huff_info[dc_tbl_num_luma].u8Symbol;
4783*53ee8cc1Swenshuai.xi structGrpinf.u16DcLumaCode = _Huff_info[dc_tbl_num_luma].u16Code;
4784*53ee8cc1Swenshuai.xi structGrpinf.u8DcChromaSymbol = _Huff_info[dc_tbl_num_chroma].u8Symbol;
4785*53ee8cc1Swenshuai.xi structGrpinf.u16DcChromaCode = _Huff_info[dc_tbl_num_chroma].u16Code;
4786*53ee8cc1Swenshuai.xi structGrpinf.u8AcLumaSymbol = _Huff_info[ac_tbl_num_luma].u8Symbol;
4787*53ee8cc1Swenshuai.xi structGrpinf.u16AcLumaCode = _Huff_info[ac_tbl_num_luma].u16Code;
4788*53ee8cc1Swenshuai.xi structGrpinf.u8AcChromaSymbol = _Huff_info[ac_tbl_num_chroma].u8Symbol;
4789*53ee8cc1Swenshuai.xi structGrpinf.u16AcChromaCode = _Huff_info[ac_tbl_num_chroma].u16Code;
4790*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
4791*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
4792*53ee8cc1Swenshuai.xi {
4793*53ee8cc1Swenshuai.xi structGrpinf.u8DcChroma2Symbol = _Huff_info[dc_tbl_num_chroma2].u8Symbol;
4794*53ee8cc1Swenshuai.xi structGrpinf.u16DcChroma2Code = _Huff_info[dc_tbl_num_chroma2].u16Code;
4795*53ee8cc1Swenshuai.xi structGrpinf.u8AcChroma2Symbol = _Huff_info[ac_tbl_num_chroma2].u8Symbol;
4796*53ee8cc1Swenshuai.xi structGrpinf.u16AcChroma2Code = _Huff_info[ac_tbl_num_chroma2].u16Code;
4797*53ee8cc1Swenshuai.xi }
4798*53ee8cc1Swenshuai.xi #endif
4799*53ee8cc1Swenshuai.xi MDrv_JPD_WriteGrpinf(structGrpinf);
4800*53ee8cc1Swenshuai.xi }
4801*53ee8cc1Swenshuai.xi #endif /* #ifndef CMODEL */
4802*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4803*53ee8cc1Swenshuai.xi // Write RLE result
JPEG_write_RLE(JPEG_SVLD * pVld,MS_BOOL bDecodeNow)4804*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_write_RLE(JPEG_SVLD *pVld, MS_BOOL bDecodeNow)
4805*53ee8cc1Swenshuai.xi {
4806*53ee8cc1Swenshuai.xi #ifdef CMODEL
4807*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%02x%02x%02x%02x\n",(MS_U8)pVld->byte3, (MS_U8)pVld->byte2, (MS_U8)pVld->byte1, (MS_U8)pVld->byte0);
4808*53ee8cc1Swenshuai.xi #else
4809*53ee8cc1Swenshuai.xi MS_U8 *mrc_buffer = (MS_U8 *) MRC_BUFFER_ADDR;
4810*53ee8cc1Swenshuai.xi MS_U16 status;
4811*53ee8cc1Swenshuai.xi MS_U32 start_time;
4812*53ee8cc1Swenshuai.xi MS_U16 cur_vIdx;
4813*53ee8cc1Swenshuai.xi
4814*53ee8cc1Swenshuai.xi JPEG_memcpy((void *)(mrc_buffer + _u32RLEOffset), (void *)pVld, 4);
4815*53ee8cc1Swenshuai.xi _u32RLEOffset += 4;
4816*53ee8cc1Swenshuai.xi
4817*53ee8cc1Swenshuai.xi // Check if buffer full
4818*53ee8cc1Swenshuai.xi if((MRC_BUFFER_SIZE == _u32RLEOffset)
4819*53ee8cc1Swenshuai.xi || (TRUE == bDecodeNow))
4820*53ee8cc1Swenshuai.xi {
4821*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Do RLE, LENG 0x%lx, bDecodeNow = %d\n", _u32RLEOffset, bDecodeNow);
4822*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CPU Sync and Flush Memory~~~~\n");
4823*53ee8cc1Swenshuai.xi MAsm_CPU_Sync();
4824*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
4825*53ee8cc1Swenshuai.xi
4826*53ee8cc1Swenshuai.xi if(_bFirstRLE == TRUE)
4827*53ee8cc1Swenshuai.xi {
4828*53ee8cc1Swenshuai.xi // Trigger JPD decoding
4829*53ee8cc1Swenshuai.xi if(!JPEG_StartDecode())
4830*53ee8cc1Swenshuai.xi return FALSE;
4831*53ee8cc1Swenshuai.xi _bFirstRLE = FALSE;
4832*53ee8cc1Swenshuai.xi }
4833*53ee8cc1Swenshuai.xi else
4834*53ee8cc1Swenshuai.xi {
4835*53ee8cc1Swenshuai.xi // clear MRC low/high portion read complete event
4836*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE | E_JPD_EVENT_MRBL_DONE);
4837*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE | E_JPD_EVENT_MRBL_DONE);
4838*53ee8cc1Swenshuai.xi // mark low/high buffer valid
4839*53ee8cc1Swenshuai.xi //MDrv_Write2Byte( BK_JPD_MCONFIG, (MDrv_Read2Byte(BK_JPD_MCONFIG) & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
4840*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
4841*53ee8cc1Swenshuai.xi }
4842*53ee8cc1Swenshuai.xi
4843*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
4844*53ee8cc1Swenshuai.xi start_time = MsOS_GetSystemTime();
4845*53ee8cc1Swenshuai.xi #else
4846*53ee8cc1Swenshuai.xi start_time = 0;
4847*53ee8cc1Swenshuai.xi #endif
4848*53ee8cc1Swenshuai.xi //cur_vIdx = MDrv_Read2Byte(BK_JPD_CUR_VIDX);
4849*53ee8cc1Swenshuai.xi cur_vIdx = MDrv_JPD_GetCurVidx();
4850*53ee8cc1Swenshuai.xi
4851*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("cur_vIdx = 0x%04X\n",cur_vIdx);
4852*53ee8cc1Swenshuai.xi
4853*53ee8cc1Swenshuai.xi if( bDecodeNow )
4854*53ee8cc1Swenshuai.xi {
4855*53ee8cc1Swenshuai.xi return TRUE; //wait done in main loop
4856*53ee8cc1Swenshuai.xi }
4857*53ee8cc1Swenshuai.xi
4858*53ee8cc1Swenshuai.xi while(1)
4859*53ee8cc1Swenshuai.xi {
4860*53ee8cc1Swenshuai.xi //status = MDrv_JPD_ReadJPDStatus();
4861*53ee8cc1Swenshuai.xi status = MDrv_JPD_GetEventFlag();
4862*53ee8cc1Swenshuai.xi
4863*53ee8cc1Swenshuai.xi if(status & E_JPD_EVENT_DEC_DONE)
4864*53ee8cc1Swenshuai.xi {
4865*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("P deocde done\n");
4866*53ee8cc1Swenshuai.xi break;
4867*53ee8cc1Swenshuai.xi }
4868*53ee8cc1Swenshuai.xi
4869*53ee8cc1Swenshuai.xi if((status & E_JPD_EVENT_ECS_ERROR) || (status & E_JPD_EVENT_IS_ERROR) || (status & E_JPD_EVENT_RST_ERROR)
4870*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_AUTO_PROTECT==true)
4871*53ee8cc1Swenshuai.xi || (status & E_JPD_EVENT_MWB_FULL)
4872*53ee8cc1Swenshuai.xi #endif
4873*53ee8cc1Swenshuai.xi )
4874*53ee8cc1Swenshuai.xi {
4875*53ee8cc1Swenshuai.xi // temp patch for protect JPD from writing to illegal memory
4876*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CurVidx = %d, CurRow = %d, CurCol = %d ",
4877*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurVidx(),
4878*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurRow(),
4879*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurCol());
4880*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%lx\n", MDrv_JPD_GetCurMRCAddr());
4881*53ee8cc1Swenshuai.xi //MDrv_JPD_SW_Pause_Reset();
4882*53ee8cc1Swenshuai.xi MDrv_JPD_Rst();
4883*53ee8cc1Swenshuai.xi
4884*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_JPD_DECODE_ERROR );
4885*53ee8cc1Swenshuai.xi return FALSE;
4886*53ee8cc1Swenshuai.xi }
4887*53ee8cc1Swenshuai.xi
4888*53ee8cc1Swenshuai.xi if((status & E_JPD_EVENT_MRBH_DONE) && (status & E_JPD_EVENT_MRBL_DONE))
4889*53ee8cc1Swenshuai.xi {
4890*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Partial SVLD decode done\n");
4891*53ee8cc1Swenshuai.xi break;
4892*53ee8cc1Swenshuai.xi }
4893*53ee8cc1Swenshuai.xi
4894*53ee8cc1Swenshuai.xi // Check the V index. If it is not changed withing 500ms, it means that the JPD has some problem.
4895*53ee8cc1Swenshuai.xi // We need to break the infinite loop
4896*53ee8cc1Swenshuai.xi //if(cur_vIdx!=MDrv_Read2Byte(BK_JPD_CUR_VIDX))
4897*53ee8cc1Swenshuai.xi if(cur_vIdx != MDrv_JPD_GetCurVidx())
4898*53ee8cc1Swenshuai.xi {
4899*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
4900*53ee8cc1Swenshuai.xi start_time = MsOS_GetSystemTime();
4901*53ee8cc1Swenshuai.xi #else
4902*53ee8cc1Swenshuai.xi start_time = 0;
4903*53ee8cc1Swenshuai.xi #endif
4904*53ee8cc1Swenshuai.xi //cur_vIdx = MDrv_Read2Byte(BK_JPD_CUR_VIDX);
4905*53ee8cc1Swenshuai.xi cur_vIdx = MDrv_JPD_GetCurVidx();
4906*53ee8cc1Swenshuai.xi }
4907*53ee8cc1Swenshuai.xi else
4908*53ee8cc1Swenshuai.xi {
4909*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
4910*53ee8cc1Swenshuai.xi if((MsOS_GetSystemTime() - start_time) >= DEFAULT_DECODE_TIMEOUT)
4911*53ee8cc1Swenshuai.xi #else
4912*53ee8cc1Swenshuai.xi if(start_time++ >= DEFAULT_DECODE_TIMEOUT * 100)
4913*53ee8cc1Swenshuai.xi #endif
4914*53ee8cc1Swenshuai.xi {
4915*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("ERROR: SVLD deocde time out, VIdx %d\n", cur_vIdx);
4916*53ee8cc1Swenshuai.xi return FALSE;
4917*53ee8cc1Swenshuai.xi }
4918*53ee8cc1Swenshuai.xi }
4919*53ee8cc1Swenshuai.xi }
4920*53ee8cc1Swenshuai.xi
4921*53ee8cc1Swenshuai.xi _u32RLEOffset = 0;
4922*53ee8cc1Swenshuai.xi }
4923*53ee8cc1Swenshuai.xi #endif
4924*53ee8cc1Swenshuai.xi return TRUE;
4925*53ee8cc1Swenshuai.xi }
4926*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4927*53ee8cc1Swenshuai.xi // Do run length encode of coefficient buffer
4928*53ee8cc1Swenshuai.xi //JPEG_STATIC void JPEG_do_RLE(JPEG_BLOCK_TYPE *p, MS_BOOL eop, MS_U8 comp_id)
JPEG_do_RLE(JPEG_BLOCK_TYPE * p,MS_BOOL eop,MS_U8 comp_id,MS_BOOL BlockInRange)4929*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_do_RLE(JPEG_BLOCK_TYPE *p, MS_BOOL eop, MS_U8 comp_id, MS_BOOL BlockInRange)
4930*53ee8cc1Swenshuai.xi {
4931*53ee8cc1Swenshuai.xi JPEG_SVLD my_vld;
4932*53ee8cc1Swenshuai.xi MS_U8 counter;
4933*53ee8cc1Swenshuai.xi MS_S16 value;
4934*53ee8cc1Swenshuai.xi MS_U16 run;
4935*53ee8cc1Swenshuai.xi MS_U8 cur_blk;
4936*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE predictor;
4937*53ee8cc1Swenshuai.xi
4938*53ee8cc1Swenshuai.xi if(comp_id==0)
4939*53ee8cc1Swenshuai.xi cur_blk = 1; // Y
4940*53ee8cc1Swenshuai.xi else if(comp_id==1)
4941*53ee8cc1Swenshuai.xi cur_blk = 3; // U
4942*53ee8cc1Swenshuai.xi else
4943*53ee8cc1Swenshuai.xi cur_blk = 2; // V
4944*53ee8cc1Swenshuai.xi
4945*53ee8cc1Swenshuai.xi predictor = _s16dc_pred[cur_blk - 1];
4946*53ee8cc1Swenshuai.xi
4947*53ee8cc1Swenshuai.xi run = 0;
4948*53ee8cc1Swenshuai.xi my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4949*53ee8cc1Swenshuai.xi my_vld.blk_type = cur_blk;
4950*53ee8cc1Swenshuai.xi
4951*53ee8cc1Swenshuai.xi //sent DC info
4952*53ee8cc1Swenshuai.xi //// my_vld.run = 8;
4953*53ee8cc1Swenshuai.xi if( BlockInRange )//Current block is within display range.
4954*53ee8cc1Swenshuai.xi my_vld.run = 8;
4955*53ee8cc1Swenshuai.xi else
4956*53ee8cc1Swenshuai.xi my_vld.run = 0;
4957*53ee8cc1Swenshuai.xi
4958*53ee8cc1Swenshuai.xi value = (p[0] - predictor);
4959*53ee8cc1Swenshuai.xi my_vld.sign = (value<0)?1:0;
4960*53ee8cc1Swenshuai.xi my_vld.amp = JPEG_ABS(value);
4961*53ee8cc1Swenshuai.xi my_vld.sym_type = E_RLE_DC;
4962*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, FALSE))
4963*53ee8cc1Swenshuai.xi return FALSE;
4964*53ee8cc1Swenshuai.xi
4965*53ee8cc1Swenshuai.xi if( BlockInRange == FALSE )//Current block is not within display range.
4966*53ee8cc1Swenshuai.xi return TRUE;
4967*53ee8cc1Swenshuai.xi
4968*53ee8cc1Swenshuai.xi my_vld.byte0 = my_vld.byte1 =my_vld.byte2 = my_vld.byte3= 0;
4969*53ee8cc1Swenshuai.xi my_vld.blk_type = cur_blk;
4970*53ee8cc1Swenshuai.xi
4971*53ee8cc1Swenshuai.xi for(counter = 1;counter<64; counter++)
4972*53ee8cc1Swenshuai.xi {
4973*53ee8cc1Swenshuai.xi if(p[counter]==0)
4974*53ee8cc1Swenshuai.xi {
4975*53ee8cc1Swenshuai.xi run++;
4976*53ee8cc1Swenshuai.xi }
4977*53ee8cc1Swenshuai.xi else
4978*53ee8cc1Swenshuai.xi {
4979*53ee8cc1Swenshuai.xi while(run>15)
4980*53ee8cc1Swenshuai.xi {
4981*53ee8cc1Swenshuai.xi my_vld.sign = 0;
4982*53ee8cc1Swenshuai.xi my_vld.amp = 0;
4983*53ee8cc1Swenshuai.xi my_vld.sym_type = E_RLE_ZRL;
4984*53ee8cc1Swenshuai.xi my_vld.run = 15;
4985*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, FALSE))
4986*53ee8cc1Swenshuai.xi return FALSE;
4987*53ee8cc1Swenshuai.xi my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4988*53ee8cc1Swenshuai.xi my_vld.blk_type = cur_blk;
4989*53ee8cc1Swenshuai.xi run -= 16;
4990*53ee8cc1Swenshuai.xi }
4991*53ee8cc1Swenshuai.xi
4992*53ee8cc1Swenshuai.xi my_vld.sign = (p[counter]<0)?1:0;
4993*53ee8cc1Swenshuai.xi my_vld.amp = JPEG_ABS(p[counter]);
4994*53ee8cc1Swenshuai.xi my_vld.sym_type = E_RLE_AC;
4995*53ee8cc1Swenshuai.xi my_vld.run = run;
4996*53ee8cc1Swenshuai.xi
4997*53ee8cc1Swenshuai.xi // Check if the last byte is non-zero. If it's non-zero & EOP, add the EOP flag
4998*53ee8cc1Swenshuai.xi if(counter==63&&eop&&p[63]!=0)
4999*53ee8cc1Swenshuai.xi {
5000*53ee8cc1Swenshuai.xi my_vld.EOP = 1;
5001*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, TRUE))
5002*53ee8cc1Swenshuai.xi return FALSE;
5003*53ee8cc1Swenshuai.xi
5004*53ee8cc1Swenshuai.xi _s16dc_pred[cur_blk - 1] = p[0];//update predictor
5005*53ee8cc1Swenshuai.xi return TRUE;
5006*53ee8cc1Swenshuai.xi }
5007*53ee8cc1Swenshuai.xi else
5008*53ee8cc1Swenshuai.xi {
5009*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, FALSE))
5010*53ee8cc1Swenshuai.xi return FALSE;
5011*53ee8cc1Swenshuai.xi }
5012*53ee8cc1Swenshuai.xi
5013*53ee8cc1Swenshuai.xi my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
5014*53ee8cc1Swenshuai.xi my_vld.blk_type = cur_blk;
5015*53ee8cc1Swenshuai.xi run = 0;
5016*53ee8cc1Swenshuai.xi }
5017*53ee8cc1Swenshuai.xi }
5018*53ee8cc1Swenshuai.xi
5019*53ee8cc1Swenshuai.xi counter = 63;
5020*53ee8cc1Swenshuai.xi
5021*53ee8cc1Swenshuai.xi if(p[counter]==0)
5022*53ee8cc1Swenshuai.xi {
5023*53ee8cc1Swenshuai.xi my_vld.amp = JPEG_ABS(p[counter]);
5024*53ee8cc1Swenshuai.xi my_vld.sign = p[counter]<0?1:0;
5025*53ee8cc1Swenshuai.xi my_vld.sym_type = E_RLE_EOB;
5026*53ee8cc1Swenshuai.xi my_vld.run = 0;
5027*53ee8cc1Swenshuai.xi if(eop)
5028*53ee8cc1Swenshuai.xi {
5029*53ee8cc1Swenshuai.xi my_vld.EOP = 1;
5030*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, TRUE))
5031*53ee8cc1Swenshuai.xi return FALSE;
5032*53ee8cc1Swenshuai.xi }
5033*53ee8cc1Swenshuai.xi else
5034*53ee8cc1Swenshuai.xi {
5035*53ee8cc1Swenshuai.xi if(!JPEG_write_RLE(&my_vld, FALSE))
5036*53ee8cc1Swenshuai.xi return FALSE;
5037*53ee8cc1Swenshuai.xi }
5038*53ee8cc1Swenshuai.xi }
5039*53ee8cc1Swenshuai.xi
5040*53ee8cc1Swenshuai.xi _s16dc_pred[cur_blk - 1] = p[0];//update predictor
5041*53ee8cc1Swenshuai.xi return TRUE;
5042*53ee8cc1Swenshuai.xi }
5043*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5044*53ee8cc1Swenshuai.xi // Starts a new scan.
JPEG_init_scan(void)5045*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_scan(void)
5046*53ee8cc1Swenshuai.xi {
5047*53ee8cc1Swenshuai.xi if (!JPEG_locate_sos_marker())
5048*53ee8cc1Swenshuai.xi return FALSE;
5049*53ee8cc1Swenshuai.xi
5050*53ee8cc1Swenshuai.xi JPEG_calc_mcu_block_order();
5051*53ee8cc1Swenshuai.xi
5052*53ee8cc1Swenshuai.xi if (_HeadCheck.DHT)
5053*53ee8cc1Swenshuai.xi {
5054*53ee8cc1Swenshuai.xi if(!JPEG_check_huff_tables())
5055*53ee8cc1Swenshuai.xi return FALSE;
5056*53ee8cc1Swenshuai.xi }
5057*53ee8cc1Swenshuai.xi
5058*53ee8cc1Swenshuai.xi if (_HeadCheck.DQT)
5059*53ee8cc1Swenshuai.xi {
5060*53ee8cc1Swenshuai.xi if(!JPEG_check_quant_tables())
5061*53ee8cc1Swenshuai.xi return FALSE;
5062*53ee8cc1Swenshuai.xi }
5063*53ee8cc1Swenshuai.xi
5064*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
5065*53ee8cc1Swenshuai.xi JPEG_memset((void *)_u32Last_dc_val, 0, _u8Comps_in_frame * sizeof( MS_U32 ) );
5066*53ee8cc1Swenshuai.xi
5067*53ee8cc1Swenshuai.xi _u32EOB_run = 0;
5068*53ee8cc1Swenshuai.xi #endif
5069*53ee8cc1Swenshuai.xi
5070*53ee8cc1Swenshuai.xi if ( _u16Restart_interval )
5071*53ee8cc1Swenshuai.xi {
5072*53ee8cc1Swenshuai.xi _u16Restarts_left = _u16Restart_interval;
5073*53ee8cc1Swenshuai.xi _u16Next_restart_num = 0;
5074*53ee8cc1Swenshuai.xi }
5075*53ee8cc1Swenshuai.xi
5076*53ee8cc1Swenshuai.xi //// _Total_Decoded_Size = (MS_S32)JPEG_GetECS();
5077*53ee8cc1Swenshuai.xi
5078*53ee8cc1Swenshuai.xi #ifdef CMODEL
5079*53ee8cc1Swenshuai.xi {
5080*53ee8cc1Swenshuai.xi // pre-fill bit buffer for later decoding
5081*53ee8cc1Swenshuai.xi _s16Bits_left = 16;
5082*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5083*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5084*53ee8cc1Swenshuai.xi }
5085*53ee8cc1Swenshuai.xi #else
5086*53ee8cc1Swenshuai.xi {
5087*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5088*53ee8cc1Swenshuai.xi if(_bProgressive_flag
5089*53ee8cc1Swenshuai.xi || (E_JPEG_CMYK == gu8Scan_type)
5090*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5091*53ee8cc1Swenshuai.xi #else
5092*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
5093*53ee8cc1Swenshuai.xi #endif
5094*53ee8cc1Swenshuai.xi {
5095*53ee8cc1Swenshuai.xi // pre-fill bit buffer for later decoding
5096*53ee8cc1Swenshuai.xi _s16Bits_left = 16;
5097*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5098*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5099*53ee8cc1Swenshuai.xi }
5100*53ee8cc1Swenshuai.xi }
5101*53ee8cc1Swenshuai.xi #endif
5102*53ee8cc1Swenshuai.xi
5103*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_init_scan:ECS 0x%08lx\n", JPEG_GetECS());
5104*53ee8cc1Swenshuai.xi
5105*53ee8cc1Swenshuai.xi return TRUE;
5106*53ee8cc1Swenshuai.xi }
5107*53ee8cc1Swenshuai.xi
5108*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5109*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5110*53ee8cc1Swenshuai.xi // Create a few tables that allow us to quickly convert YCbCr to RGB.
msAPI_JPEG_create_look_ups(void)5111*53ee8cc1Swenshuai.xi JPEG_STATIC void msAPI_JPEG_create_look_ups( void )
5112*53ee8cc1Swenshuai.xi {
5113*53ee8cc1Swenshuai.xi MS_S16 i, k;
5114*53ee8cc1Swenshuai.xi //kevinhuang, modify
5115*53ee8cc1Swenshuai.xi /*
5116*53ee8cc1Swenshuai.xi for (i = 0; i <= 255; i++)
5117*53ee8cc1Swenshuai.xi {
5118*53ee8cc1Swenshuai.xi //k = (i * 2) - 255;
5119*53ee8cc1Swenshuai.xi k = (i * 2) - 256; // Dec. 28 2001- change so table[128] == 0
5120*53ee8cc1Swenshuai.xi gs32Crr[i] = ( FIX(1.40200/2) * k + ONE_HALF) >> SCALEBITS;
5121*53ee8cc1Swenshuai.xi gs32Cbb[i] = ( FIX(1.77200/2) * k + ONE_HALF) >> SCALEBITS;
5122*53ee8cc1Swenshuai.xi gs32Crg[i] = (-FIX(0.71414/2)) * k;
5123*53ee8cc1Swenshuai.xi gs32Cbg[i] = (-FIX(0.34414/2)) * k + ONE_HALF;
5124*53ee8cc1Swenshuai.xi }
5125*53ee8cc1Swenshuai.xi */
5126*53ee8cc1Swenshuai.xi for ( i = 0; i <= 255; i++ )
5127*53ee8cc1Swenshuai.xi {
5128*53ee8cc1Swenshuai.xi k = i - 128;
5129*53ee8cc1Swenshuai.xi
5130*53ee8cc1Swenshuai.xi gs32Crr[i] = ( FIX( 1.40200 ) * k + ONE_HALF ) >> SCALEBITS;
5131*53ee8cc1Swenshuai.xi gs32Cbb[i] = ( FIX( 1.77200 ) * k + ONE_HALF ) >> SCALEBITS;
5132*53ee8cc1Swenshuai.xi
5133*53ee8cc1Swenshuai.xi gs32Crg[i] = ( -FIX( 0.71414 ) ) * k ; //+ ONE_HALF) >> SCALEBITS;???
5134*53ee8cc1Swenshuai.xi gs32Cbg[i] = ( -FIX( 0.34414 ) ) * k + ONE_HALF; //>> SCALEBITS;???
5135*53ee8cc1Swenshuai.xi
5136*53ee8cc1Swenshuai.xi }
5137*53ee8cc1Swenshuai.xi }
5138*53ee8cc1Swenshuai.xi
5139*53ee8cc1Swenshuai.xi #endif //SW_JPD_RGB_CMYK
5140*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5141*53ee8cc1Swenshuai.xi // Starts a frame. Determines if the number of components or sampling factors
5142*53ee8cc1Swenshuai.xi // are supported.
JPEG_init_frame(void)5143*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_frame(void) //ok
5144*53ee8cc1Swenshuai.xi {
5145*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5146*53ee8cc1Swenshuai.xi MS_U32 i;
5147*53ee8cc1Swenshuai.xi MS_U8 *q;
5148*53ee8cc1Swenshuai.xi #endif
5149*53ee8cc1Swenshuai.xi
5150*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_init_frame:\n");
5151*53ee8cc1Swenshuai.xi if ( _u8Comps_in_frame == 1 )
5152*53ee8cc1Swenshuai.xi {
5153*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_GRAYSCALE;
5154*53ee8cc1Swenshuai.xi
5155*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 1;
5156*53ee8cc1Swenshuai.xi
5157*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 8;
5158*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 8;
5159*53ee8cc1Swenshuai.xi }
5160*53ee8cc1Swenshuai.xi else if ( _u8Comps_in_frame == 3 )
5161*53ee8cc1Swenshuai.xi {
5162*53ee8cc1Swenshuai.xi if ( ( ( _u8Comp_h_samp[1] != 1 ) || ( _u8Comp_v_samp[1] != 1 ) ) || //support only U_H1V1 & V_H1V1
5163*53ee8cc1Swenshuai.xi ( ( _u8Comp_h_samp[2] != 1 ) || ( _u8Comp_v_samp[2] != 1 ) ) )
5164*53ee8cc1Swenshuai.xi {
5165*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5166*53ee8cc1Swenshuai.xi return FALSE;
5167*53ee8cc1Swenshuai.xi }
5168*53ee8cc1Swenshuai.xi
5169*53ee8cc1Swenshuai.xi if ( ( _u8Comp_h_samp[0] == 1 ) && ( _u8Comp_v_samp[0] == 1 ) )
5170*53ee8cc1Swenshuai.xi {
5171*53ee8cc1Swenshuai.xi //set RGB based jpeg flag
5172*53ee8cc1Swenshuai.xi if(_u8Comp_ident[0] == 82 || _u8Comp_ident[0] == 71 || _u8Comp_ident[0] == 66)
5173*53ee8cc1Swenshuai.xi {
5174*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5175*53ee8cc1Swenshuai.xi if( FALSE == bEnableRGB )
5176*53ee8cc1Swenshuai.xi {
5177*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5178*53ee8cc1Swenshuai.xi return FALSE;
5179*53ee8cc1Swenshuai.xi }
5180*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Get JPEG_RGB\n");
5181*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_RGB; //RGB
5182*53ee8cc1Swenshuai.xi #else
5183*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5184*53ee8cc1Swenshuai.xi return FALSE;
5185*53ee8cc1Swenshuai.xi #endif
5186*53ee8cc1Swenshuai.xi }
5187*53ee8cc1Swenshuai.xi else
5188*53ee8cc1Swenshuai.xi {
5189*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Get JPEG_YH1V1\n");
5190*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_YH1V1; //4:4:4
5191*53ee8cc1Swenshuai.xi }
5192*53ee8cc1Swenshuai.xi
5193*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 3;
5194*53ee8cc1Swenshuai.xi
5195*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 8;
5196*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 8;
5197*53ee8cc1Swenshuai.xi }
5198*53ee8cc1Swenshuai.xi else if ( ( _u8Comp_h_samp[0] == 2 ) && ( _u8Comp_v_samp[0] == 1 ) )
5199*53ee8cc1Swenshuai.xi {
5200*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_YH2V1; //4:2:2
5201*53ee8cc1Swenshuai.xi
5202*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 4;
5203*53ee8cc1Swenshuai.xi
5204*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 16;
5205*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 8;
5206*53ee8cc1Swenshuai.xi }
5207*53ee8cc1Swenshuai.xi else if ( ( _u8Comp_h_samp[0] == 1 ) && ( _u8Comp_v_samp[0] == 2 ) )
5208*53ee8cc1Swenshuai.xi {
5209*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_YH1V2;
5210*53ee8cc1Swenshuai.xi
5211*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 4;
5212*53ee8cc1Swenshuai.xi
5213*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 8;
5214*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 16;
5215*53ee8cc1Swenshuai.xi }
5216*53ee8cc1Swenshuai.xi else if ( ( _u8Comp_h_samp[0] == 2 ) && ( _u8Comp_v_samp[0] == 2 ) )
5217*53ee8cc1Swenshuai.xi {
5218*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_YH2V2; //4:2:0
5219*53ee8cc1Swenshuai.xi
5220*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 6;
5221*53ee8cc1Swenshuai.xi
5222*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 16;
5223*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 16;
5224*53ee8cc1Swenshuai.xi }
5225*53ee8cc1Swenshuai.xi else if ( ( _u8Comp_h_samp[0] == 4 ) && ( _u8Comp_v_samp[0] == 1 ) )
5226*53ee8cc1Swenshuai.xi {
5227*53ee8cc1Swenshuai.xi // 4:1:1
5228*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_YH4V1;
5229*53ee8cc1Swenshuai.xi
5230*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 6;
5231*53ee8cc1Swenshuai.xi
5232*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 32;
5233*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 8;
5234*53ee8cc1Swenshuai.xi //#if CMODEL
5235*53ee8cc1Swenshuai.xi //JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5236*53ee8cc1Swenshuai.xi //#endif
5237*53ee8cc1Swenshuai.xi }
5238*53ee8cc1Swenshuai.xi else
5239*53ee8cc1Swenshuai.xi {
5240*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5241*53ee8cc1Swenshuai.xi return FALSE;
5242*53ee8cc1Swenshuai.xi }
5243*53ee8cc1Swenshuai.xi }
5244*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5245*53ee8cc1Swenshuai.xi else if(_u8Comps_in_frame == 4) //handle YCCK & CMYK case, must distinguish YCCK and CMYK later
5246*53ee8cc1Swenshuai.xi {
5247*53ee8cc1Swenshuai.xi if( FALSE == bEnableCMYK )
5248*53ee8cc1Swenshuai.xi {
5249*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5250*53ee8cc1Swenshuai.xi return FALSE;
5251*53ee8cc1Swenshuai.xi }
5252*53ee8cc1Swenshuai.xi
5253*53ee8cc1Swenshuai.xi if ( ( _u8Comp_h_samp[0] == 1 ) && ( _u8Comp_v_samp[0] == 1 ) )
5254*53ee8cc1Swenshuai.xi {
5255*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Get JPEG_CMYK\n");
5256*53ee8cc1Swenshuai.xi gu8Scan_type = E_JPEG_CMYK;
5257*53ee8cc1Swenshuai.xi
5258*53ee8cc1Swenshuai.xi _u16Max_blocks_per_mcu = 4;
5259*53ee8cc1Swenshuai.xi
5260*53ee8cc1Swenshuai.xi gu8Max_mcu_x_size = 8;
5261*53ee8cc1Swenshuai.xi gu8Max_mcu_y_size = 8;
5262*53ee8cc1Swenshuai.xi }
5263*53ee8cc1Swenshuai.xi else
5264*53ee8cc1Swenshuai.xi {
5265*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5266*53ee8cc1Swenshuai.xi return FALSE;
5267*53ee8cc1Swenshuai.xi }
5268*53ee8cc1Swenshuai.xi }
5269*53ee8cc1Swenshuai.xi #endif
5270*53ee8cc1Swenshuai.xi else
5271*53ee8cc1Swenshuai.xi {
5272*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5273*53ee8cc1Swenshuai.xi return FALSE;
5274*53ee8cc1Swenshuai.xi }
5275*53ee8cc1Swenshuai.xi
5276*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_init_frame:gu8Scan_type = %d\n", gu8Scan_type);
5277*53ee8cc1Swenshuai.xi
5278*53ee8cc1Swenshuai.xi gu16Max_mcus_per_row = ( _u16Image_x_size + ( gu8Max_mcu_x_size - 1 ) ) / gu8Max_mcu_x_size;
5279*53ee8cc1Swenshuai.xi _u16Max_mcus_per_col = ( _u16Image_y_size + ( gu8Max_mcu_y_size - 1 ) ) / gu8Max_mcu_y_size;
5280*53ee8cc1Swenshuai.xi
5281*53ee8cc1Swenshuai.xi #ifdef CMODEL
5282*53ee8cc1Swenshuai.xi /* these values are for the *destination* pixels: after conversion */
5283*53ee8cc1Swenshuai.xi
5284*53ee8cc1Swenshuai.xi if ( E_JPEG_GRAYSCALE == gu8Scan_type )
5285*53ee8cc1Swenshuai.xi {
5286*53ee8cc1Swenshuai.xi gu8Dest_bytes_per_pixel = 1;
5287*53ee8cc1Swenshuai.xi }
5288*53ee8cc1Swenshuai.xi else
5289*53ee8cc1Swenshuai.xi //kevinhuang, ToDo 4 -> 3 later
5290*53ee8cc1Swenshuai.xi {
5291*53ee8cc1Swenshuai.xi gu8Dest_bytes_per_pixel = 4;
5292*53ee8cc1Swenshuai.xi }
5293*53ee8cc1Swenshuai.xi
5294*53ee8cc1Swenshuai.xi gu16Dest_bytes_per_scan_line = ( ( _u16Image_x_size + 15 ) & 0xFFF0 ) * gu8Dest_bytes_per_pixel;
5295*53ee8cc1Swenshuai.xi gu16Real_dest_bytes_per_scan_line = ( _u16Image_x_size * gu8Dest_bytes_per_pixel );
5296*53ee8cc1Swenshuai.xi
5297*53ee8cc1Swenshuai.xi // Initialize two scan line buffers.
5298*53ee8cc1Swenshuai.xi // FIXME: Only the V2 sampling factors need two buffers.
5299*53ee8cc1Swenshuai.xi #define DC_ALIGNMENT 16
5300*53ee8cc1Swenshuai.xi //pgu8Scan_line_0 = (MS_U8 *)JPEG_alloc(gu16Dest_bytes_per_scan_line + 8);
5301*53ee8cc1Swenshuai.xi pgu8Scan_line_0 = ( MS_U8 * )JPEG_alloc( gu16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5302*53ee8cc1Swenshuai.xi if(pgu8Scan_line_0 == NULL)
5303*53ee8cc1Swenshuai.xi return FALSE;
5304*53ee8cc1Swenshuai.xi JPEG_memset((void *)pgu8Scan_line_0, 0x7F, gu16Dest_bytes_per_scan_line ); //kevinhuang, write dummy bytes for DC pitch alignment to display right border in certain color thru VE
5305*53ee8cc1Swenshuai.xi
5306*53ee8cc1Swenshuai.xi //pgu8scan_line_1 = (MS_U8 *)JPEG_alloc(gu16Dest_bytes_per_scan_line + 8);
5307*53ee8cc1Swenshuai.xi pgu8scan_line_1 = ( MS_U8 * )JPEG_alloc( gu16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5308*53ee8cc1Swenshuai.xi if(pgu8scan_line_1 == NULL)
5309*53ee8cc1Swenshuai.xi return FALSE;
5310*53ee8cc1Swenshuai.xi JPEG_memset((void *)pgu8scan_line_1, 0x7F, gu16Dest_bytes_per_scan_line ); //kevinhuang, write dummy bytes for DC pitch alignment to display right border in certain color thru VE
5311*53ee8cc1Swenshuai.xi #endif
5312*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5313*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5314*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5315*53ee8cc1Swenshuai.xi {
5316*53ee8cc1Swenshuai.xi /* these values are for the *destination* pixels: after conversion */
5317*53ee8cc1Swenshuai.xi
5318*53ee8cc1Swenshuai.xi //Reset image x size by new Max_mcus
5319*53ee8cc1Swenshuai.xi _u16Image_x_size = gu16Max_mcus_per_row*gu8Max_mcu_x_size;
5320*53ee8cc1Swenshuai.xi
5321*53ee8cc1Swenshuai.xi _u16NonAlignmentImage_x_size = _u16Image_x_size;
5322*53ee8cc1Swenshuai.xi
5323*53ee8cc1Swenshuai.xi if ( E_JPEG_GRAYSCALE == gu8Scan_type )
5324*53ee8cc1Swenshuai.xi {
5325*53ee8cc1Swenshuai.xi _u8Dest_bytes_per_pixel = 1;
5326*53ee8cc1Swenshuai.xi }
5327*53ee8cc1Swenshuai.xi else
5328*53ee8cc1Swenshuai.xi //kevinhuang, ToDo 4 -> 3 later
5329*53ee8cc1Swenshuai.xi {
5330*53ee8cc1Swenshuai.xi _u8Dest_bytes_per_pixel = 4;
5331*53ee8cc1Swenshuai.xi }
5332*53ee8cc1Swenshuai.xi
5333*53ee8cc1Swenshuai.xi _u16Dest_bytes_per_scan_line = ( ( _u16Image_x_size + 15 ) & 0xFFF0 ) * _u8Dest_bytes_per_pixel;
5334*53ee8cc1Swenshuai.xi // _u16Real_dest_bytes_per_scan_line = ( _u16Image_x_size * _u8Dest_bytes_per_pixel );
5335*53ee8cc1Swenshuai.xi
5336*53ee8cc1Swenshuai.xi // Initialize two scan line buffers.
5337*53ee8cc1Swenshuai.xi // FIXME: Only the V2 sampling factors need two buffers.
5338*53ee8cc1Swenshuai.xi #define DC_ALIGNMENT 16
5339*53ee8cc1Swenshuai.xi //pgu8Scan_line_0 = (U8 *)alloc(_u16Dest_bytes_per_scan_line + 8);
5340*53ee8cc1Swenshuai.xi pgu8Scan_line_0 = ( MS_U8 * )JPEG_alloc( _u16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5341*53ee8cc1Swenshuai.xi if(pgu8Scan_line_0 == NULL)
5342*53ee8cc1Swenshuai.xi return FALSE;
5343*53ee8cc1Swenshuai.xi JPEG_memset( pgu8Scan_line_0, 0x7F, _u16Dest_bytes_per_scan_line ); //kevinhuang, write dummy bytes for DC pitch alignment to display right border in certain color thru VE
5344*53ee8cc1Swenshuai.xi
5345*53ee8cc1Swenshuai.xi //pgu8scan_line_1 = (U8 *)alloc(_u16Dest_bytes_per_scan_line + 8);
5346*53ee8cc1Swenshuai.xi pgu8scan_line_1 = ( MS_U8 * )JPEG_alloc( _u16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5347*53ee8cc1Swenshuai.xi if(pgu8scan_line_1 == NULL)
5348*53ee8cc1Swenshuai.xi return FALSE;
5349*53ee8cc1Swenshuai.xi JPEG_memset( pgu8scan_line_1, 0x7F, _u16Dest_bytes_per_scan_line ); //kevinhuang, write dummy bytes for DC pitch alignment to display right border in certain color thru VE
5350*53ee8cc1Swenshuai.xi }
5351*53ee8cc1Swenshuai.xi #endif
5352*53ee8cc1Swenshuai.xi
5353*53ee8cc1Swenshuai.xi _u32Max_blocks_per_row = gu16Max_mcus_per_row * _u16Max_blocks_per_mcu;
5354*53ee8cc1Swenshuai.xi
5355*53ee8cc1Swenshuai.xi // Should never happen
5356*53ee8cc1Swenshuai.xi if ( _u32Max_blocks_per_row > JPEG_MAXBLOCKSPERROW )
5357*53ee8cc1Swenshuai.xi {
5358*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_ASSERTION_ERROR );
5359*53ee8cc1Swenshuai.xi return FALSE;
5360*53ee8cc1Swenshuai.xi }
5361*53ee8cc1Swenshuai.xi
5362*53ee8cc1Swenshuai.xi #ifdef CMODEL
5363*53ee8cc1Swenshuai.xi {
5364*53ee8cc1Swenshuai.xi MS_U32 i;
5365*53ee8cc1Swenshuai.xi MS_U8 *q;
5366*53ee8cc1Swenshuai.xi
5367*53ee8cc1Swenshuai.xi // Allocate the coefficient buffer, enough for one row's worth of MCU's
5368*53ee8cc1Swenshuai.xi q = ( MS_U8 * )JPEG_alloc( _u32Max_blocks_per_row * 64 * sizeof( JPEG_BLOCK_TYPE ) + 8 );
5369*53ee8cc1Swenshuai.xi if(q == NULL)
5370*53ee8cc1Swenshuai.xi return FALSE;
5371*53ee8cc1Swenshuai.xi
5372*53ee8cc1Swenshuai.xi // Align to 8-byte boundry, for MMX code
5373*53ee8cc1Swenshuai.xi q = ( MS_U8 * )( ( ( MS_U32 )q + 7 ) & ~7 );
5374*53ee8cc1Swenshuai.xi if(q == NULL)
5375*53ee8cc1Swenshuai.xi return FALSE;
5376*53ee8cc1Swenshuai.xi
5377*53ee8cc1Swenshuai.xi // The gps16Block_seg[] array's name dates back to the
5378*53ee8cc1Swenshuai.xi // 16-bit assembler implementation. "seg" stood for "segment".
5379*53ee8cc1Swenshuai.xi for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5380*53ee8cc1Swenshuai.xi {
5381*53ee8cc1Swenshuai.xi gps16Block_seg[i] = ( JPEG_BLOCK_TYPE * )( q + i * 64 * sizeof( JPEG_BLOCK_TYPE ) );
5382*53ee8cc1Swenshuai.xi }
5383*53ee8cc1Swenshuai.xi
5384*53ee8cc1Swenshuai.xi for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5385*53ee8cc1Swenshuai.xi {
5386*53ee8cc1Swenshuai.xi gu8Block_max_zag_set[i] = 64;
5387*53ee8cc1Swenshuai.xi }
5388*53ee8cc1Swenshuai.xi
5389*53ee8cc1Swenshuai.xi gpu8Sample_buf = ( MS_U8 * )( ( ( MS_U32 )JPEG_alloc( _u32Max_blocks_per_row * 64 + 8 ) + 7 ) & ~7 );
5390*53ee8cc1Swenshuai.xi if(gpu8Sample_buf == NULL)
5391*53ee8cc1Swenshuai.xi return FALSE;
5392*53ee8cc1Swenshuai.xi
5393*53ee8cc1Swenshuai.xi JPEG_CMODEL_create_look_ups();
5394*53ee8cc1Swenshuai.xi }
5395*53ee8cc1Swenshuai.xi #endif
5396*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5397*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5398*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5399*53ee8cc1Swenshuai.xi {
5400*53ee8cc1Swenshuai.xi // Allocate the coefficient buffer, enough for one row's worth of MCU's
5401*53ee8cc1Swenshuai.xi q = ( MS_U8 * )JPEG_alloc( _u32Max_blocks_per_row * 64 * sizeof( JPEG_BLOCK_TYPE ) + 8 );
5402*53ee8cc1Swenshuai.xi if(q == NULL)
5403*53ee8cc1Swenshuai.xi return FALSE;
5404*53ee8cc1Swenshuai.xi
5405*53ee8cc1Swenshuai.xi // Align to 8-byte boundry, for MMX code
5406*53ee8cc1Swenshuai.xi q = ( MS_U8 * )( ( ( MS_U32 )q + 7 ) & ~7 );
5407*53ee8cc1Swenshuai.xi
5408*53ee8cc1Swenshuai.xi // The _ps16Block_seg[] array's name dates back to the
5409*53ee8cc1Swenshuai.xi // 16-bit assembler implementation. "seg" stood for "segment".
5410*53ee8cc1Swenshuai.xi for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5411*53ee8cc1Swenshuai.xi {
5412*53ee8cc1Swenshuai.xi _ps16Block_seg[i] = ( JPEG_BLOCK_TYPE * )( (MS_U32)q + i * 64 * sizeof( JPEG_BLOCK_TYPE ) );
5413*53ee8cc1Swenshuai.xi }
5414*53ee8cc1Swenshuai.xi
5415*53ee8cc1Swenshuai.xi for ( i = 0; i < _u32Max_blocks_per_row; i++ )
5416*53ee8cc1Swenshuai.xi {
5417*53ee8cc1Swenshuai.xi _u8Block_max_zag_set[i] = 64;
5418*53ee8cc1Swenshuai.xi }
5419*53ee8cc1Swenshuai.xi
5420*53ee8cc1Swenshuai.xi gpu8Sample_buf = ( MS_U8 * )( ( ( MS_U32 )JPEG_alloc( _u32Max_blocks_per_row * 64 + 8 ) + 7 ) & ~7 );
5421*53ee8cc1Swenshuai.xi if(gpu8Sample_buf == NULL)
5422*53ee8cc1Swenshuai.xi return FALSE;
5423*53ee8cc1Swenshuai.xi
5424*53ee8cc1Swenshuai.xi _u16Total_lines_left = _u16Image_y_size;
5425*53ee8cc1Swenshuai.xi
5426*53ee8cc1Swenshuai.xi #ifdef CMODEL
5427*53ee8cc1Swenshuai.xi gu16Mcu_lines_left = 0;
5428*53ee8cc1Swenshuai.xi #endif
5429*53ee8cc1Swenshuai.xi
5430*53ee8cc1Swenshuai.xi msAPI_JPEG_create_look_ups();
5431*53ee8cc1Swenshuai.xi }
5432*53ee8cc1Swenshuai.xi #endif
5433*53ee8cc1Swenshuai.xi
5434*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
5435*53ee8cc1Swenshuai.xi _u16Total_lines_left = _u16Max_mcus_per_col * gu8Max_mcu_y_size;
5436*53ee8cc1Swenshuai.xi #ifdef CMODEL
5437*53ee8cc1Swenshuai.xi gu16Mcu_lines_left = 0;
5438*53ee8cc1Swenshuai.xi #endif
5439*53ee8cc1Swenshuai.xi #endif
5440*53ee8cc1Swenshuai.xi return TRUE;
5441*53ee8cc1Swenshuai.xi }
5442*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5443*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
5444*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5445*53ee8cc1Swenshuai.xi // Restart interval processing.
JPEG_process_restart(void)5446*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_process_restart(void)
5447*53ee8cc1Swenshuai.xi {
5448*53ee8cc1Swenshuai.xi MS_U16 i, c = 0;
5449*53ee8cc1Swenshuai.xi
5450*53ee8cc1Swenshuai.xi // Let's scan a little bit to find the marker, but not _too_ far.
5451*53ee8cc1Swenshuai.xi // 1536 is a "fudge factor" that determines how much to scan.
5452*53ee8cc1Swenshuai.xi for ( i = 1536; i > 0; i-- )
5453*53ee8cc1Swenshuai.xi {
5454*53ee8cc1Swenshuai.xi if ( JPEG_get_char() == 0xFF )
5455*53ee8cc1Swenshuai.xi {
5456*53ee8cc1Swenshuai.xi break;
5457*53ee8cc1Swenshuai.xi }
5458*53ee8cc1Swenshuai.xi }
5459*53ee8cc1Swenshuai.xi
5460*53ee8cc1Swenshuai.xi if ( i == 0 )
5461*53ee8cc1Swenshuai.xi {
5462*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5463*53ee8cc1Swenshuai.xi return FALSE;
5464*53ee8cc1Swenshuai.xi }
5465*53ee8cc1Swenshuai.xi
5466*53ee8cc1Swenshuai.xi for ( ; i > 0; i-- )
5467*53ee8cc1Swenshuai.xi {
5468*53ee8cc1Swenshuai.xi c = JPEG_get_char();
5469*53ee8cc1Swenshuai.xi if ( c != 0xFF )
5470*53ee8cc1Swenshuai.xi {
5471*53ee8cc1Swenshuai.xi break;
5472*53ee8cc1Swenshuai.xi }
5473*53ee8cc1Swenshuai.xi }
5474*53ee8cc1Swenshuai.xi
5475*53ee8cc1Swenshuai.xi if ( i == 0 )
5476*53ee8cc1Swenshuai.xi {
5477*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5478*53ee8cc1Swenshuai.xi return FALSE;
5479*53ee8cc1Swenshuai.xi }
5480*53ee8cc1Swenshuai.xi
5481*53ee8cc1Swenshuai.xi // Is it the expected marker? If not, something bad happened.
5482*53ee8cc1Swenshuai.xi if ( c != ( _u16Next_restart_num + E_JPEG_RST0 ) )
5483*53ee8cc1Swenshuai.xi {
5484*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5485*53ee8cc1Swenshuai.xi return FALSE;
5486*53ee8cc1Swenshuai.xi }
5487*53ee8cc1Swenshuai.xi
5488*53ee8cc1Swenshuai.xi // Reset each component's DC prediction values.
5489*53ee8cc1Swenshuai.xi JPEG_memset((void *)&_u32Last_dc_val, 0, _u8Comps_in_frame * sizeof( MS_U32 ) );
5490*53ee8cc1Swenshuai.xi
5491*53ee8cc1Swenshuai.xi _u32EOB_run = 0;
5492*53ee8cc1Swenshuai.xi
5493*53ee8cc1Swenshuai.xi _u16Restarts_left = _u16Restart_interval;
5494*53ee8cc1Swenshuai.xi
5495*53ee8cc1Swenshuai.xi _u16Next_restart_num = ( _u16Next_restart_num + 1 ) & 7;
5496*53ee8cc1Swenshuai.xi
5497*53ee8cc1Swenshuai.xi // Get the bit buffer going again...
5498*53ee8cc1Swenshuai.xi {
5499*53ee8cc1Swenshuai.xi _s16Bits_left = 16;
5500*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5501*53ee8cc1Swenshuai.xi JPEG_get_bits_2( 16 );
5502*53ee8cc1Swenshuai.xi }
5503*53ee8cc1Swenshuai.xi return TRUE;
5504*53ee8cc1Swenshuai.xi }
5505*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5506*53ee8cc1Swenshuai.xi // The following methods decode the various types of blocks encountered
5507*53ee8cc1Swenshuai.xi // in progressively encoded images.
JPEG_decode_block_dc_first(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5508*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_dc_first(//JPEG_DECODER *Pd,
5509*53ee8cc1Swenshuai.xi MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5510*53ee8cc1Swenshuai.xi {
5511*53ee8cc1Swenshuai.xi MS_S32 s, r;
5512*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( _DC_Coeffs[component_id], block_x, block_y );
5513*53ee8cc1Swenshuai.xi
5514*53ee8cc1Swenshuai.xi if(p == NULL)
5515*53ee8cc1Swenshuai.xi {
5516*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5517*53ee8cc1Swenshuai.xi return FALSE;
5518*53ee8cc1Swenshuai.xi }
5519*53ee8cc1Swenshuai.xi
5520*53ee8cc1Swenshuai.xi s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_dc_tab[component_id]] );
5521*53ee8cc1Swenshuai.xi if ( s != 0 )
5522*53ee8cc1Swenshuai.xi {
5523*53ee8cc1Swenshuai.xi r = JPEG_get_bits_2( s );
5524*53ee8cc1Swenshuai.xi s = HUFF_EXTEND_P( r, s );
5525*53ee8cc1Swenshuai.xi }
5526*53ee8cc1Swenshuai.xi
5527*53ee8cc1Swenshuai.xi // In JPD mode, the DC coefficient is the difference of nearest DC
5528*53ee8cc1Swenshuai.xi _u32Last_dc_val[component_id] = ( s += _u32Last_dc_val[component_id] );
5529*53ee8cc1Swenshuai.xi
5530*53ee8cc1Swenshuai.xi p[0] = s << _u8Successive_low;
5531*53ee8cc1Swenshuai.xi return TRUE;
5532*53ee8cc1Swenshuai.xi }
5533*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_decode_block_dc_refine(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5534*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_dc_refine(//JPEG_DECODER *Pd,
5535*53ee8cc1Swenshuai.xi MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5536*53ee8cc1Swenshuai.xi {
5537*53ee8cc1Swenshuai.xi if ( JPEG_get_bits_2( 1 ) )
5538*53ee8cc1Swenshuai.xi {
5539*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( _DC_Coeffs[component_id], block_x, block_y );
5540*53ee8cc1Swenshuai.xi
5541*53ee8cc1Swenshuai.xi if(p == NULL)
5542*53ee8cc1Swenshuai.xi {
5543*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5544*53ee8cc1Swenshuai.xi return FALSE;
5545*53ee8cc1Swenshuai.xi }
5546*53ee8cc1Swenshuai.xi
5547*53ee8cc1Swenshuai.xi p[0] |= ( 1 << _u8Successive_low );
5548*53ee8cc1Swenshuai.xi }
5549*53ee8cc1Swenshuai.xi return TRUE;
5550*53ee8cc1Swenshuai.xi }
5551*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_decode_block_ac_first(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5552*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_ac_first(//JPEG_DECODER *Pd,
5553*53ee8cc1Swenshuai.xi MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5554*53ee8cc1Swenshuai.xi {
5555*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p;
5556*53ee8cc1Swenshuai.xi MS_S32 k, s, r;
5557*53ee8cc1Swenshuai.xi
5558*53ee8cc1Swenshuai.xi if ( _u32EOB_run )
5559*53ee8cc1Swenshuai.xi {
5560*53ee8cc1Swenshuai.xi _u32EOB_run--;
5561*53ee8cc1Swenshuai.xi return TRUE;
5562*53ee8cc1Swenshuai.xi }
5563*53ee8cc1Swenshuai.xi
5564*53ee8cc1Swenshuai.xi p = JPEG_coeff_buf_getp( _AC_Coeffs[component_id], block_x, block_y );
5565*53ee8cc1Swenshuai.xi
5566*53ee8cc1Swenshuai.xi if(p == NULL)
5567*53ee8cc1Swenshuai.xi {
5568*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5569*53ee8cc1Swenshuai.xi return FALSE;
5570*53ee8cc1Swenshuai.xi }
5571*53ee8cc1Swenshuai.xi
5572*53ee8cc1Swenshuai.xi for ( k = _u8Spectral_start; k <= _u8Spectral_end; k++ )
5573*53ee8cc1Swenshuai.xi {
5574*53ee8cc1Swenshuai.xi s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_ac_tab[component_id]] );
5575*53ee8cc1Swenshuai.xi
5576*53ee8cc1Swenshuai.xi r = s >> 4;
5577*53ee8cc1Swenshuai.xi s &= 15;
5578*53ee8cc1Swenshuai.xi
5579*53ee8cc1Swenshuai.xi if ( s )
5580*53ee8cc1Swenshuai.xi {
5581*53ee8cc1Swenshuai.xi k += r;
5582*53ee8cc1Swenshuai.xi if ( k > 63 )
5583*53ee8cc1Swenshuai.xi {
5584*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
5585*53ee8cc1Swenshuai.xi return FALSE;
5586*53ee8cc1Swenshuai.xi }
5587*53ee8cc1Swenshuai.xi
5588*53ee8cc1Swenshuai.xi r = JPEG_get_bits_2( s );
5589*53ee8cc1Swenshuai.xi s = HUFF_EXTEND_P( r, s );
5590*53ee8cc1Swenshuai.xi
5591*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
5592*53ee8cc1Swenshuai.xi #ifdef CMODEL
5593*53ee8cc1Swenshuai.xi //p[_u8ZAG[k]] = s << _u8Successive_low;
5594*53ee8cc1Swenshuai.xi p[k] = s << _u8Successive_low;
5595*53ee8cc1Swenshuai.xi #else
5596*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5597*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5598*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5599*53ee8cc1Swenshuai.xi {
5600*53ee8cc1Swenshuai.xi p[_u8ZAG[k]] = s << _u8Successive_low;
5601*53ee8cc1Swenshuai.xi }
5602*53ee8cc1Swenshuai.xi else
5603*53ee8cc1Swenshuai.xi #endif
5604*53ee8cc1Swenshuai.xi {
5605*53ee8cc1Swenshuai.xi p[k] = s << _u8Successive_low;
5606*53ee8cc1Swenshuai.xi }
5607*53ee8cc1Swenshuai.xi #endif
5608*53ee8cc1Swenshuai.xi }
5609*53ee8cc1Swenshuai.xi else
5610*53ee8cc1Swenshuai.xi {
5611*53ee8cc1Swenshuai.xi if ( r == 15 )
5612*53ee8cc1Swenshuai.xi {
5613*53ee8cc1Swenshuai.xi k += 15;
5614*53ee8cc1Swenshuai.xi if ( k > 63 )
5615*53ee8cc1Swenshuai.xi {
5616*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
5617*53ee8cc1Swenshuai.xi return FALSE;
5618*53ee8cc1Swenshuai.xi }
5619*53ee8cc1Swenshuai.xi }
5620*53ee8cc1Swenshuai.xi else
5621*53ee8cc1Swenshuai.xi {
5622*53ee8cc1Swenshuai.xi _u32EOB_run = 1 << r;
5623*53ee8cc1Swenshuai.xi
5624*53ee8cc1Swenshuai.xi if ( r )
5625*53ee8cc1Swenshuai.xi {
5626*53ee8cc1Swenshuai.xi _u32EOB_run += JPEG_get_bits_2( r );
5627*53ee8cc1Swenshuai.xi }
5628*53ee8cc1Swenshuai.xi
5629*53ee8cc1Swenshuai.xi _u32EOB_run--;
5630*53ee8cc1Swenshuai.xi
5631*53ee8cc1Swenshuai.xi break;
5632*53ee8cc1Swenshuai.xi }
5633*53ee8cc1Swenshuai.xi }
5634*53ee8cc1Swenshuai.xi }
5635*53ee8cc1Swenshuai.xi return TRUE;
5636*53ee8cc1Swenshuai.xi }
5637*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_decode_block_ac_refine(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5638*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_block_ac_refine(//JPEG_DECODER *Pd,
5639*53ee8cc1Swenshuai.xi MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5640*53ee8cc1Swenshuai.xi {
5641*53ee8cc1Swenshuai.xi MS_S32 s, k, r;
5642*53ee8cc1Swenshuai.xi MS_S32 p1 = 1 << _u8Successive_low;
5643*53ee8cc1Swenshuai.xi MS_S32 m1 = ( -1 ) << _u8Successive_low;
5644*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( _AC_Coeffs[component_id], block_x, block_y );
5645*53ee8cc1Swenshuai.xi
5646*53ee8cc1Swenshuai.xi if(p == NULL)
5647*53ee8cc1Swenshuai.xi {
5648*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5649*53ee8cc1Swenshuai.xi return FALSE;
5650*53ee8cc1Swenshuai.xi }
5651*53ee8cc1Swenshuai.xi
5652*53ee8cc1Swenshuai.xi k = _u8Spectral_start;
5653*53ee8cc1Swenshuai.xi
5654*53ee8cc1Swenshuai.xi if ( _u32EOB_run == 0 )
5655*53ee8cc1Swenshuai.xi {
5656*53ee8cc1Swenshuai.xi for ( ; (k <= _u8Spectral_end) && ( k < 64 ); k++ )
5657*53ee8cc1Swenshuai.xi {
5658*53ee8cc1Swenshuai.xi s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_ac_tab[component_id]] );
5659*53ee8cc1Swenshuai.xi
5660*53ee8cc1Swenshuai.xi r = s >> 4;
5661*53ee8cc1Swenshuai.xi s &= 15;
5662*53ee8cc1Swenshuai.xi
5663*53ee8cc1Swenshuai.xi if ( s )
5664*53ee8cc1Swenshuai.xi {
5665*53ee8cc1Swenshuai.xi if ( s != 1 )
5666*53ee8cc1Swenshuai.xi {
5667*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
5668*53ee8cc1Swenshuai.xi return FALSE;
5669*53ee8cc1Swenshuai.xi }
5670*53ee8cc1Swenshuai.xi
5671*53ee8cc1Swenshuai.xi if ( JPEG_get_bits_2( 1 ) )
5672*53ee8cc1Swenshuai.xi {
5673*53ee8cc1Swenshuai.xi s = p1;
5674*53ee8cc1Swenshuai.xi }
5675*53ee8cc1Swenshuai.xi else
5676*53ee8cc1Swenshuai.xi {
5677*53ee8cc1Swenshuai.xi s = m1;
5678*53ee8cc1Swenshuai.xi }
5679*53ee8cc1Swenshuai.xi }
5680*53ee8cc1Swenshuai.xi else
5681*53ee8cc1Swenshuai.xi {
5682*53ee8cc1Swenshuai.xi if ( r != 15 )
5683*53ee8cc1Swenshuai.xi {
5684*53ee8cc1Swenshuai.xi _u32EOB_run = 1 << r;
5685*53ee8cc1Swenshuai.xi
5686*53ee8cc1Swenshuai.xi if ( r )
5687*53ee8cc1Swenshuai.xi {
5688*53ee8cc1Swenshuai.xi _u32EOB_run += JPEG_get_bits_2( r );
5689*53ee8cc1Swenshuai.xi }
5690*53ee8cc1Swenshuai.xi
5691*53ee8cc1Swenshuai.xi break;
5692*53ee8cc1Swenshuai.xi }
5693*53ee8cc1Swenshuai.xi }
5694*53ee8cc1Swenshuai.xi
5695*53ee8cc1Swenshuai.xi do
5696*53ee8cc1Swenshuai.xi {
5697*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
5698*53ee8cc1Swenshuai.xi #ifdef CMODEL
5699*53ee8cc1Swenshuai.xi //JPEG_BLOCK_TYPE *this_coef = p + _u8ZAG[k];
5700*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *this_coef = p + k;
5701*53ee8cc1Swenshuai.xi #else
5702*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *this_coef;
5703*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5704*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5705*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5706*53ee8cc1Swenshuai.xi {
5707*53ee8cc1Swenshuai.xi this_coef = p + _u8ZAG[k];
5708*53ee8cc1Swenshuai.xi }
5709*53ee8cc1Swenshuai.xi else
5710*53ee8cc1Swenshuai.xi #endif
5711*53ee8cc1Swenshuai.xi {
5712*53ee8cc1Swenshuai.xi this_coef = p + k;
5713*53ee8cc1Swenshuai.xi }
5714*53ee8cc1Swenshuai.xi #endif
5715*53ee8cc1Swenshuai.xi
5716*53ee8cc1Swenshuai.xi if ( *this_coef != 0 )
5717*53ee8cc1Swenshuai.xi {
5718*53ee8cc1Swenshuai.xi if ( JPEG_get_bits_2( 1 ) )
5719*53ee8cc1Swenshuai.xi {
5720*53ee8cc1Swenshuai.xi if ( ( *this_coef & p1 ) == 0 )
5721*53ee8cc1Swenshuai.xi {
5722*53ee8cc1Swenshuai.xi if ( *this_coef >= 0 )
5723*53ee8cc1Swenshuai.xi {
5724*53ee8cc1Swenshuai.xi *this_coef += p1;
5725*53ee8cc1Swenshuai.xi }
5726*53ee8cc1Swenshuai.xi else
5727*53ee8cc1Swenshuai.xi {
5728*53ee8cc1Swenshuai.xi *this_coef += m1;
5729*53ee8cc1Swenshuai.xi }
5730*53ee8cc1Swenshuai.xi }
5731*53ee8cc1Swenshuai.xi }
5732*53ee8cc1Swenshuai.xi }
5733*53ee8cc1Swenshuai.xi else
5734*53ee8cc1Swenshuai.xi {
5735*53ee8cc1Swenshuai.xi if ( --r < 0 )
5736*53ee8cc1Swenshuai.xi {
5737*53ee8cc1Swenshuai.xi break;
5738*53ee8cc1Swenshuai.xi }
5739*53ee8cc1Swenshuai.xi }
5740*53ee8cc1Swenshuai.xi
5741*53ee8cc1Swenshuai.xi k++;
5742*53ee8cc1Swenshuai.xi }
5743*53ee8cc1Swenshuai.xi while ( (k <= _u8Spectral_end) && ( k < 64 ) );
5744*53ee8cc1Swenshuai.xi
5745*53ee8cc1Swenshuai.xi if ( ( s ) && ( k < 64 ) )
5746*53ee8cc1Swenshuai.xi {
5747*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
5748*53ee8cc1Swenshuai.xi #ifdef CMODEL
5749*53ee8cc1Swenshuai.xi //p[_u8ZAG[k]] = s;
5750*53ee8cc1Swenshuai.xi p[k] = s;
5751*53ee8cc1Swenshuai.xi #else
5752*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5753*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5754*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5755*53ee8cc1Swenshuai.xi {
5756*53ee8cc1Swenshuai.xi p[_u8ZAG[k]] = s;
5757*53ee8cc1Swenshuai.xi }
5758*53ee8cc1Swenshuai.xi else
5759*53ee8cc1Swenshuai.xi #endif
5760*53ee8cc1Swenshuai.xi {
5761*53ee8cc1Swenshuai.xi p[k] = s;
5762*53ee8cc1Swenshuai.xi }
5763*53ee8cc1Swenshuai.xi #endif
5764*53ee8cc1Swenshuai.xi }
5765*53ee8cc1Swenshuai.xi }
5766*53ee8cc1Swenshuai.xi }
5767*53ee8cc1Swenshuai.xi
5768*53ee8cc1Swenshuai.xi if ( _u32EOB_run > 0 )
5769*53ee8cc1Swenshuai.xi {
5770*53ee8cc1Swenshuai.xi for ( ; (k <= _u8Spectral_end) && ( k < 64 ); k++ )
5771*53ee8cc1Swenshuai.xi {
5772*53ee8cc1Swenshuai.xi // No need to do ZAG order in JPD mode
5773*53ee8cc1Swenshuai.xi #ifdef CMODEL
5774*53ee8cc1Swenshuai.xi //JPEG_BLOCK_TYPE *this_coef = p + _u8ZAG[k];
5775*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *this_coef = p + k;
5776*53ee8cc1Swenshuai.xi #else
5777*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *this_coef;
5778*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
5779*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
5780*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
5781*53ee8cc1Swenshuai.xi {
5782*53ee8cc1Swenshuai.xi this_coef = p + _u8ZAG[k];
5783*53ee8cc1Swenshuai.xi }
5784*53ee8cc1Swenshuai.xi else
5785*53ee8cc1Swenshuai.xi #endif
5786*53ee8cc1Swenshuai.xi {
5787*53ee8cc1Swenshuai.xi this_coef = p + k;
5788*53ee8cc1Swenshuai.xi }
5789*53ee8cc1Swenshuai.xi #endif
5790*53ee8cc1Swenshuai.xi
5791*53ee8cc1Swenshuai.xi if ( *this_coef != 0 )
5792*53ee8cc1Swenshuai.xi {
5793*53ee8cc1Swenshuai.xi if ( JPEG_get_bits_2( 1 ) )
5794*53ee8cc1Swenshuai.xi {
5795*53ee8cc1Swenshuai.xi if ( ( *this_coef & p1 ) == 0 )
5796*53ee8cc1Swenshuai.xi {
5797*53ee8cc1Swenshuai.xi if ( *this_coef >= 0 )
5798*53ee8cc1Swenshuai.xi {
5799*53ee8cc1Swenshuai.xi *this_coef += p1;
5800*53ee8cc1Swenshuai.xi }
5801*53ee8cc1Swenshuai.xi else
5802*53ee8cc1Swenshuai.xi {
5803*53ee8cc1Swenshuai.xi *this_coef += m1;
5804*53ee8cc1Swenshuai.xi }
5805*53ee8cc1Swenshuai.xi }
5806*53ee8cc1Swenshuai.xi }
5807*53ee8cc1Swenshuai.xi }
5808*53ee8cc1Swenshuai.xi }
5809*53ee8cc1Swenshuai.xi
5810*53ee8cc1Swenshuai.xi _u32EOB_run--;
5811*53ee8cc1Swenshuai.xi }
5812*53ee8cc1Swenshuai.xi return TRUE;
5813*53ee8cc1Swenshuai.xi }
5814*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5815*53ee8cc1Swenshuai.xi // Decode a scan in a progressively encoded image.
JPEG_decode_scan(Pdecode_block_func decode_block_func)5816*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_scan(Pdecode_block_func decode_block_func)
5817*53ee8cc1Swenshuai.xi {
5818*53ee8cc1Swenshuai.xi MS_U16 mcu_row, mcu_col, mcu_block;
5819*53ee8cc1Swenshuai.xi MS_U32 block_x_mcu[JPEG_MAXCOMPONENTS], block_y_mcu[JPEG_MAXCOMPONENTS];
5820*53ee8cc1Swenshuai.xi
5821*53ee8cc1Swenshuai.xi JPEG_memset((void *)block_y_mcu, 0, sizeof( block_y_mcu ) );
5822*53ee8cc1Swenshuai.xi
5823*53ee8cc1Swenshuai.xi for ( mcu_col = 0; mcu_col < _u16Mcus_per_col; mcu_col++ )
5824*53ee8cc1Swenshuai.xi {
5825*53ee8cc1Swenshuai.xi int component_num, component_id;
5826*53ee8cc1Swenshuai.xi
5827*53ee8cc1Swenshuai.xi JPEG_memset((void *)block_x_mcu, 0, sizeof( block_x_mcu ) );
5828*53ee8cc1Swenshuai.xi
5829*53ee8cc1Swenshuai.xi for ( mcu_row = 0; mcu_row < _u16Mcus_per_row; mcu_row++ )
5830*53ee8cc1Swenshuai.xi {
5831*53ee8cc1Swenshuai.xi MS_U8 block_x_mcu_ofs = 0, block_y_mcu_ofs = 0;
5832*53ee8cc1Swenshuai.xi
5833*53ee8cc1Swenshuai.xi if ( ( _u16Restart_interval ) && ( _u16Restarts_left == 0 ) )
5834*53ee8cc1Swenshuai.xi {
5835*53ee8cc1Swenshuai.xi if(!JPEG_process_restart())
5836*53ee8cc1Swenshuai.xi return FALSE;
5837*53ee8cc1Swenshuai.xi }
5838*53ee8cc1Swenshuai.xi
5839*53ee8cc1Swenshuai.xi for ( mcu_block = 0; mcu_block < _u8Blocks_per_mcu; mcu_block++ )
5840*53ee8cc1Swenshuai.xi {
5841*53ee8cc1Swenshuai.xi component_id = _u8Mcu_org[mcu_block];
5842*53ee8cc1Swenshuai.xi
5843*53ee8cc1Swenshuai.xi if(!decode_block_func( component_id, block_x_mcu[component_id] + block_x_mcu_ofs, block_y_mcu[component_id] + block_y_mcu_ofs ))
5844*53ee8cc1Swenshuai.xi {
5845*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5846*53ee8cc1Swenshuai.xi return FALSE;
5847*53ee8cc1Swenshuai.xi }
5848*53ee8cc1Swenshuai.xi
5849*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
5850*53ee8cc1Swenshuai.xi {
5851*53ee8cc1Swenshuai.xi block_x_mcu[component_id]++;
5852*53ee8cc1Swenshuai.xi }
5853*53ee8cc1Swenshuai.xi else
5854*53ee8cc1Swenshuai.xi {
5855*53ee8cc1Swenshuai.xi if ( ++block_x_mcu_ofs == _u8Comp_h_samp[component_id] )
5856*53ee8cc1Swenshuai.xi {
5857*53ee8cc1Swenshuai.xi block_x_mcu_ofs = 0;
5858*53ee8cc1Swenshuai.xi
5859*53ee8cc1Swenshuai.xi if ( ++block_y_mcu_ofs == _u8Comp_v_samp[component_id] )
5860*53ee8cc1Swenshuai.xi {
5861*53ee8cc1Swenshuai.xi block_y_mcu_ofs = 0;
5862*53ee8cc1Swenshuai.xi
5863*53ee8cc1Swenshuai.xi block_x_mcu[component_id] += _u8Comp_h_samp[component_id];
5864*53ee8cc1Swenshuai.xi }
5865*53ee8cc1Swenshuai.xi }
5866*53ee8cc1Swenshuai.xi }
5867*53ee8cc1Swenshuai.xi }
5868*53ee8cc1Swenshuai.xi
5869*53ee8cc1Swenshuai.xi _u16Restarts_left--;
5870*53ee8cc1Swenshuai.xi }
5871*53ee8cc1Swenshuai.xi
5872*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
5873*53ee8cc1Swenshuai.xi {
5874*53ee8cc1Swenshuai.xi block_y_mcu[_u8Comp_list[0]]++;
5875*53ee8cc1Swenshuai.xi }
5876*53ee8cc1Swenshuai.xi else
5877*53ee8cc1Swenshuai.xi {
5878*53ee8cc1Swenshuai.xi for ( component_num = 0; component_num < _u8Comps_in_scan; component_num++ )
5879*53ee8cc1Swenshuai.xi {
5880*53ee8cc1Swenshuai.xi component_id = _u8Comp_list[component_num];
5881*53ee8cc1Swenshuai.xi
5882*53ee8cc1Swenshuai.xi block_y_mcu[component_id] += _u8Comp_v_samp[component_id];
5883*53ee8cc1Swenshuai.xi }
5884*53ee8cc1Swenshuai.xi }
5885*53ee8cc1Swenshuai.xi }
5886*53ee8cc1Swenshuai.xi return TRUE;
5887*53ee8cc1Swenshuai.xi }
5888*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5889*53ee8cc1Swenshuai.xi // Decode a progressively encoded image.
JPEG_init_progressive(void)5890*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_progressive(void)
5891*53ee8cc1Swenshuai.xi {
5892*53ee8cc1Swenshuai.xi MS_U8 i;
5893*53ee8cc1Swenshuai.xi
5894*53ee8cc1Swenshuai.xi if ( _u8Comps_in_frame == 4 )
5895*53ee8cc1Swenshuai.xi {
5896*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5897*53ee8cc1Swenshuai.xi return FALSE;
5898*53ee8cc1Swenshuai.xi }
5899*53ee8cc1Swenshuai.xi
5900*53ee8cc1Swenshuai.xi // Allocate the coefficient buffers.
5901*53ee8cc1Swenshuai.xi for ( i = 0; i < _u8Comps_in_frame; i++ )
5902*53ee8cc1Swenshuai.xi {
5903*53ee8cc1Swenshuai.xi _DC_Coeffs[i] = JPEG_coeff_buf_open( ((gu16Max_mcus_per_row+0x1)& ~0x1) * _u8Comp_h_samp[i], ((_u16Max_mcus_per_col+0x1)& ~0x1) * _u8Comp_v_samp[i], 1, 1 );
5904*53ee8cc1Swenshuai.xi if(_DC_Coeffs[i] == NULL)
5905*53ee8cc1Swenshuai.xi {
5906*53ee8cc1Swenshuai.xi return FALSE;
5907*53ee8cc1Swenshuai.xi }
5908*53ee8cc1Swenshuai.xi
5909*53ee8cc1Swenshuai.xi _AC_Coeffs[i] = JPEG_coeff_buf_open( ((gu16Max_mcus_per_row+0x1)& ~0x1) * _u8Comp_h_samp[i], ((_u16Max_mcus_per_col+0x1)& ~0x1) * _u8Comp_v_samp[i], 8, 8 );
5910*53ee8cc1Swenshuai.xi if(_AC_Coeffs[i] == NULL)
5911*53ee8cc1Swenshuai.xi {
5912*53ee8cc1Swenshuai.xi return FALSE;
5913*53ee8cc1Swenshuai.xi }
5914*53ee8cc1Swenshuai.xi }
5915*53ee8cc1Swenshuai.xi
5916*53ee8cc1Swenshuai.xi for ( ; ; )
5917*53ee8cc1Swenshuai.xi {
5918*53ee8cc1Swenshuai.xi MS_BOOL dc_only_scan, refinement_scan;
5919*53ee8cc1Swenshuai.xi Pdecode_block_func decode_block_func;
5920*53ee8cc1Swenshuai.xi
5921*53ee8cc1Swenshuai.xi if (!JPEG_init_scan())
5922*53ee8cc1Swenshuai.xi {
5923*53ee8cc1Swenshuai.xi break;
5924*53ee8cc1Swenshuai.xi }
5925*53ee8cc1Swenshuai.xi
5926*53ee8cc1Swenshuai.xi dc_only_scan = ( _u8Spectral_start == 0 );
5927*53ee8cc1Swenshuai.xi refinement_scan = ( _u8Successive_high != 0 );
5928*53ee8cc1Swenshuai.xi
5929*53ee8cc1Swenshuai.xi if ( ( _u8Spectral_start > _u8Spectral_end ) || ( _u8Spectral_end > 63 ) )
5930*53ee8cc1Swenshuai.xi {
5931*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5932*53ee8cc1Swenshuai.xi return FALSE;
5933*53ee8cc1Swenshuai.xi }
5934*53ee8cc1Swenshuai.xi
5935*53ee8cc1Swenshuai.xi if ( dc_only_scan )
5936*53ee8cc1Swenshuai.xi {
5937*53ee8cc1Swenshuai.xi if ( _u8Spectral_end )
5938*53ee8cc1Swenshuai.xi {
5939*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5940*53ee8cc1Swenshuai.xi return FALSE;
5941*53ee8cc1Swenshuai.xi }
5942*53ee8cc1Swenshuai.xi }
5943*53ee8cc1Swenshuai.xi else if ( _u8Comps_in_scan != 1 ) /* AC scans can only contain one component */
5944*53ee8cc1Swenshuai.xi {
5945*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5946*53ee8cc1Swenshuai.xi return FALSE;
5947*53ee8cc1Swenshuai.xi }
5948*53ee8cc1Swenshuai.xi
5949*53ee8cc1Swenshuai.xi if ( ( refinement_scan ) && ( _u8Successive_low != _u8Successive_high - 1 ) )
5950*53ee8cc1Swenshuai.xi {
5951*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_SOS_SUCCESSIVE );
5952*53ee8cc1Swenshuai.xi return FALSE;
5953*53ee8cc1Swenshuai.xi }
5954*53ee8cc1Swenshuai.xi
5955*53ee8cc1Swenshuai.xi if ( dc_only_scan )
5956*53ee8cc1Swenshuai.xi {
5957*53ee8cc1Swenshuai.xi if ( refinement_scan )
5958*53ee8cc1Swenshuai.xi {
5959*53ee8cc1Swenshuai.xi decode_block_func = JPEG_decode_block_dc_refine;
5960*53ee8cc1Swenshuai.xi }
5961*53ee8cc1Swenshuai.xi else
5962*53ee8cc1Swenshuai.xi {
5963*53ee8cc1Swenshuai.xi decode_block_func = JPEG_decode_block_dc_first;
5964*53ee8cc1Swenshuai.xi }
5965*53ee8cc1Swenshuai.xi }
5966*53ee8cc1Swenshuai.xi else
5967*53ee8cc1Swenshuai.xi {
5968*53ee8cc1Swenshuai.xi if ( refinement_scan )
5969*53ee8cc1Swenshuai.xi {
5970*53ee8cc1Swenshuai.xi decode_block_func = JPEG_decode_block_ac_refine;
5971*53ee8cc1Swenshuai.xi }
5972*53ee8cc1Swenshuai.xi else
5973*53ee8cc1Swenshuai.xi {
5974*53ee8cc1Swenshuai.xi decode_block_func = JPEG_decode_block_ac_first;
5975*53ee8cc1Swenshuai.xi }
5976*53ee8cc1Swenshuai.xi }
5977*53ee8cc1Swenshuai.xi
5978*53ee8cc1Swenshuai.xi if(!JPEG_decode_scan( decode_block_func ))
5979*53ee8cc1Swenshuai.xi return FALSE;
5980*53ee8cc1Swenshuai.xi
5981*53ee8cc1Swenshuai.xi _s16Bits_left = 0;
5982*53ee8cc1Swenshuai.xi }
5983*53ee8cc1Swenshuai.xi
5984*53ee8cc1Swenshuai.xi _u8Comps_in_scan = _u8Comps_in_frame;
5985*53ee8cc1Swenshuai.xi
5986*53ee8cc1Swenshuai.xi for ( i = 0; i < _u8Comps_in_frame; i++ )
5987*53ee8cc1Swenshuai.xi {
5988*53ee8cc1Swenshuai.xi _u8Comp_list[i] = i;
5989*53ee8cc1Swenshuai.xi }
5990*53ee8cc1Swenshuai.xi
5991*53ee8cc1Swenshuai.xi JPEG_calc_mcu_block_order();
5992*53ee8cc1Swenshuai.xi return TRUE;
5993*53ee8cc1Swenshuai.xi }
5994*53ee8cc1Swenshuai.xi #endif
5995*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_init_sequential(void)5996*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_init_sequential(void)
5997*53ee8cc1Swenshuai.xi {
5998*53ee8cc1Swenshuai.xi if ( !JPEG_init_scan() )
5999*53ee8cc1Swenshuai.xi {
6000*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("JPEG_init_scan - E_JPEG_UNEXPECTED_MARKER\n");
6001*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
6002*53ee8cc1Swenshuai.xi return FALSE;
6003*53ee8cc1Swenshuai.xi }
6004*53ee8cc1Swenshuai.xi return TRUE;
6005*53ee8cc1Swenshuai.xi }
6006*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6007*53ee8cc1Swenshuai.xi #if 0
6008*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_decode_start(void)
6009*53ee8cc1Swenshuai.xi {
6010*53ee8cc1Swenshuai.xi JPEG_init_frame();
6011*53ee8cc1Swenshuai.xi
6012*53ee8cc1Swenshuai.xi if ( _bProgressive_flag )
6013*53ee8cc1Swenshuai.xi {
6014*53ee8cc1Swenshuai.xi JPEG_init_progressive();
6015*53ee8cc1Swenshuai.xi }
6016*53ee8cc1Swenshuai.xi else
6017*53ee8cc1Swenshuai.xi {
6018*53ee8cc1Swenshuai.xi JPEG_init_sequential();
6019*53ee8cc1Swenshuai.xi }
6020*53ee8cc1Swenshuai.xi }
6021*53ee8cc1Swenshuai.xi #endif
6022*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6023*53ee8cc1Swenshuai.xi // Find the start of the JPEG file and reads enough data to determine
6024*53ee8cc1Swenshuai.xi // its size, number of components, etc.
JPEG_decode_init(void)6025*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_decode_init(void)
6026*53ee8cc1Swenshuai.xi {
6027*53ee8cc1Swenshuai.xi MS_U16 pic_width, pic_height;
6028*53ee8cc1Swenshuai.xi
6029*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6030*53ee8cc1Swenshuai.xi
6031*53ee8cc1Swenshuai.xi _HeadCheck.result = 0;
6032*53ee8cc1Swenshuai.xi
6033*53ee8cc1Swenshuai.xi if(!JPEG_init())
6034*53ee8cc1Swenshuai.xi return FALSE;
6035*53ee8cc1Swenshuai.xi
6036*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
6037*53ee8cc1Swenshuai.xi _pu8In_buf_ofs = _pu8In_buf_MPO_ofs;
6038*53ee8cc1Swenshuai.xi _u32In_buf_left = _u32In_buf_MPO_left;
6039*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_decode_init(), set _pu8In_buf_ofs=0x%lx, _u32In_buf_left=0x%lx========\n", (MS_U32)_pu8In_buf_ofs, (MS_U32)_u32In_buf_left);
6040*53ee8cc1Swenshuai.xi #endif
6041*53ee8cc1Swenshuai.xi
6042*53ee8cc1Swenshuai.xi if(!JPEG_locate_sof_marker())
6043*53ee8cc1Swenshuai.xi return FALSE;
6044*53ee8cc1Swenshuai.xi
6045*53ee8cc1Swenshuai.xi if (bMHEG5)
6046*53ee8cc1Swenshuai.xi {
6047*53ee8cc1Swenshuai.xi if(_Error_code == E_JPEG_UNSUPPORTED_MARKER)
6048*53ee8cc1Swenshuai.xi {
6049*53ee8cc1Swenshuai.xi return TRUE;
6050*53ee8cc1Swenshuai.xi }
6051*53ee8cc1Swenshuai.xi }
6052*53ee8cc1Swenshuai.xi
6053*53ee8cc1Swenshuai.xi if(_u8DecodeType == E_JPEG_TYPE_THUMBNAIL)
6054*53ee8cc1Swenshuai.xi {
6055*53ee8cc1Swenshuai.xi if(_bThumbnailFound)
6056*53ee8cc1Swenshuai.xi {
6057*53ee8cc1Swenshuai.xi _bThumbnailAccessMode = TRUE;
6058*53ee8cc1Swenshuai.xi ////MApi_JPEG_Finalize(); //replace with JPEG_free_all_blocks()
6059*53ee8cc1Swenshuai.xi JPEG_free_all_blocks();
6060*53ee8cc1Swenshuai.xi
6061*53ee8cc1Swenshuai.xi if(!JPEG_init())
6062*53ee8cc1Swenshuai.xi return FALSE;
6063*53ee8cc1Swenshuai.xi
6064*53ee8cc1Swenshuai.xi // save the original image size, because msAPI_JPEG_init will reset all variables to 0
6065*53ee8cc1Swenshuai.xi if(!JPEG_locate_sof_marker())
6066*53ee8cc1Swenshuai.xi return FALSE;
6067*53ee8cc1Swenshuai.xi
6068*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6069*53ee8cc1Swenshuai.xi {
6070*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Progressive image in thumbnail... do not handle it\n");
6071*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
6072*53ee8cc1Swenshuai.xi return FALSE;
6073*53ee8cc1Swenshuai.xi }
6074*53ee8cc1Swenshuai.xi }
6075*53ee8cc1Swenshuai.xi else
6076*53ee8cc1Swenshuai.xi {
6077*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NO_THUMBNAIL );
6078*53ee8cc1Swenshuai.xi return FALSE;
6079*53ee8cc1Swenshuai.xi }
6080*53ee8cc1Swenshuai.xi }
6081*53ee8cc1Swenshuai.xi
6082*53ee8cc1Swenshuai.xi // calculate aligned resolution
6083*53ee8cc1Swenshuai.xi JPEG_GetAlignedResolution(&pic_width, &pic_height);
6084*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("pic_width = %d, pic_height = %d\n",pic_width, pic_height);
6085*53ee8cc1Swenshuai.xi
6086*53ee8cc1Swenshuai.xi _u16AlignedImagePitch = pic_width;
6087*53ee8cc1Swenshuai.xi _u16AlignedImagePitch_H = pic_height;
6088*53ee8cc1Swenshuai.xi _u16AlignedImageWidth = _u16Image_x_size;
6089*53ee8cc1Swenshuai.xi _u16AlignedImageHeight = _u16Image_y_size;
6090*53ee8cc1Swenshuai.xi
6091*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
6092*53ee8cc1Swenshuai.xi if(bIsMPOFormat)
6093*53ee8cc1Swenshuai.xi {
6094*53ee8cc1Swenshuai.xi JPEG_PRO_MAX_WIDTH = JPEG_MPO_PRO_MAX_WIDTH;
6095*53ee8cc1Swenshuai.xi JPEG_PRO_MAX_HEIGHT = JPEG_MPO_PRO_MAX_HEIGHT;
6096*53ee8cc1Swenshuai.xi JPEG_MAX_WIDTH = JPEG_MPO_MAX_WIDTH;
6097*53ee8cc1Swenshuai.xi JPEG_MAX_HEIGHT = JPEG_MPO_MAX_HEIGHT;
6098*53ee8cc1Swenshuai.xi }
6099*53ee8cc1Swenshuai.xi #endif
6100*53ee8cc1Swenshuai.xi
6101*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6102*53ee8cc1Swenshuai.xi {
6103*53ee8cc1Swenshuai.xi MAX_JPEG_WIDTH_HD = JPEG_PRO_MAX_WIDTH;
6104*53ee8cc1Swenshuai.xi MAX_JPEG_HEIGHT_HD = JPEG_PRO_MAX_HEIGHT;
6105*53ee8cc1Swenshuai.xi }
6106*53ee8cc1Swenshuai.xi else
6107*53ee8cc1Swenshuai.xi {
6108*53ee8cc1Swenshuai.xi MAX_JPEG_WIDTH_HD = JPEG_MAX_WIDTH;
6109*53ee8cc1Swenshuai.xi MAX_JPEG_HEIGHT_HD = JPEG_MAX_HEIGHT;
6110*53ee8cc1Swenshuai.xi }
6111*53ee8cc1Swenshuai.xi
6112*53ee8cc1Swenshuai.xi #ifndef CMODEL
6113*53ee8cc1Swenshuai.xi // calculate down scale factor
6114*53ee8cc1Swenshuai.xi if ((_u16Image_x_size > MAX_JPEG_WIDTH_HD * 4) || (_u16Image_y_size > MAX_JPEG_HEIGHT_HD * 4))
6115*53ee8cc1Swenshuai.xi {
6116*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/8!!\n");
6117*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_EIGHTH;
6118*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 8;
6119*53ee8cc1Swenshuai.xi }
6120*53ee8cc1Swenshuai.xi else if ((_u16Image_x_size > MAX_JPEG_WIDTH_HD * 2) || (_u16Image_y_size > MAX_JPEG_HEIGHT_HD * 2))
6121*53ee8cc1Swenshuai.xi {
6122*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/4!!\n");
6123*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_FOURTH;
6124*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 4;
6125*53ee8cc1Swenshuai.xi }
6126*53ee8cc1Swenshuai.xi else if ((_u16Image_x_size > MAX_JPEG_WIDTH_HD) || (_u16Image_y_size > MAX_JPEG_HEIGHT_HD))
6127*53ee8cc1Swenshuai.xi {
6128*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/2!!\n");
6129*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_HALF;
6130*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 2;
6131*53ee8cc1Swenshuai.xi }
6132*53ee8cc1Swenshuai.xi else
6133*53ee8cc1Swenshuai.xi {
6134*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/1!!\n");
6135*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
6136*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 1;
6137*53ee8cc1Swenshuai.xi }
6138*53ee8cc1Swenshuai.xi
6139*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_11_JPEGScaleDownFunctionTest_2==true) \
6140*53ee8cc1Swenshuai.xi || (ENABLE_TEST_11_JPEGScaleDownFunctionTest_4==true) \
6141*53ee8cc1Swenshuai.xi || (ENABLE_TEST_11_JPEGScaleDownFunctionTest_8==true)
6142*53ee8cc1Swenshuai.xi //downscale test(only for unit test)
6143*53ee8cc1Swenshuai.xi
6144*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_11_JPEGScaleDownFunctionTest_2==true)
6145*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_HALF;
6146*53ee8cc1Swenshuai.xi #elif (ENABLE_TEST_11_JPEGScaleDownFunctionTest_4==true)
6147*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_FOURTH;
6148*53ee8cc1Swenshuai.xi #elif (ENABLE_TEST_11_JPEGScaleDownFunctionTest_8==true)
6149*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_EIGHTH;
6150*53ee8cc1Swenshuai.xi #else
6151*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
6152*53ee8cc1Swenshuai.xi #endif
6153*53ee8cc1Swenshuai.xi
6154*53ee8cc1Swenshuai.xi if(_u8DownScaleRatio == E_JPD_DOWNSCALE_HALF)
6155*53ee8cc1Swenshuai.xi {
6156*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 2;
6157*53ee8cc1Swenshuai.xi }
6158*53ee8cc1Swenshuai.xi else if(_u8DownScaleRatio == E_JPD_DOWNSCALE_FOURTH)
6159*53ee8cc1Swenshuai.xi {
6160*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 4;
6161*53ee8cc1Swenshuai.xi }
6162*53ee8cc1Swenshuai.xi else if(_u8DownScaleRatio == E_JPD_DOWNSCALE_EIGHTH)
6163*53ee8cc1Swenshuai.xi {
6164*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = 8;
6165*53ee8cc1Swenshuai.xi }
6166*53ee8cc1Swenshuai.xi #endif
6167*53ee8cc1Swenshuai.xi
6168*53ee8cc1Swenshuai.xi if (E_JPD_DOWNSCALE_ORG != _u8DownScaleRatio)
6169*53ee8cc1Swenshuai.xi {
6170*53ee8cc1Swenshuai.xi _u16AlignedImagePitch = pic_width / _u8ScaleDownFactor;
6171*53ee8cc1Swenshuai.xi _u16AlignedImagePitch_H =
6172*53ee8cc1Swenshuai.xi ((pic_height + ((MS_U32)_u8ScaleDownFactor - 1)) & (~((MS_U32)_u8ScaleDownFactor - 1)))/ _u8ScaleDownFactor;
6173*53ee8cc1Swenshuai.xi _u16AlignedImageWidth = _u16Image_x_size / _u8ScaleDownFactor;
6174*53ee8cc1Swenshuai.xi _u16AlignedImageHeight =
6175*53ee8cc1Swenshuai.xi ((_u16AlignedImageHeight + ((MS_U32)_u8ScaleDownFactor - 1)) & (~((MS_U32)_u8ScaleDownFactor - 1))) / _u8ScaleDownFactor;
6176*53ee8cc1Swenshuai.xi }
6177*53ee8cc1Swenshuai.xi
6178*53ee8cc1Swenshuai.xi switch (_u8DownScaleRatio)
6179*53ee8cc1Swenshuai.xi {
6180*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_HALF:
6181*53ee8cc1Swenshuai.xi ROI_width = (pic_width / 16) * 16;
6182*53ee8cc1Swenshuai.xi break;
6183*53ee8cc1Swenshuai.xi
6184*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_FOURTH:
6185*53ee8cc1Swenshuai.xi ROI_width = (pic_width / 32) * 32;
6186*53ee8cc1Swenshuai.xi break;
6187*53ee8cc1Swenshuai.xi
6188*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_EIGHTH:
6189*53ee8cc1Swenshuai.xi ROI_width = (pic_width / 64) * 64;
6190*53ee8cc1Swenshuai.xi break;
6191*53ee8cc1Swenshuai.xi
6192*53ee8cc1Swenshuai.xi default:
6193*53ee8cc1Swenshuai.xi ROI_width = pic_width;
6194*53ee8cc1Swenshuai.xi break;
6195*53ee8cc1Swenshuai.xi }
6196*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Original ROI_width = %d \n", ROI_width);
6197*53ee8cc1Swenshuai.xi
6198*53ee8cc1Swenshuai.xi if (ROI_width != pic_width)
6199*53ee8cc1Swenshuai.xi {
6200*53ee8cc1Swenshuai.xi _u16AlignedImagePitch = _u16AlignedImageWidth = ROI_width / _u8ScaleDownFactor;
6201*53ee8cc1Swenshuai.xi
6202*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6203*53ee8cc1Swenshuai.xi _Progressive_ROI_flag = TRUE;
6204*53ee8cc1Swenshuai.xi }
6205*53ee8cc1Swenshuai.xi #endif //#ifndef CMODEL
6206*53ee8cc1Swenshuai.xi return TRUE;
6207*53ee8cc1Swenshuai.xi }
6208*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI - harold
6209*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6210*53ee8cc1Swenshuai.xi JPEG_STATIC void msAPI_MJPEG_decode_init(PJPEG_FILE_FileSystem_t Pstream)
6211*53ee8cc1Swenshuai.xi {
6212*53ee8cc1Swenshuai.xi JPEG_init( Pstream );
6213*53ee8cc1Swenshuai.xi MSAPI_MJPEG_Get_Pics();
6214*53ee8cc1Swenshuai.xi JPEG_locate_sof_marker();
6215*53ee8cc1Swenshuai.xi
6216*53ee8cc1Swenshuai.xi if(_u8DecodeType == E_JPEG_TYPE_THUMBNAIL)
6217*53ee8cc1Swenshuai.xi {
6218*53ee8cc1Swenshuai.xi if(_bThumbnailFound)
6219*53ee8cc1Swenshuai.xi {
6220*53ee8cc1Swenshuai.xi _bThumbnailAccessMode = TRUE;
6221*53ee8cc1Swenshuai.xi ////MApi_JPEG_Finalize(); //replace with JPEG_free_all_blocks()
6222*53ee8cc1Swenshuai.xi JPEG_free_all_blocks();
6223*53ee8cc1Swenshuai.xi JPEG_init( Pstream );
6224*53ee8cc1Swenshuai.xi
6225*53ee8cc1Swenshuai.xi JPEG_locate_sof_marker();
6226*53ee8cc1Swenshuai.xi
6227*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6228*53ee8cc1Swenshuai.xi {
6229*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Progressive image in thumbnail... do not handle it\n");
6230*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
6231*53ee8cc1Swenshuai.xi }
6232*53ee8cc1Swenshuai.xi }
6233*53ee8cc1Swenshuai.xi else
6234*53ee8cc1Swenshuai.xi {
6235*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_NO_THUMBNAIL );
6236*53ee8cc1Swenshuai.xi }
6237*53ee8cc1Swenshuai.xi }
6238*53ee8cc1Swenshuai.xi }
6239*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6240*53ee8cc1Swenshuai.xi // Parse header of MJPEG to get total num of pics in the file
6241*53ee8cc1Swenshuai.xi JPEG_STATIC void MSAPI_MJPEG_Get_Pics(void)
6242*53ee8cc1Swenshuai.xi {
6243*53ee8cc1Swenshuai.xi //Num of pics located at Byte 49~52, hence we need to offset 48 bytes
6244*53ee8cc1Swenshuai.xi MS_U8 ByteOffset, ByteSkip = 48;
6245*53ee8cc1Swenshuai.xi
6246*53ee8cc1Swenshuai.xi //Total num of pics
6247*53ee8cc1Swenshuai.xi NumPics = 0;
6248*53ee8cc1Swenshuai.xi
6249*53ee8cc1Swenshuai.xi for(ByteOffset = 0; ByteOffset < ByteSkip; ByteOffset++)
6250*53ee8cc1Swenshuai.xi {
6251*53ee8cc1Swenshuai.xi JPEG_get_char();
6252*53ee8cc1Swenshuai.xi }
6253*53ee8cc1Swenshuai.xi
6254*53ee8cc1Swenshuai.xi //Handle Little-Ending
6255*53ee8cc1Swenshuai.xi NumPics += (JPEG_get_char());
6256*53ee8cc1Swenshuai.xi NumPics += (JPEG_get_char() << 8);
6257*53ee8cc1Swenshuai.xi NumPics += (JPEG_get_char() << 16);
6258*53ee8cc1Swenshuai.xi NumPics += (JPEG_get_char() << 24);
6259*53ee8cc1Swenshuai.xi
6260*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("NumPics = %ld\n",NumPics);
6261*53ee8cc1Swenshuai.xi }
6262*53ee8cc1Swenshuai.xi #endif // not implement for new MDDI - harold
6263*53ee8cc1Swenshuai.xi
6264*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
6265*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6266*53ee8cc1Swenshuai.xi // Loads and dequantizes the next row of (already decoded) coefficients.
6267*53ee8cc1Swenshuai.xi // Progressive images only.
JPEG_load_next_row(void)6268*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_load_next_row(void)
6269*53ee8cc1Swenshuai.xi {
6270*53ee8cc1Swenshuai.xi #ifndef CMODEL
6271*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE p[64];
6272*53ee8cc1Swenshuai.xi MS_BOOL EOF_Flag = FALSE; //CL82399
6273*53ee8cc1Swenshuai.xi #else
6274*53ee8cc1Swenshuai.xi MS_S16 i;
6275*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p;
6276*53ee8cc1Swenshuai.xi MS_U16 row_block = 0;
6277*53ee8cc1Swenshuai.xi JPEG_QUANT_TYPE *q;
6278*53ee8cc1Swenshuai.xi #endif
6279*53ee8cc1Swenshuai.xi
6280*53ee8cc1Swenshuai.xi MS_U16 mcu_row, mcu_block;
6281*53ee8cc1Swenshuai.xi MS_U8 component_num, component_id;
6282*53ee8cc1Swenshuai.xi MS_U16 block_x_mcu[JPEG_MAXCOMPONENTS];
6283*53ee8cc1Swenshuai.xi
6284*53ee8cc1Swenshuai.xi JPEG_memset((void *)block_x_mcu, 0, JPEG_MAXCOMPONENTS * sizeof( MS_U16 ) );
6285*53ee8cc1Swenshuai.xi
6286*53ee8cc1Swenshuai.xi for ( mcu_row = 0; mcu_row < _u16Mcus_per_row; mcu_row++ )
6287*53ee8cc1Swenshuai.xi {
6288*53ee8cc1Swenshuai.xi MS_U16 block_x_mcu_ofs = 0, block_y_mcu_ofs = 0;
6289*53ee8cc1Swenshuai.xi
6290*53ee8cc1Swenshuai.xi for ( mcu_block = 0; mcu_block < _u8Blocks_per_mcu; mcu_block++ )
6291*53ee8cc1Swenshuai.xi {
6292*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *pAC;
6293*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *pDC;
6294*53ee8cc1Swenshuai.xi
6295*53ee8cc1Swenshuai.xi component_id = _u8Mcu_org[mcu_block];
6296*53ee8cc1Swenshuai.xi
6297*53ee8cc1Swenshuai.xi #ifdef CMODEL
6298*53ee8cc1Swenshuai.xi p = gps16Block_seg[row_block];
6299*53ee8cc1Swenshuai.xi q = _QuantTables[_u8Comp_quant[component_id]].s16Value;
6300*53ee8cc1Swenshuai.xi #endif
6301*53ee8cc1Swenshuai.xi
6302*53ee8cc1Swenshuai.xi pAC = JPEG_coeff_buf_getp( _AC_Coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, _u32Block_y_mcu[component_id] + block_y_mcu_ofs );
6303*53ee8cc1Swenshuai.xi if(pAC == NULL)
6304*53ee8cc1Swenshuai.xi {
6305*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
6306*53ee8cc1Swenshuai.xi return FALSE;
6307*53ee8cc1Swenshuai.xi }
6308*53ee8cc1Swenshuai.xi
6309*53ee8cc1Swenshuai.xi pDC = JPEG_coeff_buf_getp( _DC_Coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, _u32Block_y_mcu[component_id] + block_y_mcu_ofs );
6310*53ee8cc1Swenshuai.xi if(pDC == NULL)
6311*53ee8cc1Swenshuai.xi {
6312*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
6313*53ee8cc1Swenshuai.xi return FALSE;
6314*53ee8cc1Swenshuai.xi }
6315*53ee8cc1Swenshuai.xi p[0] = pDC[0];
6316*53ee8cc1Swenshuai.xi JPEG_memcpy((void *)&p[1], (void *)&pAC[1], 63 * sizeof( JPEG_BLOCK_TYPE ) );
6317*53ee8cc1Swenshuai.xi
6318*53ee8cc1Swenshuai.xi #ifdef CMODEL //cmodel do not support scale down feature.
6319*53ee8cc1Swenshuai.xi if(mcu_block==(_u8Blocks_per_mcu -1)&&mcu_row==(_u16Mcus_per_row - 1)&&(_u16Total_lines_left - gu8Max_mcu_y_size)==0)
6320*53ee8cc1Swenshuai.xi {
6321*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, TRUE, component_id, TRUE)) // means it is end of picture
6322*53ee8cc1Swenshuai.xi return FALSE;
6323*53ee8cc1Swenshuai.xi }
6324*53ee8cc1Swenshuai.xi else
6325*53ee8cc1Swenshuai.xi {
6326*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6327*53ee8cc1Swenshuai.xi return FALSE;
6328*53ee8cc1Swenshuai.xi }
6329*53ee8cc1Swenshuai.xi #else //CL82399
6330*53ee8cc1Swenshuai.xi if( _Progressive_ROI_flag == FALSE )
6331*53ee8cc1Swenshuai.xi {
6332*53ee8cc1Swenshuai.xi if((mcu_block == (_u8Blocks_per_mcu - 1))
6333*53ee8cc1Swenshuai.xi && (mcu_row == (_u16Mcus_per_row - 1))
6334*53ee8cc1Swenshuai.xi && (_u16Total_lines_left == gu8Max_mcu_y_size))
6335*53ee8cc1Swenshuai.xi {
6336*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EOF!!!!!ROI enable!!!\n");
6337*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, TRUE, component_id, TRUE)) // means it is end of picture
6338*53ee8cc1Swenshuai.xi return FALSE;
6339*53ee8cc1Swenshuai.xi }
6340*53ee8cc1Swenshuai.xi else
6341*53ee8cc1Swenshuai.xi {
6342*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6343*53ee8cc1Swenshuai.xi return FALSE;
6344*53ee8cc1Swenshuai.xi }
6345*53ee8cc1Swenshuai.xi }
6346*53ee8cc1Swenshuai.xi else
6347*53ee8cc1Swenshuai.xi {
6348*53ee8cc1Swenshuai.xi if( _u16Total_lines_left == gu8Max_mcu_y_size )//Last Line
6349*53ee8cc1Swenshuai.xi {
6350*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("_u16Total_lines_left ==%d,%d,%d \n", gu8Max_mcu_y_size, mcu_block, mcu_row);
6351*53ee8cc1Swenshuai.xi
6352*53ee8cc1Swenshuai.xi if((mcu_block == (_u8Blocks_per_mcu - 1))
6353*53ee8cc1Swenshuai.xi && ((mcu_row + 2) * gu8Max_mcu_x_size > ROI_width))//Last line last block within rang
6354*53ee8cc1Swenshuai.xi {
6355*53ee8cc1Swenshuai.xi if( EOF_Flag == FALSE )
6356*53ee8cc1Swenshuai.xi {
6357*53ee8cc1Swenshuai.xi EOF_Flag = TRUE;
6358*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("EOF!!!!!No ROI!!!\n");
6359*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, TRUE, component_id, TRUE)) // means it is end of picture
6360*53ee8cc1Swenshuai.xi return FALSE;
6361*53ee8cc1Swenshuai.xi }
6362*53ee8cc1Swenshuai.xi }
6363*53ee8cc1Swenshuai.xi else
6364*53ee8cc1Swenshuai.xi {
6365*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6366*53ee8cc1Swenshuai.xi return FALSE;
6367*53ee8cc1Swenshuai.xi }
6368*53ee8cc1Swenshuai.xi }
6369*53ee8cc1Swenshuai.xi else
6370*53ee8cc1Swenshuai.xi {
6371*53ee8cc1Swenshuai.xi if((mcu_row + 1) * gu8Max_mcu_x_size > ROI_width)//ever line out rang block
6372*53ee8cc1Swenshuai.xi {
6373*53ee8cc1Swenshuai.xi //JPEG_do_RLE(p, FALSE, component_id, FALSE);
6374*53ee8cc1Swenshuai.xi }
6375*53ee8cc1Swenshuai.xi else
6376*53ee8cc1Swenshuai.xi {
6377*53ee8cc1Swenshuai.xi if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6378*53ee8cc1Swenshuai.xi return FALSE;
6379*53ee8cc1Swenshuai.xi }
6380*53ee8cc1Swenshuai.xi }
6381*53ee8cc1Swenshuai.xi }
6382*53ee8cc1Swenshuai.xi #endif
6383*53ee8cc1Swenshuai.xi
6384*53ee8cc1Swenshuai.xi
6385*53ee8cc1Swenshuai.xi #ifdef CMODEL
6386*53ee8cc1Swenshuai.xi {
6387*53ee8cc1Swenshuai.xi for ( i = 63; i > 0; i-- )
6388*53ee8cc1Swenshuai.xi {
6389*53ee8cc1Swenshuai.xi if ( p[_u8ZAG[i]] )
6390*53ee8cc1Swenshuai.xi {
6391*53ee8cc1Swenshuai.xi break;
6392*53ee8cc1Swenshuai.xi }
6393*53ee8cc1Swenshuai.xi }
6394*53ee8cc1Swenshuai.xi
6395*53ee8cc1Swenshuai.xi //block_num[row_block++] = i + 1;
6396*53ee8cc1Swenshuai.xi
6397*53ee8cc1Swenshuai.xi for ( ; i >= 0; i-- )
6398*53ee8cc1Swenshuai.xi {
6399*53ee8cc1Swenshuai.xi if ( p[_u8ZAG[i]] )
6400*53ee8cc1Swenshuai.xi {
6401*53ee8cc1Swenshuai.xi p[_u8ZAG[i]] *= q[i];
6402*53ee8cc1Swenshuai.xi }
6403*53ee8cc1Swenshuai.xi }
6404*53ee8cc1Swenshuai.xi }
6405*53ee8cc1Swenshuai.xi
6406*53ee8cc1Swenshuai.xi row_block++;
6407*53ee8cc1Swenshuai.xi #endif
6408*53ee8cc1Swenshuai.xi
6409*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
6410*53ee8cc1Swenshuai.xi {
6411*53ee8cc1Swenshuai.xi block_x_mcu[component_id]++;
6412*53ee8cc1Swenshuai.xi }
6413*53ee8cc1Swenshuai.xi else
6414*53ee8cc1Swenshuai.xi {
6415*53ee8cc1Swenshuai.xi if ( ++block_x_mcu_ofs == _u8Comp_h_samp[component_id] )
6416*53ee8cc1Swenshuai.xi {
6417*53ee8cc1Swenshuai.xi block_x_mcu_ofs = 0;
6418*53ee8cc1Swenshuai.xi
6419*53ee8cc1Swenshuai.xi if ( ++block_y_mcu_ofs == _u8Comp_v_samp[component_id] )
6420*53ee8cc1Swenshuai.xi {
6421*53ee8cc1Swenshuai.xi block_y_mcu_ofs = 0;
6422*53ee8cc1Swenshuai.xi
6423*53ee8cc1Swenshuai.xi block_x_mcu[component_id] += _u8Comp_h_samp[component_id];
6424*53ee8cc1Swenshuai.xi }
6425*53ee8cc1Swenshuai.xi }
6426*53ee8cc1Swenshuai.xi }
6427*53ee8cc1Swenshuai.xi }
6428*53ee8cc1Swenshuai.xi }
6429*53ee8cc1Swenshuai.xi
6430*53ee8cc1Swenshuai.xi if ( _u8Comps_in_scan == 1 )
6431*53ee8cc1Swenshuai.xi {
6432*53ee8cc1Swenshuai.xi _u32Block_y_mcu[_u8Comp_list[0]]++;
6433*53ee8cc1Swenshuai.xi }
6434*53ee8cc1Swenshuai.xi else
6435*53ee8cc1Swenshuai.xi {
6436*53ee8cc1Swenshuai.xi for ( component_num = 0; component_num < _u8Comps_in_scan; component_num++ )
6437*53ee8cc1Swenshuai.xi {
6438*53ee8cc1Swenshuai.xi component_id = _u8Comp_list[component_num];
6439*53ee8cc1Swenshuai.xi
6440*53ee8cc1Swenshuai.xi _u32Block_y_mcu[component_id] += _u8Comp_v_samp[component_id];
6441*53ee8cc1Swenshuai.xi }
6442*53ee8cc1Swenshuai.xi }
6443*53ee8cc1Swenshuai.xi return TRUE;
6444*53ee8cc1Swenshuai.xi }
6445*53ee8cc1Swenshuai.xi #endif
6446*53ee8cc1Swenshuai.xi
6447*53ee8cc1Swenshuai.xi #ifndef CMODEL
6448*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6449*53ee8cc1Swenshuai.xi /******************************************************************************/
6450*53ee8cc1Swenshuai.xi ///Start JPEG decoding
6451*53ee8cc1Swenshuai.xi /******************************************************************************/
JPEG_StartDecode(void)6452*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL JPEG_StartDecode(void)
6453*53ee8cc1Swenshuai.xi {
6454*53ee8cc1Swenshuai.xi MS_U16 pic_width, pic_height;
6455*53ee8cc1Swenshuai.xi MS_U8 Y_VSF = _u8Comp_v_samp[0];
6456*53ee8cc1Swenshuai.xi MS_U8 Y_HSF = _u8Comp_h_samp[0];
6457*53ee8cc1Swenshuai.xi MS_BOOL bUV_en;
6458*53ee8cc1Swenshuai.xi MS_U32 reg_value;
6459*53ee8cc1Swenshuai.xi MS_U8 i;
6460*53ee8cc1Swenshuai.xi MS_U8 com_num = 0;
6461*53ee8cc1Swenshuai.xi MS_U8 comp[JPEG_MAXCOMPONENTS];
6462*53ee8cc1Swenshuai.xi JPD_BufCfg structBuf;
6463*53ee8cc1Swenshuai.xi
6464*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6465*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
6466*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
6467*53ee8cc1Swenshuai.xi {
6468*53ee8cc1Swenshuai.xi return FALSE;
6469*53ee8cc1Swenshuai.xi }
6470*53ee8cc1Swenshuai.xi #endif
6471*53ee8cc1Swenshuai.xi
6472*53ee8cc1Swenshuai.xi #if ENABLE_JPEG_NO_SIZE_LOWER_BOUND
6473*53ee8cc1Swenshuai.xi MDrv_JPD_SetPicDimension(0xFF, 0xFF);
6474*53ee8cc1Swenshuai.xi #endif
6475*53ee8cc1Swenshuai.xi
6476*53ee8cc1Swenshuai.xi // reset JPD hardware
6477*53ee8cc1Swenshuai.xi //MDrv_JPD_Reset();
6478*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6479*53ee8cc1Swenshuai.xi {
6480*53ee8cc1Swenshuai.xi MDrv_JPD_Rst_SVLD();
6481*53ee8cc1Swenshuai.xi }
6482*53ee8cc1Swenshuai.xi else
6483*53ee8cc1Swenshuai.xi {
6484*53ee8cc1Swenshuai.xi MDrv_JPD_Rst();
6485*53ee8cc1Swenshuai.xi }
6486*53ee8cc1Swenshuai.xi
6487*53ee8cc1Swenshuai.xi
6488*53ee8cc1Swenshuai.xi // Calculate how many valid quantization tables for components
6489*53ee8cc1Swenshuai.xi JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
6490*53ee8cc1Swenshuai.xi for(i = 0; i<_u8Comps_in_frame; i++)
6491*53ee8cc1Swenshuai.xi {
6492*53ee8cc1Swenshuai.xi comp[_u8Comp_quant[i]] = 1;
6493*53ee8cc1Swenshuai.xi }
6494*53ee8cc1Swenshuai.xi
6495*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
6496*53ee8cc1Swenshuai.xi {
6497*53ee8cc1Swenshuai.xi if(comp[i]==1)
6498*53ee8cc1Swenshuai.xi com_num++;
6499*53ee8cc1Swenshuai.xi }
6500*53ee8cc1Swenshuai.xi
6501*53ee8cc1Swenshuai.xi if(_u8Comps_in_frame>1)
6502*53ee8cc1Swenshuai.xi bUV_en = TRUE;
6503*53ee8cc1Swenshuai.xi else
6504*53ee8cc1Swenshuai.xi bUV_en = FALSE;
6505*53ee8cc1Swenshuai.xi
6506*53ee8cc1Swenshuai.xi //Get Aligned width & height
6507*53ee8cc1Swenshuai.xi JPEG_GetAlignedResolution(&pic_width, &pic_height);
6508*53ee8cc1Swenshuai.xi
6509*53ee8cc1Swenshuai.xi #if 1
6510*53ee8cc1Swenshuai.xi structBuf.bProgressive = _bProgressive_flag;
6511*53ee8cc1Swenshuai.xi structBuf.bThumbnailAccessMode = _bThumbnailAccessMode;
6512*53ee8cc1Swenshuai.xi structBuf.u32ThumbnailBufAddr = MS_VA2PA((MS_U32)INTERNAL_BUFFER_ADDR);
6513*53ee8cc1Swenshuai.xi structBuf.u32ThumbnailBufSize = JPEG_DEFAULT_EXIF_SIZE;
6514*53ee8cc1Swenshuai.xi structBuf.u32ThumbnailBufOffset = _u32ThumbnailOffset + JPEG_GetECS();
6515*53ee8cc1Swenshuai.xi structBuf.u32MRCBufAddr = MS_VA2PA((MS_U32)MRC_BUFFER_ADDR);
6516*53ee8cc1Swenshuai.xi structBuf.u32MRCBufSize = MRC_BUFFER_SIZE;
6517*53ee8cc1Swenshuai.xi structBuf.u32MRCBufOffset = JPEG_GetECS();
6518*53ee8cc1Swenshuai.xi structBuf.u32MWCBufAddr = MS_VA2PA((MS_U32)MWC_BUFFER_ADDR);
6519*53ee8cc1Swenshuai.xi //HW limitation:if we don't enable write-protect mode, set this value to zero.
6520*53ee8cc1Swenshuai.xi
6521*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_09_JPEGWriteProtectTest==false)
6522*53ee8cc1Swenshuai.xi structBuf.u16MWCBufLineNum = 0;
6523*53ee8cc1Swenshuai.xi // structBuf.u16MWCBufLineNum = ((pic_height/_u8ScaleDownFactor + 8) < 0x07FF)?(pic_height/_u8ScaleDownFactor + 8):0x7FF;
6524*53ee8cc1Swenshuai.xi #else
6525*53ee8cc1Swenshuai.xi structBuf.u16MWCBufLineNum = 32;
6526*53ee8cc1Swenshuai.xi #endif
6527*53ee8cc1Swenshuai.xi
6528*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("bProgressive = %d, bThumbnailAccessMode = %d\n"
6529*53ee8cc1Swenshuai.xi , structBuf.bProgressive, structBuf.bThumbnailAccessMode);
6530*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("u32ThumbnailBufAddr = 0x%lX, u32ThumbnailBufSize = 0x%lX, u32ThumbnailBufOffset = 0x%lX\n"
6531*53ee8cc1Swenshuai.xi , structBuf.u32ThumbnailBufAddr, structBuf.u32ThumbnailBufSize, structBuf.u32ThumbnailBufOffset);
6532*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("u32MRCBufAddr = 0x%lX, u32MRCBufSize = 0x%lX, u32MRCBufOffset = 0x%lX\n"
6533*53ee8cc1Swenshuai.xi , structBuf.u32MRCBufAddr, structBuf.u32MRCBufSize, structBuf.u32MRCBufOffset);
6534*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("u32MWCBufAddr = 0x%lX, u16MWCBufLineNum = %d\n"
6535*53ee8cc1Swenshuai.xi , structBuf.u32MWCBufAddr, structBuf.u16MWCBufLineNum);
6536*53ee8cc1Swenshuai.xi
6537*53ee8cc1Swenshuai.xi u32DataOffset += JPEG_GetECS();
6538*53ee8cc1Swenshuai.xi
6539*53ee8cc1Swenshuai.xi MDrv_JPD_InitBuf(structBuf);
6540*53ee8cc1Swenshuai.xi
6541*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("MWCLineNum = %d, pic_height = %d, DwnScaleRatio = %d\n"
6542*53ee8cc1Swenshuai.xi // , structBuf.u16MWCBufLineNum, pic_height, _u8ScaleDownFactor);
6543*53ee8cc1Swenshuai.xi #else
6544*53ee8cc1Swenshuai.xi if(_bThumbnailAccessMode)
6545*53ee8cc1Swenshuai.xi {
6546*53ee8cc1Swenshuai.xi // Set MRC buffer for JPD
6547*53ee8cc1Swenshuai.xi MDrv_JPD_SetReadBuffer(INTERNAL_BUFFER_ADDR, JPEG_DEFAULT_EXIF_SIZE);
6548*53ee8cc1Swenshuai.xi // Set MRC start access byte address
6549*53ee8cc1Swenshuai.xi MDrv_JPD_SetMRCStartAddr(INTERNAL_BUFFER_ADDR + _u32ThumbnailOffset + JPEG_GetECS());
6550*53ee8cc1Swenshuai.xi }
6551*53ee8cc1Swenshuai.xi else
6552*53ee8cc1Swenshuai.xi {
6553*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6554*53ee8cc1Swenshuai.xi {
6555*53ee8cc1Swenshuai.xi // Set MRC buffer for JPD
6556*53ee8cc1Swenshuai.xi MDrv_JPD_SetReadBuffer(MRC_BUFFER_ADDR, MRC_BUFFER_SIZE);
6557*53ee8cc1Swenshuai.xi // Set MRC start access byte address
6558*53ee8cc1Swenshuai.xi MDrv_JPD_SetMRCStartAddr(MRC_BUFFER_ADDR);
6559*53ee8cc1Swenshuai.xi }
6560*53ee8cc1Swenshuai.xi else
6561*53ee8cc1Swenshuai.xi {
6562*53ee8cc1Swenshuai.xi // Set MRC buffer for JPD
6563*53ee8cc1Swenshuai.xi MDrv_JPD_SetReadBuffer(MRC_BUFFER_ADDR, MRC_BUFFER_SIZE);
6564*53ee8cc1Swenshuai.xi // Set MRC start access byte address
6565*53ee8cc1Swenshuai.xi MDrv_JPD_SetMRCStartAddr(MRC_BUFFER_ADDR + JPEG_GetECS());
6566*53ee8cc1Swenshuai.xi }
6567*53ee8cc1Swenshuai.xi }
6568*53ee8cc1Swenshuai.xi
6569*53ee8cc1Swenshuai.xi // Set MWC buffer for JPD
6570*53ee8cc1Swenshuai.xi MDrv_JPD_SetOutputFrameBuffer(MWC_BUFFER_ADDR);
6571*53ee8cc1Swenshuai.xi #endif
6572*53ee8cc1Swenshuai.xi
6573*53ee8cc1Swenshuai.xi // Set picture width and height
6574*53ee8cc1Swenshuai.xi #if (ENABLE_JPEG_NO_SIZE_LOWER_BOUND == 0)
6575*53ee8cc1Swenshuai.xi MDrv_JPD_SetPicDimension(pic_width, pic_height);
6576*53ee8cc1Swenshuai.xi #endif
6577*53ee8cc1Swenshuai.xi
6578*53ee8cc1Swenshuai.xi _u16NonAlignmentImage_x_size = pic_width;
6579*53ee8cc1Swenshuai.xi _u16NonAlignmentImage_y_size = _u16Image_y_size;
6580*53ee8cc1Swenshuai.xi
6581*53ee8cc1Swenshuai.xi _u16Image_x_size = pic_width/_u8ScaleDownFactor;
6582*53ee8cc1Swenshuai.xi _u16Image_y_size = pic_height/_u8ScaleDownFactor;
6583*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ScaleDownFactor = %d\n", _u8ScaleDownFactor);
6584*53ee8cc1Swenshuai.xi
6585*53ee8cc1Swenshuai.xi // In JPD, software VLD mode, we don't need to write huff & symbol tables
6586*53ee8cc1Swenshuai.xi if(_bProgressive_flag==FALSE)
6587*53ee8cc1Swenshuai.xi {
6588*53ee8cc1Swenshuai.xi //JPEG_write_Scwgif();
6589*53ee8cc1Swenshuai.xi JPEG_WriteGrpinf();
6590*53ee8cc1Swenshuai.xi //JPEG_write_symidx();
6591*53ee8cc1Swenshuai.xi JPEG_WriteSymidx();
6592*53ee8cc1Swenshuai.xi }
6593*53ee8cc1Swenshuai.xi
6594*53ee8cc1Swenshuai.xi //JPEG_write_Qtbl();
6595*53ee8cc1Swenshuai.xi JPEG_WriteIQTbl();
6596*53ee8cc1Swenshuai.xi
6597*53ee8cc1Swenshuai.xi Y_VSF -= 1;
6598*53ee8cc1Swenshuai.xi if ( Y_HSF == 4 )
6599*53ee8cc1Swenshuai.xi {
6600*53ee8cc1Swenshuai.xi Y_HSF = 3;
6601*53ee8cc1Swenshuai.xi }
6602*53ee8cc1Swenshuai.xi
6603*53ee8cc1Swenshuai.xi if(_u16Restart_interval)
6604*53ee8cc1Swenshuai.xi {
6605*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("RST found! Enable JPD_RST_EN! Restart_interval = %d\n", _u16Restart_interval);
6606*53ee8cc1Swenshuai.xi //MDrv_Write2Byte(BK_JPD_RSTINTV, _u16Restart_interval - 1);
6607*53ee8cc1Swenshuai.xi MDrv_JPD_SetRSTIntv(_u16Restart_interval - 1);
6608*53ee8cc1Swenshuai.xi reg_value = ( JPD_TBL_RDY | JPD_RST_EN | ((MS_U32) _u8DownScaleRatio) << 4 | ((MS_U32) bUV_en) << 3 | ( Y_VSF << 2 ) | Y_HSF );
6609*53ee8cc1Swenshuai.xi }
6610*53ee8cc1Swenshuai.xi else
6611*53ee8cc1Swenshuai.xi {
6612*53ee8cc1Swenshuai.xi reg_value = ( JPD_TBL_RDY | ((MS_U32) _u8DownScaleRatio) << 4 | ((MS_U32) bUV_en) << 3 | ( Y_VSF << 2 ) | Y_HSF );
6613*53ee8cc1Swenshuai.xi }
6614*53ee8cc1Swenshuai.xi
6615*53ee8cc1Swenshuai.xi // There're Q tables for U & V, respectively.
6616*53ee8cc1Swenshuai.xi if(com_num>2)
6617*53ee8cc1Swenshuai.xi {
6618*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("More than two Q tables! Enable JPD_SUVQ! comnum = %d\n", com_num);
6619*53ee8cc1Swenshuai.xi reg_value = reg_value | JPD_SUVQ;
6620*53ee8cc1Swenshuai.xi }
6621*53ee8cc1Swenshuai.xi
6622*53ee8cc1Swenshuai.xi /* Check the read pointer. If it is in HIGH buffer, we need
6623*53ee8cc1Swenshuai.xi to preload data to LOW buffer and then start decode.
6624*53ee8cc1Swenshuai.xi Progressive mode & thumbnail don't need to check it. */
6625*53ee8cc1Swenshuai.xi if((FALSE == _bProgressive_flag)
6626*53ee8cc1Swenshuai.xi && (FALSE == _bThumbnailAccessMode))
6627*53ee8cc1Swenshuai.xi {
6628*53ee8cc1Swenshuai.xi MS_U32 start_offset = JPEG_GetECS();
6629*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("start offset = 0x%lx\n", start_offset);
6630*53ee8cc1Swenshuai.xi if ( start_offset >= (MRC_BUFFER_SIZE/2) )
6631*53ee8cc1Swenshuai.xi {
6632*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ReadPtr is in HIGH, Load LOW!!\n");
6633*53ee8cc1Swenshuai.xi if(_pFillHdrFunc)
6634*53ee8cc1Swenshuai.xi {
6635*53ee8cc1Swenshuai.xi MS_S32 byte_read = _pFillHdrFunc((MS_PHYADDR)MS_VA2PA((MS_U32)_pu8In_buf), (MRC_BUFFER_SIZE/2));
6636*53ee8cc1Swenshuai.xi if(byte_read < 0)
6637*53ee8cc1Swenshuai.xi {
6638*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_STREAM_READ);
6639*53ee8cc1Swenshuai.xi return FALSE;
6640*53ee8cc1Swenshuai.xi }
6641*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_LOW;
6642*53ee8cc1Swenshuai.xi u32MRCheckCount = 0;
6643*53ee8cc1Swenshuai.xi }
6644*53ee8cc1Swenshuai.xi else
6645*53ee8cc1Swenshuai.xi {
6646*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_pFillHdrFunc is not registered!!, still need to start decode.\n");
6647*53ee8cc1Swenshuai.xi }
6648*53ee8cc1Swenshuai.xi }
6649*53ee8cc1Swenshuai.xi }
6650*53ee8cc1Swenshuai.xi
6651*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
6652*53ee8cc1Swenshuai.xi reg_value = reg_value | JPD_SVLD;
6653*53ee8cc1Swenshuai.xi
6654*53ee8cc1Swenshuai.xi // Check if it needs to do ROI
6655*53ee8cc1Swenshuai.xi if(E_JPD_DOWNSCALE_ORG != _u8DownScaleRatio)
6656*53ee8cc1Swenshuai.xi {
6657*53ee8cc1Swenshuai.xi if(ROI_width != pic_width)
6658*53ee8cc1Swenshuai.xi {
6659*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ROI!! ROI_width = %d, ROI_height = %d\n", ROI_width, pic_height);
6660*53ee8cc1Swenshuai.xi MDrv_JPD_SetROI(0, 0, (ROI_width>>3), (pic_height>>3));
6661*53ee8cc1Swenshuai.xi reg_value = reg_value | JPD_ROI_EN;
6662*53ee8cc1Swenshuai.xi }
6663*53ee8cc1Swenshuai.xi _u16Image_x_size = ROI_width/_u8ScaleDownFactor;
6664*53ee8cc1Swenshuai.xi }
6665*53ee8cc1Swenshuai.xi
6666*53ee8cc1Swenshuai.xi //Enable ECO support
6667*53ee8cc1Swenshuai.xi {
6668*53ee8cc1Swenshuai.xi MS_U16 reg_val = 0;
6669*53ee8cc1Swenshuai.xi reg_val = JPD_RST_STUFF_BYTE_HANDLE;
6670*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_3_HUFFMAN_TABLE==true)
6671*53ee8cc1Swenshuai.xi if(TRUE == bIs3HuffTbl)
6672*53ee8cc1Swenshuai.xi {
6673*53ee8cc1Swenshuai.xi reg_val = reg_val | JPD_3_HUFFMAN_TABLE_SUPPORT;
6674*53ee8cc1Swenshuai.xi }
6675*53ee8cc1Swenshuai.xi #endif
6676*53ee8cc1Swenshuai.xi MDrv_JPD_SetSpare(reg_val);
6677*53ee8cc1Swenshuai.xi }
6678*53ee8cc1Swenshuai.xi
6679*53ee8cc1Swenshuai.xi // mark low/high buffer valid
6680*53ee8cc1Swenshuai.xi //MDrv_Write2Byte( BK_JPD_MCONFIG, JPD_H_VLD |JPD_L_VLD);
6681*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config(JPD_H_VLD |JPD_L_VLD);
6682*53ee8cc1Swenshuai.xi
6683*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_18_miu_sel_128M==true) \
6684*53ee8cc1Swenshuai.xi ||(ENABLE_TEST_18_miu_sel_64M==true) \
6685*53ee8cc1Swenshuai.xi ||(ENABLE_TEST_18_miu_sel_32M==true)
6686*53ee8cc1Swenshuai.xi // This is used for verification code in TEST_18_miu_sel
6687*53ee8cc1Swenshuai.xi // MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config()); // 0 1
6688*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_18_miu_sel_128M==true)
6689*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config() | JPD_BIT(9)); // 0 1 0 1
6690*53ee8cc1Swenshuai.xi #elif (ENABLE_TEST_18_miu_sel_64M==true)
6691*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config() | JPD_BIT(10)); // 0 1 0 1 0 1 0 1
6692*53ee8cc1Swenshuai.xi #else
6693*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config(MDrv_JPD_Get_M_Config() | JPD_BIT(9) | JPD_BIT(10)); // 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
6694*53ee8cc1Swenshuai.xi #endif
6695*53ee8cc1Swenshuai.xi #endif
6696*53ee8cc1Swenshuai.xi
6697*53ee8cc1Swenshuai.xi // enable JPD decoding
6698*53ee8cc1Swenshuai.xi #if ENABLE_JPEG_NO_SIZE_LOWER_BOUND
6699*53ee8cc1Swenshuai.xi MDrv_JPD_SetPicDimension(pic_width, pic_height);
6700*53ee8cc1Swenshuai.xi #endif
6701*53ee8cc1Swenshuai.xi
6702*53ee8cc1Swenshuai.xi //MDrv_Write2Byte( BK_JPD_SCONFIG, reg_value | JPD_DEC_EN | MDrv_JPD_GetSWResetMask());
6703*53ee8cc1Swenshuai.xi //MDrv_JPD_Set_S_Config(reg_value | JPD_DEC_EN | MDrv_JPD_GetSWResetMask());
6704*53ee8cc1Swenshuai.xi //MDrv_JPD_Set_S_Config(reg_value | JPD_DEC_EN | JPD_SWRST);
6705*53ee8cc1Swenshuai.xi #if 1
6706*53ee8cc1Swenshuai.xi // decide if we need to set the JPD_PSAVE_EN register in hal layer
6707*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST | JPD_PSAVE_EN);
6708*53ee8cc1Swenshuai.xi #else
6709*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_16_JPEGEnablePsaveModeTest==false)
6710*53ee8cc1Swenshuai.xi #if defined(CHIP_A3) || defined(CHIP_E3) || defined(CHIP_A5) || defined(CHIP_A5P) || defined(CHIP_A6) || defined(CHIP_A7)
6711*53ee8cc1Swenshuai.xi // For safety, enable the JPD_PSAVE_EN as default since A5 (HW already fixed this bug since A1 or earlier chip)
6712*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST | JPD_PSAVE_EN);
6713*53ee8cc1Swenshuai.xi #else
6714*53ee8cc1Swenshuai.xi //due to power saving mode will make system hang in some case(the image of RST error),we do not enable this function currently.
6715*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST);
6716*53ee8cc1Swenshuai.xi #endif
6717*53ee8cc1Swenshuai.xi #else
6718*53ee8cc1Swenshuai.xi #if defined(CHIP_T3) || defined(CHIP_T4) || defined(CHIP_T7) || defined(CHIP_JANUS) || defined(CHIP_U4) || defined(CHIP_T8) || defined(CHIP_J2) || defined(CHIP_A1) || defined(CHIP_A2) || defined(CHIP_A5) || defined(CHIP_A5P) || defined(CHIP_A6) || defined(CHIP_A7) || defined(CHIP_A3) || defined(CHIP_AMETHYST) || defined(CHIP_E3)
6719*53ee8cc1Swenshuai.xi //Enable power save mode on normal JPEG decoding.
6720*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST | JPD_PSAVE_EN);
6721*53ee8cc1Swenshuai.xi #else
6722*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(reg_value | JPD_SWRST);
6723*53ee8cc1Swenshuai.xi #endif
6724*53ee8cc1Swenshuai.xi #endif
6725*53ee8cc1Swenshuai.xi #endif
6726*53ee8cc1Swenshuai.xi
6727*53ee8cc1Swenshuai.xi // protect test(only for unit test)
6728*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_09_JPEGWriteProtectTest==false)
6729*53ee8cc1Swenshuai.xi //MDrv_JPD_SetWriteProtect(TRUE);
6730*53ee8cc1Swenshuai.xi #else
6731*53ee8cc1Swenshuai.xi #if(JPD_SUPPORT_AUTO_PROTECT==false)
6732*53ee8cc1Swenshuai.xi MDrv_JPD_SetWriteProtect(TRUE);
6733*53ee8cc1Swenshuai.xi #endif
6734*53ee8cc1Swenshuai.xi #endif
6735*53ee8cc1Swenshuai.xi
6736*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_AUTO_PROTECT==true)
6737*53ee8cc1Swenshuai.xi MDrv_JPD_SetAutoProtect(TRUE);
6738*53ee8cc1Swenshuai.xi #if (ENABLE_TEST_22_AutoProtectFailTest == true)
6739*53ee8cc1Swenshuai.xi MDrv_JPD_SetWPENEndAddr(MWC_BUFFER_ADDR+0x200-1);
6740*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Set Auto protect address =0x%lx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", MWC_BUFFER_ADDR+0x200);
6741*53ee8cc1Swenshuai.xi #else
6742*53ee8cc1Swenshuai.xi MDrv_JPD_SetWPENEndAddr(MWC_BUFFER_ADDR+MWC_BUFFER_SIZE-1);
6743*53ee8cc1Swenshuai.xi #endif
6744*53ee8cc1Swenshuai.xi #endif
6745*53ee8cc1Swenshuai.xi
6746*53ee8cc1Swenshuai.xi MDrv_JPD_Set_S_Config(MDrv_JPD_Get_S_Config() | JPD_DEC_EN);
6747*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("After Setting SCONFIG, JPD START!!\n");
6748*53ee8cc1Swenshuai.xi //JPEG_GO;
6749*53ee8cc1Swenshuai.xi return TRUE;
6750*53ee8cc1Swenshuai.xi }
6751*53ee8cc1Swenshuai.xi #endif
6752*53ee8cc1Swenshuai.xi
6753*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
6754*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6755*53ee8cc1Swenshuai.xi /******************************************************************************/
6756*53ee8cc1Swenshuai.xi ///Start Progressive JPEG decode for JPD
6757*53ee8cc1Swenshuai.xi /******************************************************************************/
JPEG_Progressive_Decode(void)6758*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_Result JPEG_Progressive_Decode(void)
6759*53ee8cc1Swenshuai.xi {
6760*53ee8cc1Swenshuai.xi if(_bProgressive_flag==FALSE)
6761*53ee8cc1Swenshuai.xi return (E_JPEG_FAILED);
6762*53ee8cc1Swenshuai.xi
6763*53ee8cc1Swenshuai.xi if ( _u16Total_lines_left == 0 )
6764*53ee8cc1Swenshuai.xi {
6765*53ee8cc1Swenshuai.xi return ( E_JPEG_OKAY );
6766*53ee8cc1Swenshuai.xi }
6767*53ee8cc1Swenshuai.xi
6768*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
6769*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
6770*53ee8cc1Swenshuai.xi {
6771*53ee8cc1Swenshuai.xi return ( E_JPEG_FAILED );
6772*53ee8cc1Swenshuai.xi }
6773*53ee8cc1Swenshuai.xi #endif
6774*53ee8cc1Swenshuai.xi
6775*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("_u16Mcus_per_row is %d!\n",_u16Mcus_per_row);
6776*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("_u16Mcus_per_col is %d!\n",_u16Mcus_per_col);
6777*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("_u8Blocks_per_mcu is %d!\n",_u8Blocks_per_mcu);
6778*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("gu8Max_mcu_x_size is %d!\n",gu8Max_mcu_x_size);
6779*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("gu8Max_mcu_y_size is %d!\n",gu8Max_mcu_y_size);
6780*53ee8cc1Swenshuai.xi
6781*53ee8cc1Swenshuai.xi if( _u16Total_lines_left > 0 )
6782*53ee8cc1Swenshuai.xi {
6783*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:_u16Total_lines_left = %d\n", __FUNCTION__ , _u16Total_lines_left);
6784*53ee8cc1Swenshuai.xi if(!JPEG_load_next_row())
6785*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
6786*53ee8cc1Swenshuai.xi
6787*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
6788*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
6789*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
6790*53ee8cc1Swenshuai.xi {
6791*53ee8cc1Swenshuai.xi if(!msAPI_JPEG_transform_row()) //IDCT
6792*53ee8cc1Swenshuai.xi {
6793*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CMYK and RGB decode failed!!\n");
6794*53ee8cc1Swenshuai.xi return ( E_JPEG_FAILED );
6795*53ee8cc1Swenshuai.xi }
6796*53ee8cc1Swenshuai.xi }
6797*53ee8cc1Swenshuai.xi #endif
6798*53ee8cc1Swenshuai.xi
6799*53ee8cc1Swenshuai.xi _u16Total_lines_left -= gu8Max_mcu_y_size;
6800*53ee8cc1Swenshuai.xi }
6801*53ee8cc1Swenshuai.xi
6802*53ee8cc1Swenshuai.xi return (E_JPEG_DONE);
6803*53ee8cc1Swenshuai.xi }
6804*53ee8cc1Swenshuai.xi #endif
6805*53ee8cc1Swenshuai.xi
6806*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
JPEG_GetAlignedResolution(MS_U16 * width,MS_U16 * height)6807*53ee8cc1Swenshuai.xi JPEG_STATIC void JPEG_GetAlignedResolution(MS_U16 *width, MS_U16 *height)
6808*53ee8cc1Swenshuai.xi {
6809*53ee8cc1Swenshuai.xi MS_U8 mcu_width, mcu_height;
6810*53ee8cc1Swenshuai.xi MS_U8 Y_VSF = _u8Comp_v_samp[0];
6811*53ee8cc1Swenshuai.xi MS_U8 Y_HSF = _u8Comp_h_samp[0];
6812*53ee8cc1Swenshuai.xi
6813*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6814*53ee8cc1Swenshuai.xi
6815*53ee8cc1Swenshuai.xi *width = _u16OriginalImage_x_size;
6816*53ee8cc1Swenshuai.xi *height = _u16OriginalImage_y_size;
6817*53ee8cc1Swenshuai.xi
6818*53ee8cc1Swenshuai.xi mcu_width = _u16OriginalImage_x_size % (Y_HSF * 8);
6819*53ee8cc1Swenshuai.xi if (mcu_width)
6820*53ee8cc1Swenshuai.xi {
6821*53ee8cc1Swenshuai.xi *width += (Y_HSF * 8 - mcu_width);
6822*53ee8cc1Swenshuai.xi }
6823*53ee8cc1Swenshuai.xi
6824*53ee8cc1Swenshuai.xi mcu_height = _u16OriginalImage_y_size % (Y_VSF * 8);
6825*53ee8cc1Swenshuai.xi if (mcu_height)
6826*53ee8cc1Swenshuai.xi {
6827*53ee8cc1Swenshuai.xi *height += (Y_VSF * 8 - mcu_height);
6828*53ee8cc1Swenshuai.xi }
6829*53ee8cc1Swenshuai.xi
6830*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_u8Comp_v_samp = %d, _u8Comp_h_samp = %d\n", _u8Comp_v_samp[0], _u8Comp_h_samp[0]);
6831*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_u16OriginalImage_x_size = %d, _u16OriginalImage_y_size = %d\n", _u16OriginalImage_x_size, _u16OriginalImage_y_size);
6832*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("AlignWidth = %d, AlignHeight = %d\n", *width, *height);
6833*53ee8cc1Swenshuai.xi }
6834*53ee8cc1Swenshuai.xi
6835*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6836*53ee8cc1Swenshuai.xi // Global Functions
6837*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6838*53ee8cc1Swenshuai.xi #if 0
6839*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6840*53ee8cc1Swenshuai.xi /******************************************************************************/
6841*53ee8cc1Swenshuai.xi ///This will set MRC buffer address & size, MWC buffer address, and internal buffer
6842*53ee8cc1Swenshuai.xi ///address & size.
6843*53ee8cc1Swenshuai.xi ///@param *pInitParam \b The pointer of information for JPEG Buffer initialization
6844*53ee8cc1Swenshuai.xi /// structure {
6845*53ee8cc1Swenshuai.xi /// U32 u32MRCBufAddr, \b IN MRC buffer address
6846*53ee8cc1Swenshuai.xi /// U32 u32MRCBufSize, \b IN MRC buffer size
6847*53ee8cc1Swenshuai.xi /// U32 u32MWCBufAddr, \b IN MWC buffer address
6848*53ee8cc1Swenshuai.xi /// JPEG decompress data (YUV422)
6849*53ee8cc1Swenshuai.xi /// U32 u32InternalBufAddr, \b IN internal buffer address
6850*53ee8cc1Swenshuai.xi /// (exif:64K + memory pool)
6851*53ee8cc1Swenshuai.xi /// U32 u32InternalBufSize, \b IN internal buffer size
6852*53ee8cc1Swenshuai.xi /// BOOL bInitMem, \b IN initialize memory pool or not
6853*53ee8cc1Swenshuai.xi /// };
6854*53ee8cc1Swenshuai.xi ///@return true or false
6855*53ee8cc1Swenshuai.xi /******************************************************************************/
6856*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_SetInitParameter(JPEG_InitParam *pInitParam)
6857*53ee8cc1Swenshuai.xi {
6858*53ee8cc1Swenshuai.xi // the buffer size must be multiple of 4 bytes
6859*53ee8cc1Swenshuai.xi if((!pInitParam)
6860*53ee8cc1Swenshuai.xi || (pInitParam->u32MRCBufSize < MIN_READBUFFER_SIZE))
6861*53ee8cc1Swenshuai.xi {
6862*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_READBUFFER_TOOSMALL);
6863*53ee8cc1Swenshuai.xi return false;
6864*53ee8cc1Swenshuai.xi }
6865*53ee8cc1Swenshuai.xi // the buffer size must be multiple of 8 bytes
6866*53ee8cc1Swenshuai.xi pInitParam->u32MRCBufSize = pInitParam->u32MRCBufSize & ~0x7;
6867*53ee8cc1Swenshuai.xi
6868*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR = pInitParam->u32MRCBufAddr | AEON_NON_CACHE_MASK;
6869*53ee8cc1Swenshuai.xi MWC_BUFFER_ADDR = pInitParam->u32MWCBufAddr | AEON_NON_CACHE_MASK;
6870*53ee8cc1Swenshuai.xi INTERNAL_BUFFER_ADDR = pInitParam->u32InternalBufAddr | AEON_NON_CACHE_MASK;
6871*53ee8cc1Swenshuai.xi MRC_BUFFER_SIZE = pInitParam->u32MRCBufSize;
6872*53ee8cc1Swenshuai.xi INTERNAL_BUFFER_SIZE = pInitParam->u32InternalBufSize;
6873*53ee8cc1Swenshuai.xi
6874*53ee8cc1Swenshuai.xi _pu8In_buf = (MS_U8 *) pInitParam->u32MRCBufAddr;
6875*53ee8cc1Swenshuai.xi
6876*53ee8cc1Swenshuai.xi if (pInitParam->bInitMem)
6877*53ee8cc1Swenshuai.xi {
6878*53ee8cc1Swenshuai.xi JPEG_MEMORY_init_mempool(((MS_U8 *)(pInitParam->u32InternalBufAddr + JPEG_DEFAULT_EXIF_SIZE))
6879*53ee8cc1Swenshuai.xi , (pInitParam->u32InternalBufSize - JPEG_DEFAULT_EXIF_SIZE));
6880*53ee8cc1Swenshuai.xi }
6881*53ee8cc1Swenshuai.xi
6882*53ee8cc1Swenshuai.xi return TRUE;
6883*53ee8cc1Swenshuai.xi }
6884*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6885*53ee8cc1Swenshuai.xi // Call get_error_code() after constructing to determine if the stream
6886*53ee8cc1Swenshuai.xi // was valid or not. You may call the get_width(), get_height(), etc.
6887*53ee8cc1Swenshuai.xi // methods after the constructor is called.
6888*53ee8cc1Swenshuai.xi // You may then either destruct the object, or begin decoding the image
6889*53ee8cc1Swenshuai.xi // by calling begin(), then decode().
6890*53ee8cc1Swenshuai.xi void MApi_JPEG_Constructor( PJPEG_FILE_FileSystem_t Pstream, MS_U8 decode_type)
6891*53ee8cc1Swenshuai.xi {
6892*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
6893*53ee8cc1Swenshuai.xi {
6894*53ee8cc1Swenshuai.xi return;
6895*53ee8cc1Swenshuai.xi }
6896*53ee8cc1Swenshuai.xi
6897*53ee8cc1Swenshuai.xi _u8DecodeType = decode_type;
6898*53ee8cc1Swenshuai.xi JPEG_init_thumbnail();
6899*53ee8cc1Swenshuai.xi JPEG_decode_init( Pstream);
6900*53ee8cc1Swenshuai.xi
6901*53ee8cc1Swenshuai.xi #ifdef CMODEL
6902*53ee8cc1Swenshuai.xi _bReady_flag = TRUE;
6903*53ee8cc1Swenshuai.xi #endif
6904*53ee8cc1Swenshuai.xi }
6905*53ee8cc1Swenshuai.xi #endif
6906*53ee8cc1Swenshuai.xi
6907*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
MApi_JPEG_Is_RGB_CMYK(void)6908*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_Is_RGB_CMYK(void)
6909*53ee8cc1Swenshuai.xi {
6910*53ee8cc1Swenshuai.xi if (_u8Comps_in_frame == 3)
6911*53ee8cc1Swenshuai.xi {
6912*53ee8cc1Swenshuai.xi //support only U_H1V1 & V_H1V1
6913*53ee8cc1Swenshuai.xi if ((_u8Comp_h_samp[1] != 1 || _u8Comp_v_samp[1] != 1)
6914*53ee8cc1Swenshuai.xi || (_u8Comp_h_samp[2] != 1 || _u8Comp_v_samp[2] != 1))
6915*53ee8cc1Swenshuai.xi {
6916*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
6917*53ee8cc1Swenshuai.xi return FALSE;
6918*53ee8cc1Swenshuai.xi }
6919*53ee8cc1Swenshuai.xi
6920*53ee8cc1Swenshuai.xi if (_u8Comp_h_samp[0] == 1 && _u8Comp_v_samp[0] == 1)
6921*53ee8cc1Swenshuai.xi {
6922*53ee8cc1Swenshuai.xi if (_u8Comp_ident[0] == 82 || _u8Comp_ident[0] == 71 || _u8Comp_ident[0] == 66)
6923*53ee8cc1Swenshuai.xi return TRUE; // RGB
6924*53ee8cc1Swenshuai.xi }
6925*53ee8cc1Swenshuai.xi }
6926*53ee8cc1Swenshuai.xi else
6927*53ee8cc1Swenshuai.xi if (_u8Comps_in_frame == 4) //handle YCCK & CMYK case, must distinguish YCCK and CMYK later
6928*53ee8cc1Swenshuai.xi {
6929*53ee8cc1Swenshuai.xi if (_u8Comp_h_samp[0] == 1 && _u8Comp_v_samp[0] == 1)
6930*53ee8cc1Swenshuai.xi return TRUE; // CMYK
6931*53ee8cc1Swenshuai.xi }
6932*53ee8cc1Swenshuai.xi
6933*53ee8cc1Swenshuai.xi return FALSE;
6934*53ee8cc1Swenshuai.xi }
6935*53ee8cc1Swenshuai.xi #endif
6936*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6937*53ee8cc1Swenshuai.xi /********************************************************************/
6938*53ee8cc1Swenshuai.xi ///This function will\n
6939*53ee8cc1Swenshuai.xi ///1. set MRC buffer address & size, MWC buffer address, and internal buffer address & size.\n
6940*53ee8cc1Swenshuai.xi ///2. power on JPD\n
6941*53ee8cc1Swenshuai.xi ///3. reset thumbnail parameters\n
6942*53ee8cc1Swenshuai.xi ///4. set the stream and its size, the number of components, etc.\n
6943*53ee8cc1Swenshuai.xi ///Call MApi_JPEG_GetErrorCode() after it to determine if the stream was valid or not.\n
6944*53ee8cc1Swenshuai.xi ///@param -pInitParam \b IN : \n
6945*53ee8cc1Swenshuai.xi /// structure {\n
6946*53ee8cc1Swenshuai.xi /// MS_PHYADDR \b u32MRCBufAddr : MRC buffer address\n
6947*53ee8cc1Swenshuai.xi /// MS_U32 \b u32MRCBufSize : MRC buffer size\n
6948*53ee8cc1Swenshuai.xi /// MS_PHYADDR \b u32MWCBufAddr : MWC buffer address(JPEG decompress data (YUV422))\n
6949*53ee8cc1Swenshuai.xi /// MS_U32 \b u32MWCBufSize : MWC buffer size\n
6950*53ee8cc1Swenshuai.xi /// MS_PHYADDR \b u32InternalBufAddr : Internal buffer address(exif:64K + memory pool)\n
6951*53ee8cc1Swenshuai.xi /// MS_U32 \b u32InternalBufSize : Internal buffer size\n
6952*53ee8cc1Swenshuai.xi /// MS_U32 \b u32DecByteRead : how many byte read for JPEG decoder initialization\n
6953*53ee8cc1Swenshuai.xi /// MS_BOOL \b bEOF : has read to the end of file\n
6954*53ee8cc1Swenshuai.xi /// MS_U8 \b u8DecoderType : 3 types: JPEG main, thumbnail, or MJPEG\n
6955*53ee8cc1Swenshuai.xi /// MS_BOOL \b bInitMem : initialize memory pool or not\n
6956*53ee8cc1Swenshuai.xi /// JPEG_FillHdrFunc \b pFillHdrFunc : the function for fill header information\n
6957*53ee8cc1Swenshuai.xi /// };
6958*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result : JPEG init status
6959*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Success
6960*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Failed
6961*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_Init(JPEG_InitParam * pInitParam)6962*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_Init(JPEG_InitParam *pInitParam)
6963*53ee8cc1Swenshuai.xi {
6964*53ee8cc1Swenshuai.xi #if 0
6965*53ee8cc1Swenshuai.xi MApi_JPEG_SetDbgLevel(E_JPEG_DEBUG_ALL);
6966*53ee8cc1Swenshuai.xi #endif
6967*53ee8cc1Swenshuai.xi
6968*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
6969*53ee8cc1Swenshuai.xi static MS_U8 fileName2[]={'/','u','s','b','/','s','d','a','1','/','l','o', 'g', '0', '0', '0', '.', 'b', 'i', 'n',0};
6970*53ee8cc1Swenshuai.xi fileName2[15]++;
6971*53ee8cc1Swenshuai.xi if(fileName2[15] > '9')
6972*53ee8cc1Swenshuai.xi {
6973*53ee8cc1Swenshuai.xi fileName2[14]++;
6974*53ee8cc1Swenshuai.xi fileName2[15] = '0';
6975*53ee8cc1Swenshuai.xi }
6976*53ee8cc1Swenshuai.xi if(fileName2[14] > '9')
6977*53ee8cc1Swenshuai.xi {
6978*53ee8cc1Swenshuai.xi fileName2[13]++;
6979*53ee8cc1Swenshuai.xi fileName2[14] = '0';
6980*53ee8cc1Swenshuai.xi }
6981*53ee8cc1Swenshuai.xi
6982*53ee8cc1Swenshuai.xi if((logBinfp = fopen((char *)fileName2, "wb"))==NULL) {
6983*53ee8cc1Swenshuai.xi printf("Can't open /usb/sda1/log.bin\n");
6984*53ee8cc1Swenshuai.xi }
6985*53ee8cc1Swenshuai.xi else
6986*53ee8cc1Swenshuai.xi {
6987*53ee8cc1Swenshuai.xi printf("open /usb/sda1/log.bin success\n");
6988*53ee8cc1Swenshuai.xi }
6989*53ee8cc1Swenshuai.xi #endif
6990*53ee8cc1Swenshuai.xi
6991*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6992*53ee8cc1Swenshuai.xi
6993*53ee8cc1Swenshuai.xi // jpeg constructor
6994*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
6995*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
6996*53ee8cc1Swenshuai.xi {
6997*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
6998*53ee8cc1Swenshuai.xi }
6999*53ee8cc1Swenshuai.xi #endif
7000*53ee8cc1Swenshuai.xi
7001*53ee8cc1Swenshuai.xi if(_bIsInit == TRUE)
7002*53ee8cc1Swenshuai.xi {
7003*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
7004*53ee8cc1Swenshuai.xi if(MApi_JPEG_IsMPOFormat()==FALSE)
7005*53ee8cc1Swenshuai.xi {
7006*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_RE_INIT);
7007*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7008*53ee8cc1Swenshuai.xi }
7009*53ee8cc1Swenshuai.xi #else
7010*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_RE_INIT);
7011*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7012*53ee8cc1Swenshuai.xi #endif
7013*53ee8cc1Swenshuai.xi }
7014*53ee8cc1Swenshuai.xi else
7015*53ee8cc1Swenshuai.xi {
7016*53ee8cc1Swenshuai.xi _bIsInit = TRUE;
7017*53ee8cc1Swenshuai.xi }
7018*53ee8cc1Swenshuai.xi
7019*53ee8cc1Swenshuai.xi if(!pInitParam)
7020*53ee8cc1Swenshuai.xi {
7021*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_DECODE_ERROR);
7022*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7023*53ee8cc1Swenshuai.xi }
7024*53ee8cc1Swenshuai.xi
7025*53ee8cc1Swenshuai.xi // if(pInitParam->u32MRCBufSize < MIN_READBUFFER_SIZE)
7026*53ee8cc1Swenshuai.xi if(pInitParam->u32MRCBufSize < JPEG_DEFAULT_EXIF_SIZE)
7027*53ee8cc1Swenshuai.xi {
7028*53ee8cc1Swenshuai.xi JPEG_terminate(E_JPEG_READBUFFER_TOOSMALL);
7029*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7030*53ee8cc1Swenshuai.xi }
7031*53ee8cc1Swenshuai.xi
7032*53ee8cc1Swenshuai.xi // the buffer size must be multiple of 8 bytes
7033*53ee8cc1Swenshuai.xi pInitParam->u32MRCBufSize = pInitParam->u32MRCBufSize & ~0x7;
7034*53ee8cc1Swenshuai.xi
7035*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32MRCBufAddr);// | AEON_NON_CACHE_MASK;
7036*53ee8cc1Swenshuai.xi MWC_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32MWCBufAddr);// | AEON_NON_CACHE_MASK;
7037*53ee8cc1Swenshuai.xi INTERNAL_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32InternalBufAddr);// | AEON_NON_CACHE_MASK;
7038*53ee8cc1Swenshuai.xi if (__bIsMjpeg)
7039*53ee8cc1Swenshuai.xi {
7040*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("MJPEG Read buffer address CONVERT : 0x%lx - 0x%lx + 0x%lx ",
7041*53ee8cc1Swenshuai.xi MS_VA2PA(MRC_BUFFER_ADDR), MS_VA2PA(__u32RealMjpegBase), MS_VA2PA(__u32TrickyMjpegBase));
7042*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR -= __u32RealMjpegBase;
7043*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR += __u32TrickyMjpegBase;
7044*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("= 0x%lx\n", MS_VA2PA(MRC_BUFFER_ADDR));
7045*53ee8cc1Swenshuai.xi }
7046*53ee8cc1Swenshuai.xi _pu8In_buf = (MS_U8 *)MRC_BUFFER_ADDR;//pInitParam->u32MRCBufAddr;
7047*53ee8cc1Swenshuai.xi
7048*53ee8cc1Swenshuai.xi MRC_BUFFER_SIZE = pInitParam->u32MRCBufSize;
7049*53ee8cc1Swenshuai.xi MWC_BUFFER_SIZE = pInitParam->u32MWCBufSize;
7050*53ee8cc1Swenshuai.xi INTERNAL_BUFFER_SIZE = pInitParam->u32InternalBufSize;
7051*53ee8cc1Swenshuai.xi
7052*53ee8cc1Swenshuai.xi
7053*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MRC_ADDR = 0x%lX, MRC_BUFFER_SIZE = 0x%lX\n", _u32ReadBufferAddr, _u32ReadBufferSize);
7054*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MWC_ADDR = 0x%lX, MWC_BUFFER_SIZE = 0x%lX\n", _u32WriteBufferAddr, _u32WriteBufferSize);
7055*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("INTERNAL_ADDR = 0x%lX, INTERNAL_BUFFER_SIZE = 0x%lX\n", _u32InternalBufferAddr, _u32InternalBufferSize);
7056*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("MRC_PA= 0x%lx\n", MS_VA2PA(MRC_BUFFER_ADDR));
7057*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("MWC_PA= 0x%lx\n", MS_VA2PA(MWC_BUFFER_ADDR));
7058*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("INTER_PA= 0x%lx\n", MS_VA2PA(INTERNAL_BUFFER_ADDR));
7059*53ee8cc1Swenshuai.xi
7060*53ee8cc1Swenshuai.xi _pFillHdrFunc = pInitParam->pFillHdrFunc;
7061*53ee8cc1Swenshuai.xi
7062*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7063*53ee8cc1Swenshuai.xi u8Out_buf = (MS_U8 *) MWC_BUFFER_ADDR;
7064*53ee8cc1Swenshuai.xi u32_Decode_Line = 0;
7065*53ee8cc1Swenshuai.xi #endif
7066*53ee8cc1Swenshuai.xi
7067*53ee8cc1Swenshuai.xi //JPEG_GO;
7068*53ee8cc1Swenshuai.xi
7069*53ee8cc1Swenshuai.xi // powner on JPD
7070*53ee8cc1Swenshuai.xi #ifndef CMODEL
7071*53ee8cc1Swenshuai.xi MDrv_JPD_PowerOn();
7072*53ee8cc1Swenshuai.xi #endif
7073*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MDrv_JPD_PowerOn OK!!\n");
7074*53ee8cc1Swenshuai.xi
7075*53ee8cc1Swenshuai.xi _u8DecodeType = pInitParam->u8DecodeType;
7076*53ee8cc1Swenshuai.xi
7077*53ee8cc1Swenshuai.xi _u32In_buf_left = pInitParam->u32DecByteRead;
7078*53ee8cc1Swenshuai.xi _bEOF_flag = pInitParam->bEOF;
7079*53ee8cc1Swenshuai.xi
7080*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@1, _pu8In_buf_ofs=0x%lx, _u32In_buf_left=0x%lx, _bEOF_flag=%d========\n",
7081*53ee8cc1Swenshuai.xi (MS_U32)_pu8In_buf_ofs, (MS_U32)_u32In_buf_left, _bEOF_flag);
7082*53ee8cc1Swenshuai.xi // Try to get more bytes.
7083*53ee8cc1Swenshuai.xi if(!JPEG_force_fill_read_buffer(_u32In_buf_left))
7084*53ee8cc1Swenshuai.xi {
7085*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_force_fill_read_buffer failed!!!\n");
7086*53ee8cc1Swenshuai.xi _u32In_buf_left = pInitParam->u32DecByteRead;
7087*53ee8cc1Swenshuai.xi }
7088*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@2, _pu8In_buf_ofs=0x%lx, _u32In_buf_left=0x%lx, _bEOF_flag=%d========\n",
7089*53ee8cc1Swenshuai.xi (MS_U32)_pu8In_buf_ofs, (MS_U32)_u32In_buf_left, _bEOF_flag);
7090*53ee8cc1Swenshuai.xi
7091*53ee8cc1Swenshuai.xi
7092*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
7093*53ee8cc1Swenshuai.xi if(_u32In_buf_MPO_left ==0xFFFFFFFFUL)
7094*53ee8cc1Swenshuai.xi {
7095*53ee8cc1Swenshuai.xi _pu8In_buf_MPO_ofs = (MS_U8*)_pu8In_buf;
7096*53ee8cc1Swenshuai.xi _u32In_buf_MPO_left = _u32In_buf_left;
7097*53ee8cc1Swenshuai.xi mpo_load_data = TRUE;
7098*53ee8cc1Swenshuai.xi bIsMPOFormat = FALSE;
7099*53ee8cc1Swenshuai.xi u32MPFOffset = 0;
7100*53ee8cc1Swenshuai.xi _u32App2MarkerOffset = 0;
7101*53ee8cc1Swenshuai.xi
7102*53ee8cc1Swenshuai.xi //Init MPO database
7103*53ee8cc1Swenshuai.xi JPEG_InitMPO();
7104*53ee8cc1Swenshuai.xi }
7105*53ee8cc1Swenshuai.xi #endif
7106*53ee8cc1Swenshuai.xi
7107*53ee8cc1Swenshuai.xi u32DataOffset = 0;
7108*53ee8cc1Swenshuai.xi u32SOFOffset = 0;
7109*53ee8cc1Swenshuai.xi
7110*53ee8cc1Swenshuai.xi JPEG_init_thumbnail();
7111*53ee8cc1Swenshuai.xi
7112*53ee8cc1Swenshuai.xi if (_u8DecodeType == E_JPEG_TYPE_MJPEG)
7113*53ee8cc1Swenshuai.xi {
7114*53ee8cc1Swenshuai.xi __bIsMjpeg = TRUE;
7115*53ee8cc1Swenshuai.xi __u32RealMjpegBase = MRC_BUFFER_ADDR;
7116*53ee8cc1Swenshuai.xi __u32TrickyMjpegBase = INTERNAL_BUFFER_ADDR;
7117*53ee8cc1Swenshuai.xi
7118*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
7119*53ee8cc1Swenshuai.xi }
7120*53ee8cc1Swenshuai.xi
7121*53ee8cc1Swenshuai.xi if(!JPEG_decode_init())
7122*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7123*53ee8cc1Swenshuai.xi
7124*53ee8cc1Swenshuai.xi if (bMHEG5)
7125*53ee8cc1Swenshuai.xi {
7126*53ee8cc1Swenshuai.xi if(_Error_code == E_JPEG_UNSUPPORTED_MARKER)
7127*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7128*53ee8cc1Swenshuai.xi }
7129*53ee8cc1Swenshuai.xi
7130*53ee8cc1Swenshuai.xi #ifndef CMODEL
7131*53ee8cc1Swenshuai.xi //init mempool for progressive decoding.
7132*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7133*53ee8cc1Swenshuai.xi if (pInitParam->bInitMem && (_bProgressive_flag || MApi_JPEG_Is_RGB_CMYK()))
7134*53ee8cc1Swenshuai.xi #else
7135*53ee8cc1Swenshuai.xi if (pInitParam->bInitMem && _bProgressive_flag)
7136*53ee8cc1Swenshuai.xi #endif
7137*53ee8cc1Swenshuai.xi #endif
7138*53ee8cc1Swenshuai.xi {
7139*53ee8cc1Swenshuai.xi if(!JPEG_MEMORY_init_mempool((void *)(INTERNAL_BUFFER_ADDR + JPEG_DEFAULT_EXIF_SIZE)
7140*53ee8cc1Swenshuai.xi , (INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE)))
7141*53ee8cc1Swenshuai.xi {
7142*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_MEMORY_init_mempool FAIL!!\n");
7143*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7144*53ee8cc1Swenshuai.xi }
7145*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_MEMORY_init_mempool OK!!\n");
7146*53ee8cc1Swenshuai.xi }
7147*53ee8cc1Swenshuai.xi
7148*53ee8cc1Swenshuai.xi //JPEG_GO;
7149*53ee8cc1Swenshuai.xi
7150*53ee8cc1Swenshuai.xi #ifdef CMODEL
7151*53ee8cc1Swenshuai.xi _bReady_flag = TRUE;
7152*53ee8cc1Swenshuai.xi #endif
7153*53ee8cc1Swenshuai.xi
7154*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
7155*53ee8cc1Swenshuai.xi }
7156*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7157*53ee8cc1Swenshuai.xi /********************************************************************/
7158*53ee8cc1Swenshuai.xi ///Decode JPEG header
7159*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result : JPEG header decode status
7160*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Success
7161*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Failed
7162*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_DecodeHdr(void)7163*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_DecodeHdr(void)
7164*53ee8cc1Swenshuai.xi {
7165*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7166*53ee8cc1Swenshuai.xi MS_U8 mcu_width, mcu_height;
7167*53ee8cc1Swenshuai.xi MS_U16 pic_width = _u16Image_x_size;
7168*53ee8cc1Swenshuai.xi MS_U16 pic_height = _u16Image_y_size;
7169*53ee8cc1Swenshuai.xi MS_U8 Y_VSF = _u8Comp_v_samp[0];
7170*53ee8cc1Swenshuai.xi MS_U8 Y_HSF = _u8Comp_h_samp[0];
7171*53ee8cc1Swenshuai.xi #endif
7172*53ee8cc1Swenshuai.xi
7173*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
7174*53ee8cc1Swenshuai.xi u32MeasureDecodeTime = MsOS_GetSystemTime();
7175*53ee8cc1Swenshuai.xi u32MeasureDecodeTimeSW = 0;
7176*53ee8cc1Swenshuai.xi u32MeasureDecodeTimeHW = 0;
7177*53ee8cc1Swenshuai.xi #endif
7178*53ee8cc1Swenshuai.xi
7179*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7180*53ee8cc1Swenshuai.xi {
7181*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7182*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7183*53ee8cc1Swenshuai.xi }
7184*53ee8cc1Swenshuai.xi
7185*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7186*53ee8cc1Swenshuai.xi
7187*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
7188*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
7189*53ee8cc1Swenshuai.xi {
7190*53ee8cc1Swenshuai.xi return ( E_JPEG_FAILED );
7191*53ee8cc1Swenshuai.xi }
7192*53ee8cc1Swenshuai.xi #endif
7193*53ee8cc1Swenshuai.xi
7194*53ee8cc1Swenshuai.xi if(!JPEG_init_frame())
7195*53ee8cc1Swenshuai.xi {
7196*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
7197*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7198*53ee8cc1Swenshuai.xi }
7199*53ee8cc1Swenshuai.xi
7200*53ee8cc1Swenshuai.xi if ( _bProgressive_flag )
7201*53ee8cc1Swenshuai.xi {
7202*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
7203*53ee8cc1Swenshuai.xi if(!JPEG_init_progressive())
7204*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7205*53ee8cc1Swenshuai.xi #endif
7206*53ee8cc1Swenshuai.xi }
7207*53ee8cc1Swenshuai.xi else
7208*53ee8cc1Swenshuai.xi {
7209*53ee8cc1Swenshuai.xi if(!JPEG_init_sequential())
7210*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7211*53ee8cc1Swenshuai.xi }
7212*53ee8cc1Swenshuai.xi
7213*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7214*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
7215*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
7216*53ee8cc1Swenshuai.xi {
7217*53ee8cc1Swenshuai.xi if ( ( mcu_width = pic_width % ( Y_HSF * 8 ) ) )
7218*53ee8cc1Swenshuai.xi {
7219*53ee8cc1Swenshuai.xi pic_width += ( Y_HSF * 8 - mcu_width );
7220*53ee8cc1Swenshuai.xi }
7221*53ee8cc1Swenshuai.xi
7222*53ee8cc1Swenshuai.xi if ( ( mcu_height = pic_height% ( Y_VSF * 8 ) ) )
7223*53ee8cc1Swenshuai.xi {
7224*53ee8cc1Swenshuai.xi pic_height += ( Y_VSF * 8 - mcu_height );
7225*53ee8cc1Swenshuai.xi }
7226*53ee8cc1Swenshuai.xi
7227*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Y_HSF = %d and Y_VSF = %d\n",Y_HSF, Y_VSF);
7228*53ee8cc1Swenshuai.xi
7229*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mcu_width = %d and mcu_height = %d\n",mcu_width, mcu_height);
7230*53ee8cc1Swenshuai.xi
7231*53ee8cc1Swenshuai.xi _u16NonAlignmentImage_x_size = pic_width;
7232*53ee8cc1Swenshuai.xi _u16NonAlignmentImage_y_size = _u16Image_y_size;
7233*53ee8cc1Swenshuai.xi _u16Image_x_size = pic_width;
7234*53ee8cc1Swenshuai.xi _u16Image_y_size = pic_height;
7235*53ee8cc1Swenshuai.xi
7236*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Width = %d and Height = %d\n",JPEG_MAX_WIDTH, JPEG_MAX_HEIGHT);
7237*53ee8cc1Swenshuai.xi
7238*53ee8cc1Swenshuai.xi //Set the Scale down variable
7239*53ee8cc1Swenshuai.xi if(_u16Image_x_size > JPEG_MAX_WIDTH*4 || _u16Image_y_size>JPEG_MAX_HEIGHT*4)
7240*53ee8cc1Swenshuai.xi {
7241*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = E_JPD_DOWNSCALE_EIGHTH;
7242*53ee8cc1Swenshuai.xi _u16Image_x_size= (_u16Image_x_size/ 64)*64;
7243*53ee8cc1Swenshuai.xi _u16Image_x_size = _u16Image_x_size/ 8;
7244*53ee8cc1Swenshuai.xi _u16Image_y_size = _u16Image_y_size/ 8;
7245*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/8!!\n");
7246*53ee8cc1Swenshuai.xi }
7247*53ee8cc1Swenshuai.xi else if(_u16Image_x_size > JPEG_MAX_WIDTH*2 || _u16Image_y_size>JPEG_MAX_HEIGHT*2)
7248*53ee8cc1Swenshuai.xi {
7249*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = E_JPD_DOWNSCALE_FOURTH;
7250*53ee8cc1Swenshuai.xi _u16Image_x_size= (_u16Image_x_size/ 32)*32;
7251*53ee8cc1Swenshuai.xi _u16Image_x_size = _u16Image_x_size/ 4;
7252*53ee8cc1Swenshuai.xi _u16Image_y_size = _u16Image_y_size/ 4;
7253*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/4!!\n");
7254*53ee8cc1Swenshuai.xi }
7255*53ee8cc1Swenshuai.xi else if (_u16Image_x_size > JPEG_MAX_WIDTH || _u16Image_y_size>JPEG_MAX_HEIGHT)
7256*53ee8cc1Swenshuai.xi {
7257*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = E_JPD_DOWNSCALE_HALF;
7258*53ee8cc1Swenshuai.xi _u16Image_x_size= (_u16Image_x_size/ 16)*16;
7259*53ee8cc1Swenshuai.xi _u16Image_x_size = _u16Image_x_size/ 2;
7260*53ee8cc1Swenshuai.xi _u16Image_y_size = _u16Image_y_size/ 2;
7261*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/2!!\n");
7262*53ee8cc1Swenshuai.xi }
7263*53ee8cc1Swenshuai.xi else
7264*53ee8cc1Swenshuai.xi {
7265*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale 1/1!!\n");
7266*53ee8cc1Swenshuai.xi _u8ScaleDownFactor = E_JPD_DOWNSCALE_ORG;
7267*53ee8cc1Swenshuai.xi
7268*53ee8cc1Swenshuai.xi }
7269*53ee8cc1Swenshuai.xi
7270*53ee8cc1Swenshuai.xi _u16PaddingMcuNumber = (_u16Image_x_size << _u8ScaleDownFactor)/gu8Max_mcu_x_size;
7271*53ee8cc1Swenshuai.xi _u32Max_blocks_per_row = _u16PaddingMcuNumber* _u16Max_blocks_per_mcu;
7272*53ee8cc1Swenshuai.xi
7273*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale width : %d\n",_u16Image_x_size);
7274*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale height : %d\n",_u16Image_y_size);
7275*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale MCU : %d\n",_u16PaddingMcuNumber);
7276*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("down scale MCU : %ld\n",_u32Max_blocks_per_row);
7277*53ee8cc1Swenshuai.xi }
7278*53ee8cc1Swenshuai.xi #endif
7279*53ee8cc1Swenshuai.xi
7280*53ee8cc1Swenshuai.xi if (__bIsMjpeg)
7281*53ee8cc1Swenshuai.xi {
7282*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("MJPEG Read buffer address RECOVER : 0x%lx - 0x%lx + 0x%lx ",
7283*53ee8cc1Swenshuai.xi MS_VA2PA(MRC_BUFFER_ADDR), MS_VA2PA(__u32TrickyMjpegBase), MS_VA2PA(__u32RealMjpegBase));
7284*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR -= __u32TrickyMjpegBase;
7285*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR += __u32RealMjpegBase;
7286*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG ("= 0x%lx\n", MS_VA2PA(MRC_BUFFER_ADDR));
7287*53ee8cc1Swenshuai.xi }
7288*53ee8cc1Swenshuai.xi
7289*53ee8cc1Swenshuai.xi return ( E_JPEG_OKAY );
7290*53ee8cc1Swenshuai.xi }
7291*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7292*53ee8cc1Swenshuai.xi /********************************************************************/
7293*53ee8cc1Swenshuai.xi ///Decode JPEG data (baseline & progressive)
7294*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result : JPEG decode status
7295*53ee8cc1Swenshuai.xi /// - E_JPEG_DONE : For progressive decoding one line done.
7296*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Success
7297*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Failed
7298*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_Decode(void)7299*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_Decode(void)
7300*53ee8cc1Swenshuai.xi {
7301*53ee8cc1Swenshuai.xi JPEG_Result retVal = E_JPEG_FAILED;
7302*53ee8cc1Swenshuai.xi
7303*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7304*53ee8cc1Swenshuai.xi {
7305*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7306*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
7307*53ee8cc1Swenshuai.xi }
7308*53ee8cc1Swenshuai.xi
7309*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: _bProgressive_flag = %d\n", __FUNCTION__ , _bProgressive_flag);
7310*53ee8cc1Swenshuai.xi
7311*53ee8cc1Swenshuai.xi if(_bProgressive_flag)
7312*53ee8cc1Swenshuai.xi {
7313*53ee8cc1Swenshuai.xi #if SUPPORT_PROGRESSIVE_MODE || defined(CMODEL)
7314*53ee8cc1Swenshuai.xi retVal = JPEG_Progressive_Decode();
7315*53ee8cc1Swenshuai.xi #endif
7316*53ee8cc1Swenshuai.xi }
7317*53ee8cc1Swenshuai.xi else
7318*53ee8cc1Swenshuai.xi {
7319*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7320*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
7321*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
7322*53ee8cc1Swenshuai.xi {
7323*53ee8cc1Swenshuai.xi retVal = msAPI_JPEG_Baseline_Decode();
7324*53ee8cc1Swenshuai.xi return retVal;
7325*53ee8cc1Swenshuai.xi }
7326*53ee8cc1Swenshuai.xi #endif
7327*53ee8cc1Swenshuai.xi
7328*53ee8cc1Swenshuai.xi #ifndef CMODEL
7329*53ee8cc1Swenshuai.xi JPEG_StartDecode();
7330*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
7331*53ee8cc1Swenshuai.xi u32MeasureDecodeTimeSW = MsOS_GetSystemTime()-u32MeasureDecodeTime;
7332*53ee8cc1Swenshuai.xi u32MeasureDecodeTime = MsOS_GetSystemTime();
7333*53ee8cc1Swenshuai.xi #endif
7334*53ee8cc1Swenshuai.xi if(_Error_code == E_JPEG_NO_ERROR)
7335*53ee8cc1Swenshuai.xi retVal = E_JPEG_OKAY;
7336*53ee8cc1Swenshuai.xi else
7337*53ee8cc1Swenshuai.xi retVal = E_JPEG_FAILED;
7338*53ee8cc1Swenshuai.xi #endif
7339*53ee8cc1Swenshuai.xi }
7340*53ee8cc1Swenshuai.xi return retVal;
7341*53ee8cc1Swenshuai.xi }
7342*53ee8cc1Swenshuai.xi
7343*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
_PrintOutputMem(MS_U32 u32addr,MS_U32 u32Size)7344*53ee8cc1Swenshuai.xi static void _PrintOutputMem(MS_U32 u32addr, MS_U32 u32Size)
7345*53ee8cc1Swenshuai.xi {
7346*53ee8cc1Swenshuai.xi u32Size = ALIGN_16(u32Size);
7347*53ee8cc1Swenshuai.xi static MS_U8 fileName2[]={'/','u','s','b','/','s','d','a','1','/','0','0', '0', '0', 'x','0','0', '0', '0', '_','0', '0', '0', '.', 'y', 'u', 'y', 'v',0};
7348*53ee8cc1Swenshuai.xi fileName2[10]=MApi_JPEG_GetWidth()/1000+'0';
7349*53ee8cc1Swenshuai.xi fileName2[11]=(MApi_JPEG_GetWidth()/100)%10+'0';
7350*53ee8cc1Swenshuai.xi fileName2[12]=(MApi_JPEG_GetWidth()/10)%10+'0';
7351*53ee8cc1Swenshuai.xi fileName2[13]=MApi_JPEG_GetWidth()%10+'0';
7352*53ee8cc1Swenshuai.xi fileName2[15]=MApi_JPEG_GetHeight()/1000+'0';
7353*53ee8cc1Swenshuai.xi fileName2[16]=(MApi_JPEG_GetHeight()/100)%10+'0';
7354*53ee8cc1Swenshuai.xi fileName2[17]=(MApi_JPEG_GetHeight()/10)%10+'0';
7355*53ee8cc1Swenshuai.xi fileName2[18]=MApi_JPEG_GetHeight()%10+'0';
7356*53ee8cc1Swenshuai.xi
7357*53ee8cc1Swenshuai.xi fileName2[22]++;
7358*53ee8cc1Swenshuai.xi if(fileName2[22] > '9')
7359*53ee8cc1Swenshuai.xi {
7360*53ee8cc1Swenshuai.xi fileName2[21]++;
7361*53ee8cc1Swenshuai.xi fileName2[22] = '0';
7362*53ee8cc1Swenshuai.xi }
7363*53ee8cc1Swenshuai.xi if(fileName2[21] > '9')
7364*53ee8cc1Swenshuai.xi {
7365*53ee8cc1Swenshuai.xi fileName2[20]++;
7366*53ee8cc1Swenshuai.xi fileName2[21] = '0';
7367*53ee8cc1Swenshuai.xi }
7368*53ee8cc1Swenshuai.xi
7369*53ee8cc1Swenshuai.xi FILE *outBinfp;
7370*53ee8cc1Swenshuai.xi if((outBinfp = fopen((char *)fileName2, "wb"))==NULL) {
7371*53ee8cc1Swenshuai.xi printf("Can't open output yuyv file\n");
7372*53ee8cc1Swenshuai.xi }
7373*53ee8cc1Swenshuai.xi else
7374*53ee8cc1Swenshuai.xi {
7375*53ee8cc1Swenshuai.xi printf("open output yuyv file success\n");
7376*53ee8cc1Swenshuai.xi }
7377*53ee8cc1Swenshuai.xi
7378*53ee8cc1Swenshuai.xi fwrite((void *)u32addr, 1, u32Size, outBinfp);
7379*53ee8cc1Swenshuai.xi fclose(outBinfp);
7380*53ee8cc1Swenshuai.xi
7381*53ee8cc1Swenshuai.xi }
7382*53ee8cc1Swenshuai.xi #endif
7383*53ee8cc1Swenshuai.xi
7384*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7385*53ee8cc1Swenshuai.xi /********************************************************************/
7386*53ee8cc1Swenshuai.xi /// Free all block of JPD. Complete destroy the decoder object.
7387*53ee8cc1Swenshuai.xi /// It could be called at any time.
7388*53ee8cc1Swenshuai.xi ///@return None
7389*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_Exit(void)7390*53ee8cc1Swenshuai.xi void _MApi_JPEG_Exit(void)
7391*53ee8cc1Swenshuai.xi {
7392*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7393*53ee8cc1Swenshuai.xi {
7394*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7395*53ee8cc1Swenshuai.xi return;
7396*53ee8cc1Swenshuai.xi }
7397*53ee8cc1Swenshuai.xi else
7398*53ee8cc1Swenshuai.xi {
7399*53ee8cc1Swenshuai.xi _bIsInit = FALSE;
7400*53ee8cc1Swenshuai.xi }
7401*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7402*53ee8cc1Swenshuai.xi #ifndef CMODEL
7403*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MApi_JPEG_GetCurReadStatus : \nCurVidx = %d, CurRow = %d, CurCol = %d ",
7404*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurVidx(),
7405*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurRow(),
7406*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurCol());
7407*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%lx\n", MDrv_JPD_GetCurMRCAddr());
7408*53ee8cc1Swenshuai.xi
7409*53ee8cc1Swenshuai.xi MDrv_JPD_PowerOff();
7410*53ee8cc1Swenshuai.xi #endif
7411*53ee8cc1Swenshuai.xi JPEG_free_all_blocks();
7412*53ee8cc1Swenshuai.xi
7413*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7414*53ee8cc1Swenshuai.xi bEnableCMYK = TRUE;
7415*53ee8cc1Swenshuai.xi bEnableRGB = TRUE;
7416*53ee8cc1Swenshuai.xi #endif
7417*53ee8cc1Swenshuai.xi
7418*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
7419*53ee8cc1Swenshuai.xi _u32In_buf_MPO_left = 0xFFFFFFFFUL; // reset _u32In_buf_MPO_left to U32_MAX
7420*53ee8cc1Swenshuai.xi bIsMPOFormat = FALSE;
7421*53ee8cc1Swenshuai.xi #endif
7422*53ee8cc1Swenshuai.xi
7423*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
7424*53ee8cc1Swenshuai.xi fclose(logBinfp);
7425*53ee8cc1Swenshuai.xi logBinfp = NULL;
7426*53ee8cc1Swenshuai.xi #endif
7427*53ee8cc1Swenshuai.xi
7428*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: done!!\n", __FUNCTION__);
7429*53ee8cc1Swenshuai.xi return;
7430*53ee8cc1Swenshuai.xi }
7431*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7432*53ee8cc1Swenshuai.xi /********************************************************************/
7433*53ee8cc1Swenshuai.xi ///Get JPEG decoder error code
7434*53ee8cc1Swenshuai.xi ///@return JPEG decoder error code
7435*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetErrorCode(void)7436*53ee8cc1Swenshuai.xi JPEG_ErrCode _MApi_JPEG_GetErrorCode(void)
7437*53ee8cc1Swenshuai.xi {
7438*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7439*53ee8cc1Swenshuai.xi {
7440*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7441*53ee8cc1Swenshuai.xi return E_JPEG_NOT_INIT;
7442*53ee8cc1Swenshuai.xi }
7443*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: ErrCode = %d\n", __FUNCTION__ , _Error_code);
7444*53ee8cc1Swenshuai.xi return _Error_code;
7445*53ee8cc1Swenshuai.xi }
7446*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7447*53ee8cc1Swenshuai.xi #if 0 //move to APP
7448*53ee8cc1Swenshuai.xi /********************************************************************/
7449*53ee8cc1Swenshuai.xi ///Preload buffer from JPEG content
7450*53ee8cc1Swenshuai.xi ///The calling order must be HIGH -> LOW -> HIGH -> LOW....
7451*53ee8cc1Swenshuai.xi ///or LOW -> HIGH -> LOW -> HIGH.
7452*53ee8cc1Swenshuai.xi ///Since the file offset is maintained out side, we assume it won't be out of order.
7453*53ee8cc1Swenshuai.xi ///@param u8Type \b IN indicate which parts of buffer wants to load
7454*53ee8cc1Swenshuai.xi ///@return true or false
7455*53ee8cc1Swenshuai.xi /********************************************************************/
7456*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_PreLoadBuffer(MS_U8 u8Type)
7457*53ee8cc1Swenshuai.xi {
7458*53ee8cc1Swenshuai.xi MS_S32 bytes_read;
7459*53ee8cc1Swenshuai.xi MS_U8 *pBuffer_addr, Position;
7460*53ee8cc1Swenshuai.xi MS_U32 buf_left = 0;
7461*53ee8cc1Swenshuai.xi
7462*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MApi_JPEG_PreLoadBuffer: type = %d\n", u8Type);
7463*53ee8cc1Swenshuai.xi #if 1
7464*53ee8cc1Swenshuai.xi if(MAPi_JPEG_ProcessEOF(u8Type))
7465*53ee8cc1Swenshuai.xi return TRUE;
7466*53ee8cc1Swenshuai.xi #else
7467*53ee8cc1Swenshuai.xi if ( _bEOF_flag )
7468*53ee8cc1Swenshuai.xi {
7469*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("end of file!!\n");
7470*53ee8cc1Swenshuai.xi MDrv_UART_PutChar('t'); // DO NOT MARK THIS, THIS FUNCTION MUST BE CALLED. OR THE JPD DECODE WILL FAIL for LARGE FILES
7471*53ee8cc1Swenshuai.xi if(u8Type==E_JPEG_BUFFER_HIGH)
7472*53ee8cc1Swenshuai.xi {
7473*53ee8cc1Swenshuai.xi // clear MRC high portion read complete event
7474*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE);
7475*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
7476*53ee8cc1Swenshuai.xi }
7477*53ee8cc1Swenshuai.xi else
7478*53ee8cc1Swenshuai.xi {
7479*53ee8cc1Swenshuai.xi // clear MRC low portion read complete event
7480*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBL_DONE);
7481*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
7482*53ee8cc1Swenshuai.xi }
7483*53ee8cc1Swenshuai.xi return TRUE;
7484*53ee8cc1Swenshuai.xi }
7485*53ee8cc1Swenshuai.xi #endif
7486*53ee8cc1Swenshuai.xi
7487*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
7488*53ee8cc1Swenshuai.xi {
7489*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ERROR\n");
7490*53ee8cc1Swenshuai.xi return ( FALSE );
7491*53ee8cc1Swenshuai.xi }
7492*53ee8cc1Swenshuai.xi
7493*53ee8cc1Swenshuai.xi if(u8Type==E_JPEG_BUFFER_HIGH)
7494*53ee8cc1Swenshuai.xi {
7495*53ee8cc1Swenshuai.xi pBuffer_addr = _pu8In_buf + (MRC_BUFFER_SIZE/2);
7496*53ee8cc1Swenshuai.xi Position = 1;
7497*53ee8cc1Swenshuai.xi }
7498*53ee8cc1Swenshuai.xi else
7499*53ee8cc1Swenshuai.xi {
7500*53ee8cc1Swenshuai.xi pBuffer_addr = _pu8In_buf;
7501*53ee8cc1Swenshuai.xi Position = 0;
7502*53ee8cc1Swenshuai.xi }
7503*53ee8cc1Swenshuai.xi
7504*53ee8cc1Swenshuai.xi #if 1
7505*53ee8cc1Swenshuai.xi {
7506*53ee8cc1Swenshuai.xi MS_BOOL EOF_flag = FALSE;
7507*53ee8cc1Swenshuai.xi do
7508*53ee8cc1Swenshuai.xi {
7509*53ee8cc1Swenshuai.xi bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MRC_BUFFER_SIZE/2 - buf_left, &EOF_flag, _pStream, Position );
7510*53ee8cc1Swenshuai.xi
7511*53ee8cc1Swenshuai.xi if ( bytes_read == -1 )
7512*53ee8cc1Swenshuai.xi {
7513*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_STREAM_READ );
7514*53ee8cc1Swenshuai.xi }
7515*53ee8cc1Swenshuai.xi
7516*53ee8cc1Swenshuai.xi buf_left += bytes_read;
7517*53ee8cc1Swenshuai.xi // _Total_Decoded_Size += bytes_read;
7518*53ee8cc1Swenshuai.xi } while(( buf_left < MRC_BUFFER_SIZE/2 ) && ( !EOF_flag ));
7519*53ee8cc1Swenshuai.xi MAPi_JPEG_FileReadInfo(buf_left, EOF_flag);
7520*53ee8cc1Swenshuai.xi }
7521*53ee8cc1Swenshuai.xi #else
7522*53ee8cc1Swenshuai.xi do
7523*53ee8cc1Swenshuai.xi {
7524*53ee8cc1Swenshuai.xi bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MRC_BUFFER_SIZE/2 - buf_left, &_bEOF_flag, _pStream, Position );
7525*53ee8cc1Swenshuai.xi
7526*53ee8cc1Swenshuai.xi if ( bytes_read == -1 )
7527*53ee8cc1Swenshuai.xi {
7528*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_STREAM_READ );
7529*53ee8cc1Swenshuai.xi }
7530*53ee8cc1Swenshuai.xi
7531*53ee8cc1Swenshuai.xi buf_left += bytes_read;
7532*53ee8cc1Swenshuai.xi //// _Total_Decoded_Size += bytes_read;
7533*53ee8cc1Swenshuai.xi } while(( buf_left < MRC_BUFFER_SIZE/2 ) && ( !_bEOF_flag ));
7534*53ee8cc1Swenshuai.xi #endif
7535*53ee8cc1Swenshuai.xi
7536*53ee8cc1Swenshuai.xi
7537*53ee8cc1Swenshuai.xi #if 1
7538*53ee8cc1Swenshuai.xi MApi_JPEG_SetMRBufferValid(u8Type);
7539*53ee8cc1Swenshuai.xi #else
7540*53ee8cc1Swenshuai.xi if(u8Type==E_JPEG_BUFFER_HIGH)
7541*53ee8cc1Swenshuai.xi {
7542*53ee8cc1Swenshuai.xi // clear MRC high portion read complete event
7543*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE);
7544*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
7545*53ee8cc1Swenshuai.xi // mark high portion valid
7546*53ee8cc1Swenshuai.xi //MDrv_Write2Byte( BK_JPD_MCONFIG, (MDrv_Read2Byte(BK_JPD_MCONFIG) & ~0x0003) | JPD_H_VLD);
7547*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_H_VLD);
7548*53ee8cc1Swenshuai.xi }
7549*53ee8cc1Swenshuai.xi else
7550*53ee8cc1Swenshuai.xi {
7551*53ee8cc1Swenshuai.xi // clear MRC low portion read complete event
7552*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBL_DONE);
7553*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
7554*53ee8cc1Swenshuai.xi // mark low portion valid
7555*53ee8cc1Swenshuai.xi //MDrv_Write2Byte( BK_JPD_MCONFIG, (MDrv_Read2Byte(BK_JPD_MCONFIG) & ~0x0003) | JPD_L_VLD);
7556*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_L_VLD);
7557*53ee8cc1Swenshuai.xi }
7558*53ee8cc1Swenshuai.xi #endif
7559*53ee8cc1Swenshuai.xi return TRUE;
7560*53ee8cc1Swenshuai.xi }
7561*53ee8cc1Swenshuai.xi #else // for APP reference
7562*53ee8cc1Swenshuai.xi #if 0
7563*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_PreLoadBuffer(MS_U8 u8MRBuffType, MS_U8* u8In_buf, MS_U32 MaxBufSize)
7564*53ee8cc1Swenshuai.xi {
7565*53ee8cc1Swenshuai.xi MS_S32 bytes_read;
7566*53ee8cc1Swenshuai.xi MS_U8 *pBuffer_addr, Position;
7567*53ee8cc1Swenshuai.xi MS_U32 buf_left = 0;
7568*53ee8cc1Swenshuai.xi MS_BOOL EOF_flag = FALSE;
7569*53ee8cc1Swenshuai.xi
7570*53ee8cc1Swenshuai.xi if(MAPi_JPEG_ProcessEOF(u8MRBuffType))
7571*53ee8cc1Swenshuai.xi return TRUE;
7572*53ee8cc1Swenshuai.xi
7573*53ee8cc1Swenshuai.xi if(MaxBufSize > (MRC_BUFFER_SIZE/2))
7574*53ee8cc1Swenshuai.xi {
7575*53ee8cc1Swenshuai.xi return FALSE;
7576*53ee8cc1Swenshuai.xi }
7577*53ee8cc1Swenshuai.xi
7578*53ee8cc1Swenshuai.xi if(u8MRBuffType==E_JPEG_BUFFER_HIGH)
7579*53ee8cc1Swenshuai.xi {
7580*53ee8cc1Swenshuai.xi pBuffer_addr = u8In_buf + (MRC_BUFFER_SIZE/2);
7581*53ee8cc1Swenshuai.xi Position = 1;
7582*53ee8cc1Swenshuai.xi }
7583*53ee8cc1Swenshuai.xi else
7584*53ee8cc1Swenshuai.xi {
7585*53ee8cc1Swenshuai.xi pBuffer_addr = u8In_buf;
7586*53ee8cc1Swenshuai.xi Position = 0;
7587*53ee8cc1Swenshuai.xi }
7588*53ee8cc1Swenshuai.xi
7589*53ee8cc1Swenshuai.xi do
7590*53ee8cc1Swenshuai.xi {
7591*53ee8cc1Swenshuai.xi // bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MRC_BUFFER_SIZE/2 - buf_left, &EOF_flag, _pStream, Position );
7592*53ee8cc1Swenshuai.xi bytes_read = JPEG_FILE_read( pBuffer_addr + buf_left, MaxBufSize - buf_left, &EOF_flag, _pStream, Position );
7593*53ee8cc1Swenshuai.xi
7594*53ee8cc1Swenshuai.xi if ( bytes_read == -1 )
7595*53ee8cc1Swenshuai.xi {
7596*53ee8cc1Swenshuai.xi MApi_JPEG_SetErrCode( E_JPEG_STREAM_READ );
7597*53ee8cc1Swenshuai.xi return FALSE;
7598*53ee8cc1Swenshuai.xi }
7599*53ee8cc1Swenshuai.xi
7600*53ee8cc1Swenshuai.xi buf_left += bytes_read;
7601*53ee8cc1Swenshuai.xi // _Total_Decoded_Size += bytes_read;
7602*53ee8cc1Swenshuai.xi } while(( buf_left < MaxBufSize ) && ( !EOF_flag ));
7603*53ee8cc1Swenshuai.xi MAPi_JPEG_FileReadInfo(buf_left, EOF_flag);
7604*53ee8cc1Swenshuai.xi MApi_JPEG_SetMRBufferValid(u8MRBuffType);
7605*53ee8cc1Swenshuai.xi return TRUE;
7606*53ee8cc1Swenshuai.xi }
7607*53ee8cc1Swenshuai.xi #endif
7608*53ee8cc1Swenshuai.xi #endif
7609*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7610*53ee8cc1Swenshuai.xi /********************************************************************/
7611*53ee8cc1Swenshuai.xi ///Get JPD EVENT FLAG
7612*53ee8cc1Swenshuai.xi ///@return \b JPEG_Event : JPEG event flag
7613*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetJPDEventFlag(void)7614*53ee8cc1Swenshuai.xi JPEG_Event _MApi_JPEG_GetJPDEventFlag(void)
7615*53ee8cc1Swenshuai.xi {
7616*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7617*53ee8cc1Swenshuai.xi {
7618*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7619*53ee8cc1Swenshuai.xi return E_JPEG_EVENT_DEC_ERROR_MASK;
7620*53ee8cc1Swenshuai.xi }
7621*53ee8cc1Swenshuai.xi
7622*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7623*53ee8cc1Swenshuai.xi // It's pure software decode
7624*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
7625*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
7626*53ee8cc1Swenshuai.xi {
7627*53ee8cc1Swenshuai.xi return E_JPEG_EVENT_DEC_DONE;
7628*53ee8cc1Swenshuai.xi }
7629*53ee8cc1Swenshuai.xi #endif
7630*53ee8cc1Swenshuai.xi
7631*53ee8cc1Swenshuai.xi #ifndef CMODEL
7632*53ee8cc1Swenshuai.xi {
7633*53ee8cc1Swenshuai.xi JPEG_Event reg_val = (JPEG_Event)MDrv_JPD_GetEventFlag();
7634*53ee8cc1Swenshuai.xi if(reg_val!=0)
7635*53ee8cc1Swenshuai.xi {
7636*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: reg_val = 0x%04X\n", __FUNCTION__ , reg_val);
7637*53ee8cc1Swenshuai.xi }
7638*53ee8cc1Swenshuai.xi if(E_JPEG_EVENT_DEC_DONE & reg_val)
7639*53ee8cc1Swenshuai.xi {
7640*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
7641*53ee8cc1Swenshuai.xi u32MeasureDecodeTimeHW = MsOS_GetSystemTime()-u32MeasureDecodeTime;
7642*53ee8cc1Swenshuai.xi printf_red("SW decode header:[%ld]ms, HW decode: [%ld]ms\n", u32MeasureDecodeTimeSW, u32MeasureDecodeTimeHW);
7643*53ee8cc1Swenshuai.xi #endif
7644*53ee8cc1Swenshuai.xi if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API)
7645*53ee8cc1Swenshuai.xi {
7646*53ee8cc1Swenshuai.xi verJPD_CRC32_Init();
7647*53ee8cc1Swenshuai.xi verJPD_CRC32_Update((MS_U8 *)MWC_BUFFER_ADDR,
7648*53ee8cc1Swenshuai.xi (MS_U32)MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2);
7649*53ee8cc1Swenshuai.xi printf_red("[%dx%d], u32CRCResult=0x%lx\n",MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), verJPD_CRC32_GetResult());
7650*53ee8cc1Swenshuai.xi }
7651*53ee8cc1Swenshuai.xi
7652*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
7653*53ee8cc1Swenshuai.xi if(MApi_JPEG_GetWidth() <=JPEG_MAX_WIDTH
7654*53ee8cc1Swenshuai.xi && MApi_JPEG_GetHeight() <=JPEG_MAX_HEIGHT)
7655*53ee8cc1Swenshuai.xi {
7656*53ee8cc1Swenshuai.xi MS_U32 u32Size;
7657*53ee8cc1Swenshuai.xi u32Size = MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2;
7658*53ee8cc1Swenshuai.xi printf("[%dx%d], MWC_BUFFER_ADDR=0x%lx, size=0x%lx", MApi_JPEG_GetWidth(),
7659*53ee8cc1Swenshuai.xi MApi_JPEG_GetHeight(), MS_VA2PA(MWC_BUFFER_ADDR),u32Size);
7660*53ee8cc1Swenshuai.xi _PrintOutputMem(MWC_BUFFER_ADDR, u32Size);
7661*53ee8cc1Swenshuai.xi }
7662*53ee8cc1Swenshuai.xi #endif
7663*53ee8cc1Swenshuai.xi }
7664*53ee8cc1Swenshuai.xi return reg_val;
7665*53ee8cc1Swenshuai.xi }
7666*53ee8cc1Swenshuai.xi #else
7667*53ee8cc1Swenshuai.xi return E_JPEG_EVENT_DEC_DONE;
7668*53ee8cc1Swenshuai.xi #endif
7669*53ee8cc1Swenshuai.xi }
7670*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7671*53ee8cc1Swenshuai.xi /********************************************************************/
7672*53ee8cc1Swenshuai.xi ///Set JPD EVENT FLAG
7673*53ee8cc1Swenshuai.xi ///@param -eEvtVal \b IN : JPEG_Event
7674*53ee8cc1Swenshuai.xi ///@return None
7675*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)7676*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)
7677*53ee8cc1Swenshuai.xi {
7678*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7679*53ee8cc1Swenshuai.xi {
7680*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7681*53ee8cc1Swenshuai.xi return;
7682*53ee8cc1Swenshuai.xi }
7683*53ee8cc1Swenshuai.xi
7684*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7685*53ee8cc1Swenshuai.xi // It's pure software decode
7686*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
7687*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
7688*53ee8cc1Swenshuai.xi {
7689*53ee8cc1Swenshuai.xi return;
7690*53ee8cc1Swenshuai.xi }
7691*53ee8cc1Swenshuai.xi #endif
7692*53ee8cc1Swenshuai.xi
7693*53ee8cc1Swenshuai.xi #ifndef CMODEL
7694*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag((MS_U16)eEvtVal);
7695*53ee8cc1Swenshuai.xi #endif
7696*53ee8cc1Swenshuai.xi return;
7697*53ee8cc1Swenshuai.xi }
7698*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7699*53ee8cc1Swenshuai.xi /********************************************************************/
7700*53ee8cc1Swenshuai.xi ///Reset JPD -- Reset must be called before trigger JPD\n
7701*53ee8cc1Swenshuai.xi ///This function always issue pause command and wait for both MRC & MWC\n
7702*53ee8cc1Swenshuai.xi ///becoming inactive, then reset JPD.\n
7703*53ee8cc1Swenshuai.xi ///\b NOTE: The pause function can be only used by Pluto/T1/T2... not include ERIS.
7704*53ee8cc1Swenshuai.xi ///@return None
7705*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_Rst(void)7706*53ee8cc1Swenshuai.xi void _MApi_JPEG_Rst(void)
7707*53ee8cc1Swenshuai.xi {
7708*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7709*53ee8cc1Swenshuai.xi {
7710*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7711*53ee8cc1Swenshuai.xi return;
7712*53ee8cc1Swenshuai.xi }
7713*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7714*53ee8cc1Swenshuai.xi #ifndef CMODEL
7715*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MApi_JPEG_GetCurReadStatus : \nCurVidx = %d, CurRow = %d, CurCol = %d ",
7716*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurVidx(),
7717*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurRow(),
7718*53ee8cc1Swenshuai.xi MDrv_JPD_GetCurCol());
7719*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%lx\n", MDrv_JPD_GetCurMRCAddr());
7720*53ee8cc1Swenshuai.xi
7721*53ee8cc1Swenshuai.xi MDrv_JPD_Rst();
7722*53ee8cc1Swenshuai.xi #endif
7723*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:done!!\n", __FUNCTION__);
7724*53ee8cc1Swenshuai.xi return;
7725*53ee8cc1Swenshuai.xi }
7726*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7727*53ee8cc1Swenshuai.xi /********************************************************************/
7728*53ee8cc1Swenshuai.xi ///Power On JPEG decoder
7729*53ee8cc1Swenshuai.xi ///@return None
7730*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_PowerOn(void)7731*53ee8cc1Swenshuai.xi void _MApi_JPEG_PowerOn(void)
7732*53ee8cc1Swenshuai.xi {
7733*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7734*53ee8cc1Swenshuai.xi {
7735*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7736*53ee8cc1Swenshuai.xi return;
7737*53ee8cc1Swenshuai.xi }
7738*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7739*53ee8cc1Swenshuai.xi #ifndef CMODEL
7740*53ee8cc1Swenshuai.xi MDrv_JPD_PowerOn();
7741*53ee8cc1Swenshuai.xi #endif
7742*53ee8cc1Swenshuai.xi return;
7743*53ee8cc1Swenshuai.xi }
7744*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7745*53ee8cc1Swenshuai.xi /********************************************************************/
7746*53ee8cc1Swenshuai.xi ///Power Off JPEG decoder
7747*53ee8cc1Swenshuai.xi ///@return None
7748*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_PowerOff(void)7749*53ee8cc1Swenshuai.xi void _MApi_JPEG_PowerOff(void)
7750*53ee8cc1Swenshuai.xi {
7751*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7752*53ee8cc1Swenshuai.xi {
7753*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7754*53ee8cc1Swenshuai.xi return;
7755*53ee8cc1Swenshuai.xi }
7756*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7757*53ee8cc1Swenshuai.xi #ifndef CMODEL
7758*53ee8cc1Swenshuai.xi MDrv_JPD_PowerOff();
7759*53ee8cc1Swenshuai.xi #endif
7760*53ee8cc1Swenshuai.xi return;
7761*53ee8cc1Swenshuai.xi }
7762*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7763*53ee8cc1Swenshuai.xi /********************************************************************/
7764*53ee8cc1Swenshuai.xi ///Get current vertical line index written to memory
7765*53ee8cc1Swenshuai.xi ///@return Current vertical line index written to memory
7766*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetCurVidx(void)7767*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetCurVidx(void) //new
7768*53ee8cc1Swenshuai.xi {
7769*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7770*53ee8cc1Swenshuai.xi {
7771*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7772*53ee8cc1Swenshuai.xi return 0;
7773*53ee8cc1Swenshuai.xi }
7774*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7775*53ee8cc1Swenshuai.xi #ifndef CMODEL
7776*53ee8cc1Swenshuai.xi return MDrv_JPD_GetCurVidx();
7777*53ee8cc1Swenshuai.xi #else
7778*53ee8cc1Swenshuai.xi return 0;
7779*53ee8cc1Swenshuai.xi #endif
7780*53ee8cc1Swenshuai.xi }
7781*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7782*53ee8cc1Swenshuai.xi /********************************************************************/
7783*53ee8cc1Swenshuai.xi ///Check current JPEG image is progressive or not
7784*53ee8cc1Swenshuai.xi ///@return TRUE / FALSE
7785*53ee8cc1Swenshuai.xi /// - TRUE : progressive
7786*53ee8cc1Swenshuai.xi /// - FALSE : baseline
7787*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_IsProgressive(void)7788*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_IsProgressive(void)
7789*53ee8cc1Swenshuai.xi {
7790*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7791*53ee8cc1Swenshuai.xi {
7792*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7793*53ee8cc1Swenshuai.xi return FALSE;
7794*53ee8cc1Swenshuai.xi }
7795*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _bProgressive_flag);
7796*53ee8cc1Swenshuai.xi return (_bProgressive_flag);
7797*53ee8cc1Swenshuai.xi }
7798*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7799*53ee8cc1Swenshuai.xi /********************************************************************/
7800*53ee8cc1Swenshuai.xi ///Check current JPEG image has thumbnail or not
7801*53ee8cc1Swenshuai.xi ///@return TRUE / FALSE
7802*53ee8cc1Swenshuai.xi /// - TRUE : thumbnail found
7803*53ee8cc1Swenshuai.xi /// - FALSE : no thumbnail
7804*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_ThumbnailFound(void)7805*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_ThumbnailFound(void)
7806*53ee8cc1Swenshuai.xi {
7807*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7808*53ee8cc1Swenshuai.xi {
7809*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7810*53ee8cc1Swenshuai.xi return FALSE;
7811*53ee8cc1Swenshuai.xi }
7812*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _bThumbnailFound);
7813*53ee8cc1Swenshuai.xi return (_bThumbnailFound);
7814*53ee8cc1Swenshuai.xi }
7815*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7816*53ee8cc1Swenshuai.xi /********************************************************************/
7817*53ee8cc1Swenshuai.xi ///The width may be the thumbnail or original image size, it based on decoding mode
7818*53ee8cc1Swenshuai.xi ///@return width
7819*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetWidth(void)7820*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetWidth(void)
7821*53ee8cc1Swenshuai.xi {
7822*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7823*53ee8cc1Swenshuai.xi {
7824*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7825*53ee8cc1Swenshuai.xi return 0;
7826*53ee8cc1Swenshuai.xi }
7827*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16Image_x_size);
7828*53ee8cc1Swenshuai.xi return (_u16Image_x_size);
7829*53ee8cc1Swenshuai.xi }
7830*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7831*53ee8cc1Swenshuai.xi /********************************************************************/
7832*53ee8cc1Swenshuai.xi ///The height may be the thumbnail or original image size, it based on decoding mode
7833*53ee8cc1Swenshuai.xi ///@return height
7834*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetHeight(void)7835*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetHeight(void)
7836*53ee8cc1Swenshuai.xi {
7837*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7838*53ee8cc1Swenshuai.xi {
7839*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7840*53ee8cc1Swenshuai.xi return 0;
7841*53ee8cc1Swenshuai.xi }
7842*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16Image_y_size);
7843*53ee8cc1Swenshuai.xi return (_u16Image_y_size);
7844*53ee8cc1Swenshuai.xi }
7845*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7846*53ee8cc1Swenshuai.xi /********************************************************************/
7847*53ee8cc1Swenshuai.xi ///Get the original width of this JPEG file after alignment
7848*53ee8cc1Swenshuai.xi ///@return original width
7849*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetOriginalWidth(void)7850*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetOriginalWidth(void)
7851*53ee8cc1Swenshuai.xi {
7852*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7853*53ee8cc1Swenshuai.xi {
7854*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7855*53ee8cc1Swenshuai.xi return 0;
7856*53ee8cc1Swenshuai.xi }
7857*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16OriginalImage_x_size);
7858*53ee8cc1Swenshuai.xi return (_u16OriginalImage_x_size);
7859*53ee8cc1Swenshuai.xi }
7860*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7861*53ee8cc1Swenshuai.xi /********************************************************************/
7862*53ee8cc1Swenshuai.xi ///Get the original height of this JPEG file after alignment
7863*53ee8cc1Swenshuai.xi ///@return original height
7864*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetOriginalHeight(void)7865*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetOriginalHeight(void)
7866*53ee8cc1Swenshuai.xi {
7867*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7868*53ee8cc1Swenshuai.xi {
7869*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7870*53ee8cc1Swenshuai.xi return 0;
7871*53ee8cc1Swenshuai.xi }
7872*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16OriginalImage_y_size);
7873*53ee8cc1Swenshuai.xi return (_u16OriginalImage_y_size);
7874*53ee8cc1Swenshuai.xi }
7875*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7876*53ee8cc1Swenshuai.xi /********************************************************************/
7877*53ee8cc1Swenshuai.xi ///Get the original width before alignment
7878*53ee8cc1Swenshuai.xi ///@return non-alignment width
7879*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetNonAlignmentWidth(void)7880*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetNonAlignmentWidth(void)
7881*53ee8cc1Swenshuai.xi {
7882*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7883*53ee8cc1Swenshuai.xi {
7884*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7885*53ee8cc1Swenshuai.xi return 0;
7886*53ee8cc1Swenshuai.xi }
7887*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16NonAlignmentImage_x_size);
7888*53ee8cc1Swenshuai.xi return (_u16NonAlignmentImage_x_size);
7889*53ee8cc1Swenshuai.xi }
7890*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7891*53ee8cc1Swenshuai.xi /********************************************************************/
7892*53ee8cc1Swenshuai.xi ///Get the original height before alignment
7893*53ee8cc1Swenshuai.xi ///@return non-alignment height
7894*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetNonAlignmentHeight(void)7895*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetNonAlignmentHeight(void)
7896*53ee8cc1Swenshuai.xi {
7897*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7898*53ee8cc1Swenshuai.xi {
7899*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7900*53ee8cc1Swenshuai.xi return 0;
7901*53ee8cc1Swenshuai.xi }
7902*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16NonAlignmentImage_y_size);
7903*53ee8cc1Swenshuai.xi return (_u16NonAlignmentImage_y_size);
7904*53ee8cc1Swenshuai.xi }
7905*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7906*53ee8cc1Swenshuai.xi /********************************************************************/
7907*53ee8cc1Swenshuai.xi ///Get the displayed pitch of JPEG image
7908*53ee8cc1Swenshuai.xi ///@return displayed pitch
7909*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetAlignedPitch(void)7910*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetAlignedPitch(void)
7911*53ee8cc1Swenshuai.xi {
7912*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7913*53ee8cc1Swenshuai.xi {
7914*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7915*53ee8cc1Swenshuai.xi return 0;
7916*53ee8cc1Swenshuai.xi }
7917*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImagePitch);
7918*53ee8cc1Swenshuai.xi return (_u16AlignedImagePitch);
7919*53ee8cc1Swenshuai.xi }
7920*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetAlignedPitch_H(void)7921*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetAlignedPitch_H(void)
7922*53ee8cc1Swenshuai.xi {
7923*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7924*53ee8cc1Swenshuai.xi {
7925*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7926*53ee8cc1Swenshuai.xi return 0;
7927*53ee8cc1Swenshuai.xi }
7928*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImagePitch_H);
7929*53ee8cc1Swenshuai.xi return (_u16AlignedImagePitch_H);
7930*53ee8cc1Swenshuai.xi }
7931*53ee8cc1Swenshuai.xi
7932*53ee8cc1Swenshuai.xi
7933*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7934*53ee8cc1Swenshuai.xi /********************************************************************/
7935*53ee8cc1Swenshuai.xi ///Get the displayed width of JPEG image
7936*53ee8cc1Swenshuai.xi ///@return displayed width
7937*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetAlignedWidth(void)7938*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetAlignedWidth(void)
7939*53ee8cc1Swenshuai.xi {
7940*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7941*53ee8cc1Swenshuai.xi {
7942*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7943*53ee8cc1Swenshuai.xi return 0;
7944*53ee8cc1Swenshuai.xi }
7945*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImageWidth);
7946*53ee8cc1Swenshuai.xi return (_u16AlignedImageWidth);
7947*53ee8cc1Swenshuai.xi }
7948*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7949*53ee8cc1Swenshuai.xi /********************************************************************/
7950*53ee8cc1Swenshuai.xi ///Get the displayed height of JPEG image
7951*53ee8cc1Swenshuai.xi ///@return displayed height
7952*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetAlignedHeight(void)7953*53ee8cc1Swenshuai.xi MS_U16 _MApi_JPEG_GetAlignedHeight(void)
7954*53ee8cc1Swenshuai.xi {
7955*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7956*53ee8cc1Swenshuai.xi {
7957*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7958*53ee8cc1Swenshuai.xi return 0;
7959*53ee8cc1Swenshuai.xi }
7960*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u16AlignedImageHeight);
7961*53ee8cc1Swenshuai.xi return (_u16AlignedImageHeight);
7962*53ee8cc1Swenshuai.xi }
7963*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7964*53ee8cc1Swenshuai.xi /********************************************************************/
7965*53ee8cc1Swenshuai.xi ///Get scale down factor\n
7966*53ee8cc1Swenshuai.xi ///Depending on the real picture width & height, it will automatically set scale down\n
7967*53ee8cc1Swenshuai.xi ///factor to meet maximum JPEG width & height allowed.
7968*53ee8cc1Swenshuai.xi ///@return scale down factor
7969*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetScaleDownFactor(void)7970*53ee8cc1Swenshuai.xi MS_U8 _MApi_JPEG_GetScaleDownFactor(void)
7971*53ee8cc1Swenshuai.xi {
7972*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
7973*53ee8cc1Swenshuai.xi {
7974*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
7975*53ee8cc1Swenshuai.xi return 0;
7976*53ee8cc1Swenshuai.xi }
7977*53ee8cc1Swenshuai.xi
7978*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
7979*53ee8cc1Swenshuai.xi if((E_JPEG_CMYK == gu8Scan_type)
7980*53ee8cc1Swenshuai.xi || (E_JPEG_RGB == gu8Scan_type))
7981*53ee8cc1Swenshuai.xi {
7982*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u8ScaleDownFactor*2);
7983*53ee8cc1Swenshuai.xi return (_u8ScaleDownFactor*2);
7984*53ee8cc1Swenshuai.xi }
7985*53ee8cc1Swenshuai.xi #endif
7986*53ee8cc1Swenshuai.xi {
7987*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , _u8ScaleDownFactor);
7988*53ee8cc1Swenshuai.xi return (_u8ScaleDownFactor);
7989*53ee8cc1Swenshuai.xi }
7990*53ee8cc1Swenshuai.xi }
7991*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7992*53ee8cc1Swenshuai.xi /********************************************************************/
7993*53ee8cc1Swenshuai.xi /// Set Max decoding resolution
7994*53ee8cc1Swenshuai.xi ///@param -u16Width \b IN : indicate max decoding width
7995*53ee8cc1Swenshuai.xi ///@param -u16Height \b IN : indicate max decoding height
7996*53ee8cc1Swenshuai.xi ///@return None
7997*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)7998*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
7999*53ee8cc1Swenshuai.xi {
8000*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: Width = %d, Height = %d\n", __FUNCTION__, u16Width, u16Height);
8001*53ee8cc1Swenshuai.xi JPEG_MAX_WIDTH = u16Width;
8002*53ee8cc1Swenshuai.xi JPEG_MAX_HEIGHT = u16Height;
8003*53ee8cc1Swenshuai.xi return;
8004*53ee8cc1Swenshuai.xi }
8005*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8006*53ee8cc1Swenshuai.xi /********************************************************************/
8007*53ee8cc1Swenshuai.xi /// Set Max decoding resolution of Progressive JPEG
8008*53ee8cc1Swenshuai.xi ///@param -u16ProWidth \b IN : indicate max decoding width
8009*53ee8cc1Swenshuai.xi ///@param -u16ProHeight \b IN : indicate max decoding height
8010*53ee8cc1Swenshuai.xi ///@return None
8011*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)8012*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
8013*53ee8cc1Swenshuai.xi {
8014*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: ProWidth = %d, ProHeight = %d\n", __FUNCTION__, u16ProWidth, u16ProHeight);
8015*53ee8cc1Swenshuai.xi JPEG_PRO_MAX_WIDTH = u16ProWidth;
8016*53ee8cc1Swenshuai.xi JPEG_PRO_MAX_HEIGHT = u16ProHeight;
8017*53ee8cc1Swenshuai.xi return;
8018*53ee8cc1Swenshuai.xi }
8019*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8020*53ee8cc1Swenshuai.xi /********************************************************************/
8021*53ee8cc1Swenshuai.xi /// Valid the JPEG read buffer flag
8022*53ee8cc1Swenshuai.xi ///@param -u8MRBuffType \b IN : the type of JPEG read buffer
8023*53ee8cc1Swenshuai.xi ///@return None
8024*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)8025*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)
8026*53ee8cc1Swenshuai.xi {
8027*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8028*53ee8cc1Swenshuai.xi {
8029*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8030*53ee8cc1Swenshuai.xi return;
8031*53ee8cc1Swenshuai.xi }
8032*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: MRBuffType = %d\n", __FUNCTION__ , u8MRBuffType);
8033*53ee8cc1Swenshuai.xi #ifndef CMODEL
8034*53ee8cc1Swenshuai.xi switch(u8MRBuffType)
8035*53ee8cc1Swenshuai.xi {
8036*53ee8cc1Swenshuai.xi case E_JPEG_BUFFER_HIGH:
8037*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
8038*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_H_VLD);
8039*53ee8cc1Swenshuai.xi break;
8040*53ee8cc1Swenshuai.xi case E_JPEG_BUFFER_LOW:
8041*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
8042*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | JPD_L_VLD);
8043*53ee8cc1Swenshuai.xi break;
8044*53ee8cc1Swenshuai.xi default:
8045*53ee8cc1Swenshuai.xi break;
8046*53ee8cc1Swenshuai.xi }
8047*53ee8cc1Swenshuai.xi #endif
8048*53ee8cc1Swenshuai.xi return;
8049*53ee8cc1Swenshuai.xi }
8050*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8051*53ee8cc1Swenshuai.xi /********************************************************************/
8052*53ee8cc1Swenshuai.xi /// Set JPEG EOF flag and the total byte-read of JPEG file
8053*53ee8cc1Swenshuai.xi ///@param -u32DataRead \b IN : the amount of byte of file reading
8054*53ee8cc1Swenshuai.xi ///@param -bEOFflag \b IN : the EOF flag of file reading
8055*53ee8cc1Swenshuai.xi ///@return None
8056*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead,MS_BOOL bEOFflag)8057*53ee8cc1Swenshuai.xi void _MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead, MS_BOOL bEOFflag)
8058*53ee8cc1Swenshuai.xi {
8059*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8060*53ee8cc1Swenshuai.xi {
8061*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8062*53ee8cc1Swenshuai.xi return;
8063*53ee8cc1Swenshuai.xi }
8064*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: DataRead = %ld, EOFflag = %d\n", __FUNCTION__ , u32DataRead, bEOFflag);
8065*53ee8cc1Swenshuai.xi //// _Total_Decoded_Size += data_read;
8066*53ee8cc1Swenshuai.xi _u32Total_bytes_read += u32DataRead;
8067*53ee8cc1Swenshuai.xi _bEOF_flag = bEOFflag;
8068*53ee8cc1Swenshuai.xi
8069*53ee8cc1Swenshuai.xi #ifndef CMODEL
8070*53ee8cc1Swenshuai.xi // Set buffer valid to avoid last data not decoded done
8071*53ee8cc1Swenshuai.xi if(bEOFflag)
8072*53ee8cc1Swenshuai.xi {
8073*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
8074*53ee8cc1Swenshuai.xi }
8075*53ee8cc1Swenshuai.xi #endif
8076*53ee8cc1Swenshuai.xi return;
8077*53ee8cc1Swenshuai.xi }
8078*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8079*53ee8cc1Swenshuai.xi /********************************************************************/
8080*53ee8cc1Swenshuai.xi /// Process JPEG read buffer flag when EOF.
8081*53ee8cc1Swenshuai.xi ///@param -u8MRBuffType \b IN : The type of JPEG read buffer
8082*53ee8cc1Swenshuai.xi ///@return None
8083*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)8084*53ee8cc1Swenshuai.xi void _MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)
8085*53ee8cc1Swenshuai.xi {
8086*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8087*53ee8cc1Swenshuai.xi {
8088*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8089*53ee8cc1Swenshuai.xi return;
8090*53ee8cc1Swenshuai.xi }
8091*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: end of file!! MRBuffType = %d\n", __FUNCTION__ , u8MRBuffType);
8092*53ee8cc1Swenshuai.xi //// MDrv_UART_PutChar('t'); // DO NOT MARK THIS, THIS FUNCTION MUST BE CALLED. OR THE JPD DECODE WILL FAIL for LARGE FILES
8093*53ee8cc1Swenshuai.xi #ifndef CMODEL
8094*53ee8cc1Swenshuai.xi if(u8MRBuffType == E_JPEG_BUFFER_HIGH)
8095*53ee8cc1Swenshuai.xi {
8096*53ee8cc1Swenshuai.xi // clear MRC high portion read complete event
8097*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBH_DONE);
8098*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBH_DONE);
8099*53ee8cc1Swenshuai.xi }
8100*53ee8cc1Swenshuai.xi else
8101*53ee8cc1Swenshuai.xi {
8102*53ee8cc1Swenshuai.xi // clear MRC low portion read complete event
8103*53ee8cc1Swenshuai.xi //MDrv_JPD_ClearJPDStatus(E_JPD_EVENT_MRBL_DONE);
8104*53ee8cc1Swenshuai.xi MDrv_JPD_SetEventFlag(E_JPD_EVENT_MRBL_DONE);
8105*53ee8cc1Swenshuai.xi }
8106*53ee8cc1Swenshuai.xi
8107*53ee8cc1Swenshuai.xi // Set buffer valid to avoid last data not decoded done
8108*53ee8cc1Swenshuai.xi MDrv_JPD_Set_M_Config((MDrv_JPD_Get_M_Config() & ~0x0003) | (JPD_H_VLD |JPD_L_VLD));
8109*53ee8cc1Swenshuai.xi #endif
8110*53ee8cc1Swenshuai.xi return;
8111*53ee8cc1Swenshuai.xi }
8112*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8113*53ee8cc1Swenshuai.xi /********************************************************************/
8114*53ee8cc1Swenshuai.xi /// Set JPEG Error Code if something error on upper layer.
8115*53ee8cc1Swenshuai.xi ///@param -ErrCode \b IN : The error type of JPEG decoder
8116*53ee8cc1Swenshuai.xi ///@return None
8117*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetErrCode(JPEG_ErrCode ErrCode)8118*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetErrCode(JPEG_ErrCode ErrCode)
8119*53ee8cc1Swenshuai.xi {
8120*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s: ErrCode = %d\n", __FUNCTION__ , ErrCode);
8121*53ee8cc1Swenshuai.xi _Error_code = ErrCode;
8122*53ee8cc1Swenshuai.xi //// JPEG_free_all_blocks();
8123*53ee8cc1Swenshuai.xi return;
8124*53ee8cc1Swenshuai.xi }
8125*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8126*53ee8cc1Swenshuai.xi /********************************************************************/
8127*53ee8cc1Swenshuai.xi /// Set JPEG debug level.
8128*53ee8cc1Swenshuai.xi ///@param -u8DbgLevel \b IN : The JPEG debug level, refer to JPEG_DbgLevel.
8129*53ee8cc1Swenshuai.xi ///@return None
8130*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)8131*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)
8132*53ee8cc1Swenshuai.xi {
8133*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: DbgLevel = 0x%04X\n", __FUNCTION__, u8DbgLevel);
8134*53ee8cc1Swenshuai.xi _u8JPEG_ApiDbgLevel = u8DbgLevel;
8135*53ee8cc1Swenshuai.xi #ifndef CMODEL
8136*53ee8cc1Swenshuai.xi MDrv_JPD_SetDbgLevel(u8DbgLevel);
8137*53ee8cc1Swenshuai.xi #endif
8138*53ee8cc1Swenshuai.xi return;
8139*53ee8cc1Swenshuai.xi }
8140*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8141*53ee8cc1Swenshuai.xi /********************************************************************/
8142*53ee8cc1Swenshuai.xi /// Get JPEG debug level.
8143*53ee8cc1Swenshuai.xi ///@return JPEG debug level, refer to JPEG_DbgLevel.
8144*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetDbgLevel(void)8145*53ee8cc1Swenshuai.xi MS_U8 _MApi_JPEG_GetDbgLevel(void)
8146*53ee8cc1Swenshuai.xi {
8147*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: DbgLevel = 0x%04X\n", __FUNCTION__, _u8JPEG_ApiDbgLevel);
8148*53ee8cc1Swenshuai.xi return _u8JPEG_ApiDbgLevel;
8149*53ee8cc1Swenshuai.xi }
8150*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8151*53ee8cc1Swenshuai.xi /********************************************************************/
8152*53ee8cc1Swenshuai.xi /// Set MHEG5 Flag.
8153*53ee8cc1Swenshuai.xi ///@param -bEnable \b IN :
8154*53ee8cc1Swenshuai.xi ///@return None
8155*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetMHEG5(MS_BOOL bEnable)8156*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetMHEG5(MS_BOOL bEnable)
8157*53ee8cc1Swenshuai.xi {
8158*53ee8cc1Swenshuai.xi bMHEG5 = bEnable;
8159*53ee8cc1Swenshuai.xi }
8160*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8161*53ee8cc1Swenshuai.xi /********************************************************************/
8162*53ee8cc1Swenshuai.xi /// Get JPEG information
8163*53ee8cc1Swenshuai.xi ///@param -pJPEG_Info \b OUT : JPEG information\n
8164*53ee8cc1Swenshuai.xi /// structure {\n
8165*53ee8cc1Swenshuai.xi /// MS_U8* \b pu8DrvVer : JPEG DRV version\n
8166*53ee8cc1Swenshuai.xi /// MS_U8* \b pu8HalVer : JPEG HAL version\n
8167*53ee8cc1Swenshuai.xi /// MS_U8* \b pu8FwVer : JPEG FW version\n
8168*53ee8cc1Swenshuai.xi /// JPEG_DrvCap \b stDrvCap : JPEG driver capability\n
8169*53ee8cc1Swenshuai.xi /// };
8170*53ee8cc1Swenshuai.xi ///@return None
8171*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetInfo(JPEG_Info * pJPEG_Info)8172*53ee8cc1Swenshuai.xi void _MApi_JPEG_GetInfo(JPEG_Info *pJPEG_Info)
8173*53ee8cc1Swenshuai.xi {
8174*53ee8cc1Swenshuai.xi #ifndef CMODEL
8175*53ee8cc1Swenshuai.xi JPD_Info DrvInfo;
8176*53ee8cc1Swenshuai.xi const MSIF_Version *DrvVer;
8177*53ee8cc1Swenshuai.xi MDrv_JPD_GetInfo(&DrvInfo);
8178*53ee8cc1Swenshuai.xi MDrv_JPD_GetLibVer(&DrvVer);
8179*53ee8cc1Swenshuai.xi pJPEG_Info->pu8DrvVer = DrvVer;
8180*53ee8cc1Swenshuai.xi pJPEG_Info->pu8HalVer = DrvInfo.pu8HalVer;
8181*53ee8cc1Swenshuai.xi pJPEG_Info->pu8FwVer = DrvInfo.pu8FwVer;
8182*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.bBaseline = DrvInfo.stCap.bBaseline;
8183*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.bProgressive = DrvInfo.stCap.bProgressive;
8184*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.bMJPEG = DrvInfo.stCap.bMJPEG;
8185*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxWidth = JPEG_MAX_WIDTH;
8186*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxHeight = JPEG_MAX_HEIGHT;
8187*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxProWidth = JPEG_PRO_MAX_WIDTH;
8188*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxProHeight = JPEG_PRO_MAX_HEIGHT;
8189*53ee8cc1Swenshuai.xi
8190*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPD %04x, %04x, %04x, %s\n",
8191*53ee8cc1Swenshuai.xi DrvVer->DDI.customer, DrvVer->DDI.model, DrvVer->DDI.chip, &(DrvVer->DDI.cpu));
8192*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("pu8HalVer = %s, pu8FwVer = %s\n", pJPEG_Info->pu8HalVer, pJPEG_Info->pu8FwVer);
8193*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: DrvCap_BL = %d, DrvCap_PRO = %d, DrvCap_MJPEG = %d\n", __FUNCTION__,
8194*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.bBaseline, pJPEG_Info->stDrvCap.bProgressive, pJPEG_Info->stDrvCap.bMJPEG);
8195*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: MaxWidth = %d, MaxHeight = %d\n", __FUNCTION__,
8196*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxWidth, pJPEG_Info->stDrvCap.u16MaxHeight);
8197*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: MaxProWidth = %d, MaxProHeight = %d\n", __FUNCTION__,
8198*53ee8cc1Swenshuai.xi pJPEG_Info->stDrvCap.u16MaxProWidth, pJPEG_Info->stDrvCap.u16MaxProHeight);
8199*53ee8cc1Swenshuai.xi #endif
8200*53ee8cc1Swenshuai.xi return;
8201*53ee8cc1Swenshuai.xi }
8202*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8203*53ee8cc1Swenshuai.xi /********************************************************************/
8204*53ee8cc1Swenshuai.xi /// Get JPEG status.
8205*53ee8cc1Swenshuai.xi ///@param -pJPEG_Status \b OUT : JPEG status\n
8206*53ee8cc1Swenshuai.xi /// structure {\n
8207*53ee8cc1Swenshuai.xi /// MS_U32 \b u32CurMRCAddr : JPD current decode address\n
8208*53ee8cc1Swenshuai.xi /// MS_U16 \b u16CurVidx : JPD current decode vertical index\n
8209*53ee8cc1Swenshuai.xi /// MS_U16 \b u16CurRow : JPD current decode row\n
8210*53ee8cc1Swenshuai.xi /// MS_U16 \b u16CurCol : JPD current decode column\n
8211*53ee8cc1Swenshuai.xi /// MS_BOOL \b bDrvBusy : JPEG DRV busy status\n
8212*53ee8cc1Swenshuai.xi /// MS_BOOL \b bIsrEnable : JPD ISR status\n
8213*53ee8cc1Swenshuai.xi /// };
8214*53ee8cc1Swenshuai.xi ///@return None
8215*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetStatus(JPEG_Status * pJPEG_Status)8216*53ee8cc1Swenshuai.xi void _MApi_JPEG_GetStatus(JPEG_Status *pJPEG_Status)
8217*53ee8cc1Swenshuai.xi {
8218*53ee8cc1Swenshuai.xi #ifndef CMODEL
8219*53ee8cc1Swenshuai.xi JPD_Status *pDrvStatus = MDrv_JPD_GetStatus();
8220*53ee8cc1Swenshuai.xi pJPEG_Status->u32CurMRCAddr = pDrvStatus->u32CurMRCAddr;
8221*53ee8cc1Swenshuai.xi pJPEG_Status->u16CurVidx = pDrvStatus->u16CurVidx;
8222*53ee8cc1Swenshuai.xi pJPEG_Status->u16CurRow = pDrvStatus->u16CurRow;
8223*53ee8cc1Swenshuai.xi pJPEG_Status->u16CurCol = pDrvStatus->u16CurCol;
8224*53ee8cc1Swenshuai.xi pJPEG_Status->bDrvBusy = pDrvStatus->bIsBusy;
8225*53ee8cc1Swenshuai.xi pJPEG_Status->bIsrEnable = pDrvStatus->bIsrEnable;
8226*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: Drv_busy = %d, Isr_status = %d\n", __FUNCTION__ , pJPEG_Status->bDrvBusy, pJPEG_Status->bIsrEnable);
8227*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: CurVidx = %d, CurRow = %d, CurCol = %d\n", __FUNCTION__ ,
8228*53ee8cc1Swenshuai.xi pJPEG_Status->u16CurVidx, pJPEG_Status->u16CurRow, pJPEG_Status->u16CurCol);
8229*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: CurMRCAddr = 0x%lx\n", __FUNCTION__ , pJPEG_Status->u32CurMRCAddr);
8230*53ee8cc1Swenshuai.xi #endif
8231*53ee8cc1Swenshuai.xi return;
8232*53ee8cc1Swenshuai.xi }
8233*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8234*53ee8cc1Swenshuai.xi /********************************************************************/
8235*53ee8cc1Swenshuai.xi /// Get JPEG Version.
8236*53ee8cc1Swenshuai.xi ///@param -ppVersion \b OUT : JPEG Version
8237*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8238*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Success
8239*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Failed
8240*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetLibVer(const MSIF_Version ** ppVersion)8241*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetLibVer(const MSIF_Version **ppVersion)
8242*53ee8cc1Swenshuai.xi {
8243*53ee8cc1Swenshuai.xi if (!ppVersion)
8244*53ee8cc1Swenshuai.xi {
8245*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8246*53ee8cc1Swenshuai.xi }
8247*53ee8cc1Swenshuai.xi *ppVersion = &_api_jpeg_version;
8248*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPEG %04x, %04x, %04x, %s\n", __FUNCTION__ ,
8249*53ee8cc1Swenshuai.xi _api_jpeg_version.DDI.customer, _api_jpeg_version.DDI.model, _api_jpeg_version.DDI.chip, &(_api_jpeg_version.DDI.cpu));
8250*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8251*53ee8cc1Swenshuai.xi }
8252*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8253*53ee8cc1Swenshuai.xi /********************************************************************/
8254*53ee8cc1Swenshuai.xi /// For H/W bug, some cases can not exit after decode done, Check
8255*53ee8cc1Swenshuai.xi /// Vidx to exit.
8256*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8257*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : Vidx checking is successful.
8258*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : Vidx checking is failed.
8259*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_HdlVidxChk(void)8260*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_HdlVidxChk(void)
8261*53ee8cc1Swenshuai.xi {
8262*53ee8cc1Swenshuai.xi #ifndef CMODEL
8263*53ee8cc1Swenshuai.xi MS_U16 cur_vidx = 0;
8264*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8265*53ee8cc1Swenshuai.xi {
8266*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8267*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8268*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8269*53ee8cc1Swenshuai.xi }
8270*53ee8cc1Swenshuai.xi
8271*53ee8cc1Swenshuai.xi if(FALSE == _JPD_IsDecoding)
8272*53ee8cc1Swenshuai.xi {
8273*53ee8cc1Swenshuai.xi _JPD_IsDecoding = TRUE;
8274*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8275*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = MsOS_GetSystemTime();
8276*53ee8cc1Swenshuai.xi #else
8277*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = 0;
8278*53ee8cc1Swenshuai.xi #endif
8279*53ee8cc1Swenshuai.xi }
8280*53ee8cc1Swenshuai.xi
8281*53ee8cc1Swenshuai.xi //For H/W bug, some cases can not exit after decode done. Check Vidx to exit.
8282*53ee8cc1Swenshuai.xi cur_vidx = MDrv_JPD_GetCurVidx();
8283*53ee8cc1Swenshuai.xi if(_JPD_PreVIdx != cur_vidx)
8284*53ee8cc1Swenshuai.xi {
8285*53ee8cc1Swenshuai.xi _JPD_PreVIdx = cur_vidx;
8286*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8287*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = MsOS_GetSystemTime();
8288*53ee8cc1Swenshuai.xi #else
8289*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = 0;
8290*53ee8cc1Swenshuai.xi #endif
8291*53ee8cc1Swenshuai.xi }
8292*53ee8cc1Swenshuai.xi else
8293*53ee8cc1Swenshuai.xi {
8294*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8295*53ee8cc1Swenshuai.xi if((MsOS_GetSystemTime() - _JPD_ReCheckTime) >= 1000)
8296*53ee8cc1Swenshuai.xi #else
8297*53ee8cc1Swenshuai.xi if(_JPD_ReCheckTime++ >= 10000)
8298*53ee8cc1Swenshuai.xi #endif
8299*53ee8cc1Swenshuai.xi {
8300*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8301*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Decode timeout...!!!!\n");
8302*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8303*53ee8cc1Swenshuai.xi }
8304*53ee8cc1Swenshuai.xi }
8305*53ee8cc1Swenshuai.xi #endif
8306*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8307*53ee8cc1Swenshuai.xi }
8308*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8309*53ee8cc1Swenshuai.xi /********************************************************************/
8310*53ee8cc1Swenshuai.xi /// Get Preload buffer information.
8311*53ee8cc1Swenshuai.xi ///@param -pBuffLoadType \b OUT : JPEG preload buffer type
8312*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8313*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8314*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8315*53ee8cc1Swenshuai.xi /// - E_JPEG_RETRY : we need to re-get preload buffer type
8316*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType * pBuffLoadType)8317*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType *pBuffLoadType)
8318*53ee8cc1Swenshuai.xi {
8319*53ee8cc1Swenshuai.xi #ifndef CMODEL
8320*53ee8cc1Swenshuai.xi MS_U16 reg_val = MDrv_JPD_GetEventFlag();
8321*53ee8cc1Swenshuai.xi
8322*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8323*53ee8cc1Swenshuai.xi {
8324*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8325*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8326*53ee8cc1Swenshuai.xi }
8327*53ee8cc1Swenshuai.xi
8328*53ee8cc1Swenshuai.xi if((E_JPD_EVENT_MRBL_DONE & reg_val)
8329*53ee8cc1Swenshuai.xi && (E_JPEG_BUFFER_LOW != u8PreLHFlag))
8330*53ee8cc1Swenshuai.xi {
8331*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : MRBuffer Load LOW!!!!\n", __FUNCTION__);
8332*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_LOW;
8333*53ee8cc1Swenshuai.xi u32MRCheckCount = 0;
8334*53ee8cc1Swenshuai.xi *pBuffLoadType = u8PreLHFlag;
8335*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8336*53ee8cc1Swenshuai.xi }
8337*53ee8cc1Swenshuai.xi else if((E_JPD_EVENT_MRBH_DONE & reg_val)
8338*53ee8cc1Swenshuai.xi && (E_JPEG_BUFFER_HIGH != u8PreLHFlag))
8339*53ee8cc1Swenshuai.xi {
8340*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : MRBuffer Load HIGH!!!!\n", __FUNCTION__);
8341*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_HIGH;
8342*53ee8cc1Swenshuai.xi u32MRCheckCount = 0;
8343*53ee8cc1Swenshuai.xi *pBuffLoadType = u8PreLHFlag;
8344*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8345*53ee8cc1Swenshuai.xi }
8346*53ee8cc1Swenshuai.xi else
8347*53ee8cc1Swenshuai.xi {
8348*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : MRBuffer Load NONE!!!!\n", __FUNCTION__);
8349*53ee8cc1Swenshuai.xi *pBuffLoadType = E_JPEG_BUFFER_NONE;
8350*53ee8cc1Swenshuai.xi u32MRCheckCount++;
8351*53ee8cc1Swenshuai.xi if(u32MRCheckCount >= 1000)
8352*53ee8cc1Swenshuai.xi {
8353*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Decoding time out!!\n");
8354*53ee8cc1Swenshuai.xi u32MRCheckCount = 0;
8355*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8356*53ee8cc1Swenshuai.xi }
8357*53ee8cc1Swenshuai.xi }
8358*53ee8cc1Swenshuai.xi return E_JPEG_RETRY;
8359*53ee8cc1Swenshuai.xi #else
8360*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8361*53ee8cc1Swenshuai.xi #endif
8362*53ee8cc1Swenshuai.xi }
8363*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8364*53ee8cc1Swenshuai.xi /********************************************************************/
8365*53ee8cc1Swenshuai.xi /// Enable JPD ISR and register callback function.
8366*53ee8cc1Swenshuai.xi ///@param -IsrCb \b IN : JPD ISR callback function
8367*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8368*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8369*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8370*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)8371*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)
8372*53ee8cc1Swenshuai.xi {
8373*53ee8cc1Swenshuai.xi #ifndef CMODEL
8374*53ee8cc1Swenshuai.xi if(TRUE == MDrv_JPD_EnableISR((JPD_IsrFuncCb)IsrCb))
8375*53ee8cc1Swenshuai.xi {
8376*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : Success!!!!\n", __FUNCTION__);
8377*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8378*53ee8cc1Swenshuai.xi }
8379*53ee8cc1Swenshuai.xi else
8380*53ee8cc1Swenshuai.xi {
8381*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : Fail!!!!\n", __FUNCTION__);
8382*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8383*53ee8cc1Swenshuai.xi }
8384*53ee8cc1Swenshuai.xi #else
8385*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8386*53ee8cc1Swenshuai.xi #endif
8387*53ee8cc1Swenshuai.xi }
8388*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8389*53ee8cc1Swenshuai.xi /********************************************************************/
8390*53ee8cc1Swenshuai.xi /// Disable JPD ISR and unregister callback function.
8391*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8392*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8393*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8394*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_DisableISR(void)8395*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_DisableISR(void)
8396*53ee8cc1Swenshuai.xi {
8397*53ee8cc1Swenshuai.xi #ifndef CMODEL
8398*53ee8cc1Swenshuai.xi if(TRUE == MDrv_JPD_DisableISR())
8399*53ee8cc1Swenshuai.xi {
8400*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : Success!!!!\n", __FUNCTION__);
8401*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8402*53ee8cc1Swenshuai.xi }
8403*53ee8cc1Swenshuai.xi else
8404*53ee8cc1Swenshuai.xi {
8405*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : Fail!!!!\n", __FUNCTION__);
8406*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8407*53ee8cc1Swenshuai.xi }
8408*53ee8cc1Swenshuai.xi #else
8409*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8410*53ee8cc1Swenshuai.xi #endif
8411*53ee8cc1Swenshuai.xi }
8412*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8413*53ee8cc1Swenshuai.xi /********************************************************************/
8414*53ee8cc1Swenshuai.xi /// JPEG wait done function, call it to check JPEG decoding status.
8415*53ee8cc1Swenshuai.xi ///@return \b JPEG_DecodeStatus
8416*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_DONE : JPEG decode done.
8417*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_FAILED : JPEG decode failed.
8418*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_MRBL_DONE : MRB low done, need to feed data.
8419*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_MRBH_DONE : MRB high done, need to feed data.
8420*53ee8cc1Swenshuai.xi /// - E_JPEG_DEC_DECODING : JPEG decoding
8421*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_WaitDone(void)8422*53ee8cc1Swenshuai.xi JPEG_DecodeStatus _MApi_JPEG_WaitDone(void)
8423*53ee8cc1Swenshuai.xi {
8424*53ee8cc1Swenshuai.xi #ifndef CMODEL
8425*53ee8cc1Swenshuai.xi MS_U16 reg_val = E_JPD_EVENT_DEC_DONE;
8426*53ee8cc1Swenshuai.xi MS_U16 cur_vidx = 0;
8427*53ee8cc1Swenshuai.xi #endif
8428*53ee8cc1Swenshuai.xi
8429*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8430*53ee8cc1Swenshuai.xi {
8431*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s: JPD have not init!!\n", __FUNCTION__);
8432*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8433*53ee8cc1Swenshuai.xi return E_JPEG_DEC_FAILED;
8434*53ee8cc1Swenshuai.xi }
8435*53ee8cc1Swenshuai.xi
8436*53ee8cc1Swenshuai.xi #ifndef CMODEL
8437*53ee8cc1Swenshuai.xi if(FALSE == _JPD_IsDecoding)
8438*53ee8cc1Swenshuai.xi {
8439*53ee8cc1Swenshuai.xi _JPD_IsDecoding = TRUE;
8440*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8441*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = MsOS_GetSystemTime();
8442*53ee8cc1Swenshuai.xi #else
8443*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = 0;
8444*53ee8cc1Swenshuai.xi #endif
8445*53ee8cc1Swenshuai.xi }
8446*53ee8cc1Swenshuai.xi
8447*53ee8cc1Swenshuai.xi //For H/W bug, some cases can not exit after decode done. Check Vidx to exit.
8448*53ee8cc1Swenshuai.xi cur_vidx = MDrv_JPD_GetCurVidx();
8449*53ee8cc1Swenshuai.xi if(_JPD_PreVIdx != cur_vidx)
8450*53ee8cc1Swenshuai.xi {
8451*53ee8cc1Swenshuai.xi _JPD_PreVIdx = cur_vidx;
8452*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8453*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = MsOS_GetSystemTime();
8454*53ee8cc1Swenshuai.xi #else
8455*53ee8cc1Swenshuai.xi _JPD_ReCheckTime = 0;
8456*53ee8cc1Swenshuai.xi #endif
8457*53ee8cc1Swenshuai.xi }
8458*53ee8cc1Swenshuai.xi else
8459*53ee8cc1Swenshuai.xi {
8460*53ee8cc1Swenshuai.xi #if MSOS_GET_SYSTEM_TIME
8461*53ee8cc1Swenshuai.xi if((MsOS_GetSystemTime() - _JPD_ReCheckTime) >= 1000)
8462*53ee8cc1Swenshuai.xi #else
8463*53ee8cc1Swenshuai.xi if(_JPD_ReCheckTime++ >= 10000)
8464*53ee8cc1Swenshuai.xi #endif
8465*53ee8cc1Swenshuai.xi {
8466*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s:Decode timeout.....!!!!\n", __FUNCTION__);
8467*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8468*53ee8cc1Swenshuai.xi return E_JPEG_DEC_FAILED;
8469*53ee8cc1Swenshuai.xi }
8470*53ee8cc1Swenshuai.xi else
8471*53ee8cc1Swenshuai.xi {
8472*53ee8cc1Swenshuai.xi return E_JPEG_DEC_DECODING;
8473*53ee8cc1Swenshuai.xi }
8474*53ee8cc1Swenshuai.xi }
8475*53ee8cc1Swenshuai.xi
8476*53ee8cc1Swenshuai.xi reg_val = MDrv_JPD_GetEventFlag();
8477*53ee8cc1Swenshuai.xi
8478*53ee8cc1Swenshuai.xi if(E_JPD_EVENT_DEC_DONE & reg_val)
8479*53ee8cc1Swenshuai.xi {
8480*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s:Decode Done!!\n", __FUNCTION__);
8481*53ee8cc1Swenshuai.xi #if PRINT_JPD_DECODE_TIME
8482*53ee8cc1Swenshuai.xi u32MeasureDecodeTimeHW = MsOS_GetSystemTime()-u32MeasureDecodeTime;
8483*53ee8cc1Swenshuai.xi printf_red("SW decode header:[%ld]ms, HW decode: [%ld]ms\n", u32MeasureDecodeTimeSW, u32MeasureDecodeTimeHW);
8484*53ee8cc1Swenshuai.xi #endif
8485*53ee8cc1Swenshuai.xi if(_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API)
8486*53ee8cc1Swenshuai.xi {
8487*53ee8cc1Swenshuai.xi verJPD_CRC32_Init();
8488*53ee8cc1Swenshuai.xi verJPD_CRC32_Update((MS_U8 *)MWC_BUFFER_ADDR,
8489*53ee8cc1Swenshuai.xi (MS_U32)MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2);
8490*53ee8cc1Swenshuai.xi printf_red("[%dx%d], u32CRCResult=0x%lx\n",MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), verJPD_CRC32_GetResult());
8491*53ee8cc1Swenshuai.xi }
8492*53ee8cc1Swenshuai.xi
8493*53ee8cc1Swenshuai.xi #if LOG_DATA_TO_USB
8494*53ee8cc1Swenshuai.xi if(MApi_JPEG_GetWidth() <=JPEG_MAX_WIDTH
8495*53ee8cc1Swenshuai.xi && MApi_JPEG_GetHeight() <=JPEG_MAX_HEIGHT)
8496*53ee8cc1Swenshuai.xi {
8497*53ee8cc1Swenshuai.xi MS_U32 u32Size;
8498*53ee8cc1Swenshuai.xi u32Size = MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2;
8499*53ee8cc1Swenshuai.xi printf("[%dx%d], MWC_BUFFER_ADDR=0x%lx, size=0x%lx", MApi_JPEG_GetWidth(),
8500*53ee8cc1Swenshuai.xi MApi_JPEG_GetHeight(), MS_VA2PA(MWC_BUFFER_ADDR),u32Size);
8501*53ee8cc1Swenshuai.xi _PrintOutputMem(MWC_BUFFER_ADDR, u32Size);
8502*53ee8cc1Swenshuai.xi }
8503*53ee8cc1Swenshuai.xi #endif
8504*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8505*53ee8cc1Swenshuai.xi return E_JPEG_DEC_DONE;
8506*53ee8cc1Swenshuai.xi }
8507*53ee8cc1Swenshuai.xi else if(E_JPD_EVENT_RST_ERROR & reg_val)
8508*53ee8cc1Swenshuai.xi {
8509*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s:RST Error!!\n", __FUNCTION__);
8510*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8511*53ee8cc1Swenshuai.xi return E_JPEG_DEC_RST_ERROR;
8512*53ee8cc1Swenshuai.xi }
8513*53ee8cc1Swenshuai.xi else if((E_JPD_EVENT_ECS_ERROR & reg_val)
8514*53ee8cc1Swenshuai.xi || (E_JPD_EVENT_IS_ERROR & reg_val))
8515*53ee8cc1Swenshuai.xi {
8516*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s:Bitstream Error, reg_val = 0x%02x!!\n", __FUNCTION__ , reg_val);
8517*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8518*53ee8cc1Swenshuai.xi return E_JPEG_DEC_BITSTREAM_ERROR;
8519*53ee8cc1Swenshuai.xi }
8520*53ee8cc1Swenshuai.xi #if (JPD_SUPPORT_AUTO_PROTECT==true)
8521*53ee8cc1Swenshuai.xi else if(E_JPD_EVENT_MWB_FULL & reg_val)
8522*53ee8cc1Swenshuai.xi {
8523*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("[%s]MWB is full!!\n", __FUNCTION__);
8524*53ee8cc1Swenshuai.xi _JPD_IsDecoding = FALSE;
8525*53ee8cc1Swenshuai.xi return E_JPEG_DEC_FAILED;
8526*53ee8cc1Swenshuai.xi }
8527*53ee8cc1Swenshuai.xi #endif
8528*53ee8cc1Swenshuai.xi else if((E_JPD_EVENT_MRBL_DONE & reg_val)
8529*53ee8cc1Swenshuai.xi && (E_JPEG_BUFFER_LOW != u8PreLHFlag))
8530*53ee8cc1Swenshuai.xi {
8531*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_LOW;
8532*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("[%s]MRBL done!!\n", __FUNCTION__);
8533*53ee8cc1Swenshuai.xi return E_JPEG_DEC_MRBL_DONE;
8534*53ee8cc1Swenshuai.xi }
8535*53ee8cc1Swenshuai.xi else if((E_JPD_EVENT_MRBH_DONE & reg_val)
8536*53ee8cc1Swenshuai.xi && (E_JPEG_BUFFER_HIGH != u8PreLHFlag))
8537*53ee8cc1Swenshuai.xi {
8538*53ee8cc1Swenshuai.xi u8PreLHFlag = E_JPEG_BUFFER_HIGH;
8539*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("[%s]MRBH done!!\n", __FUNCTION__);
8540*53ee8cc1Swenshuai.xi return E_JPEG_DEC_MRBH_DONE;
8541*53ee8cc1Swenshuai.xi }
8542*53ee8cc1Swenshuai.xi #endif
8543*53ee8cc1Swenshuai.xi return E_JPEG_DEC_DECODING;
8544*53ee8cc1Swenshuai.xi }
8545*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8546*53ee8cc1Swenshuai.xi /********************************************************************/
8547*53ee8cc1Swenshuai.xi /// Get datetime info of JPEG EXIF
8548*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8549*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8550*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8551*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime * DateTime)8552*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime *DateTime)
8553*53ee8cc1Swenshuai.xi {
8554*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8555*53ee8cc1Swenshuai.xi {
8556*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8557*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8558*53ee8cc1Swenshuai.xi }
8559*53ee8cc1Swenshuai.xi
8560*53ee8cc1Swenshuai.xi DateTime->bHasDataTime = _stEXIF_DateTime.bHasDataTime;
8561*53ee8cc1Swenshuai.xi DateTime->u32Year = _stEXIF_DateTime.u32Year;
8562*53ee8cc1Swenshuai.xi DateTime->u32Month = _stEXIF_DateTime.u32Month;
8563*53ee8cc1Swenshuai.xi DateTime->u32Day = _stEXIF_DateTime.u32Day;
8564*53ee8cc1Swenshuai.xi DateTime->u32Hour = _stEXIF_DateTime.u32Hour;
8565*53ee8cc1Swenshuai.xi DateTime->u32Minute = _stEXIF_DateTime.u32Minute;
8566*53ee8cc1Swenshuai.xi DateTime->u32Second = _stEXIF_DateTime.u32Second;
8567*53ee8cc1Swenshuai.xi
8568*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime======= Exist = %d \n", _stEXIF_DateTime.bHasDataTime);
8569*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", _stEXIF_DateTime.u32Year, _stEXIF_DateTime.u32Month, _stEXIF_DateTime.u32Day);
8570*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", _stEXIF_DateTime.u32Hour, _stEXIF_DateTime.u32Minute, _stEXIF_DateTime.u32Second);
8571*53ee8cc1Swenshuai.xi
8572*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8573*53ee8cc1Swenshuai.xi }
8574*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8575*53ee8cc1Swenshuai.xi /********************************************************************/
8576*53ee8cc1Swenshuai.xi /// Get orientation info of JPEG EXIF
8577*53ee8cc1Swenshuai.xi ///@return \b JPEG_Result
8578*53ee8cc1Swenshuai.xi /// - E_JPEG_OKAY : success.
8579*53ee8cc1Swenshuai.xi /// - E_JPEG_FAILED : fail.
8580*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation * eOrientation)8581*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation *eOrientation)
8582*53ee8cc1Swenshuai.xi {
8583*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8584*53ee8cc1Swenshuai.xi {
8585*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8586*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8587*53ee8cc1Swenshuai.xi }
8588*53ee8cc1Swenshuai.xi *eOrientation = _eEXIF_Orientation;
8589*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", _eEXIF_Orientation);
8590*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8591*53ee8cc1Swenshuai.xi }
8592*53ee8cc1Swenshuai.xi
8593*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
_MApi_JPEG_GetEXIFManufacturer(MS_U8 * pu8Manufacturer,MS_U8 u8size)8594*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFManufacturer(MS_U8 *pu8Manufacturer, MS_U8 u8size)
8595*53ee8cc1Swenshuai.xi {
8596*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8597*53ee8cc1Swenshuai.xi {
8598*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8599*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8600*53ee8cc1Swenshuai.xi }
8601*53ee8cc1Swenshuai.xi MS_U8 u8i=0;
8602*53ee8cc1Swenshuai.xi JPEG_memset((void*)(pu8Manufacturer), 0, u8size);
8603*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Manufacturer =");
8604*53ee8cc1Swenshuai.xi while(_u8EXIF_Manufacturer[u8i] && u8i<JPEG_MANUFACTURER_SIZE)
8605*53ee8cc1Swenshuai.xi {
8606*53ee8cc1Swenshuai.xi *(pu8Manufacturer+u8i) =_u8EXIF_Manufacturer[u8i];
8607*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%c", *(pu8Manufacturer+u8i));
8608*53ee8cc1Swenshuai.xi u8i++;
8609*53ee8cc1Swenshuai.xi if(u8i>=u8size)
8610*53ee8cc1Swenshuai.xi {
8611*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s: NOT enough space!!\n", __FUNCTION__);
8612*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8613*53ee8cc1Swenshuai.xi }
8614*53ee8cc1Swenshuai.xi }
8615*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("\n");
8616*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("JPEG EXIF Manufacturer = %02x %02x %02x %02x %02x %02x %02x %02x\n",
8617*53ee8cc1Swenshuai.xi // *pu8Manufacturer, *(pu8Manufacturer+1), *(pu8Manufacturer+2), *(pu8Manufacturer+3),
8618*53ee8cc1Swenshuai.xi // *(pu8Manufacturer+4),*(pu8Manufacturer+5),*(pu8Manufacturer+6),*(pu8Manufacturer+7));
8619*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8620*53ee8cc1Swenshuai.xi }
8621*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetEXIFModel(MS_U8 * pu8Model,MS_U8 u8size)8622*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFModel(MS_U8 *pu8Model, MS_U8 u8size)
8623*53ee8cc1Swenshuai.xi {
8624*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8625*53ee8cc1Swenshuai.xi {
8626*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8627*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8628*53ee8cc1Swenshuai.xi }
8629*53ee8cc1Swenshuai.xi MS_U8 u8i=0;
8630*53ee8cc1Swenshuai.xi JPEG_memset((void*)(pu8Model), 0, u8size);
8631*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Model =");
8632*53ee8cc1Swenshuai.xi while(_u8EXIF_Model[u8i] && u8i<JPEG_MODEL_SIZE)
8633*53ee8cc1Swenshuai.xi {
8634*53ee8cc1Swenshuai.xi *(pu8Model+u8i) =_u8EXIF_Model[u8i];
8635*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%c", *(pu8Model+u8i));
8636*53ee8cc1Swenshuai.xi u8i++;
8637*53ee8cc1Swenshuai.xi if(u8i>=u8size)
8638*53ee8cc1Swenshuai.xi {
8639*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("%s: NOT enough space!!\n", __FUNCTION__);
8640*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8641*53ee8cc1Swenshuai.xi }
8642*53ee8cc1Swenshuai.xi }
8643*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("\n");
8644*53ee8cc1Swenshuai.xi
8645*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("JPEG EXIF Model = %02x %02x %02x %02x %02x %02x %02x %02x\n",
8646*53ee8cc1Swenshuai.xi // *pu8Model, *(pu8Model+1), *(pu8Model+2), *(pu8Model+3),
8647*53ee8cc1Swenshuai.xi // *(pu8Model+4),*(pu8Model+5),*(pu8Model+6),*(pu8Model+7));
8648*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8649*53ee8cc1Swenshuai.xi }
8650*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetEXIFFlash(MS_U16 * pu16Flash)8651*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFFlash(MS_U16 *pu16Flash)
8652*53ee8cc1Swenshuai.xi {
8653*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8654*53ee8cc1Swenshuai.xi {
8655*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8656*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8657*53ee8cc1Swenshuai.xi }
8658*53ee8cc1Swenshuai.xi *pu16Flash = _u16EXIF_Flash;
8659*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Flash = %d \n", *pu16Flash);
8660*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8661*53ee8cc1Swenshuai.xi }
8662*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 * pu32ISOSpeedRatings)8663*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 *pu32ISOSpeedRatings)
8664*53ee8cc1Swenshuai.xi {
8665*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8666*53ee8cc1Swenshuai.xi {
8667*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8668*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8669*53ee8cc1Swenshuai.xi }
8670*53ee8cc1Swenshuai.xi *pu32ISOSpeedRatings = _u32EXIF_ISOSpeedRatings;
8671*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF ISO = %ld \n", *pu32ISOSpeedRatings);
8672*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8673*53ee8cc1Swenshuai.xi }
8674*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL * pShutterSpeedValue)8675*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL *pShutterSpeedValue)
8676*53ee8cc1Swenshuai.xi {
8677*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8678*53ee8cc1Swenshuai.xi {
8679*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8680*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8681*53ee8cc1Swenshuai.xi }
8682*53ee8cc1Swenshuai.xi pShutterSpeedValue->numerator = _stEXIF_ShutterSpeedValue.numerator;
8683*53ee8cc1Swenshuai.xi pShutterSpeedValue->denominator= _stEXIF_ShutterSpeedValue.denominator;
8684*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ShutterSpeedValue numerator=%ld, denominator=%ld\n", pShutterSpeedValue->numerator, pShutterSpeedValue->denominator);
8685*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8686*53ee8cc1Swenshuai.xi }
8687*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL * pApertureValue)8688*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL *pApertureValue)
8689*53ee8cc1Swenshuai.xi {
8690*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8691*53ee8cc1Swenshuai.xi {
8692*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8693*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8694*53ee8cc1Swenshuai.xi }
8695*53ee8cc1Swenshuai.xi pApertureValue->s_numerator = _stEXIF_ApertureValue.s_numerator;
8696*53ee8cc1Swenshuai.xi pApertureValue->s_denominator= _stEXIF_ApertureValue.s_denominator;
8697*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ApertureValue numerator=%ld, denominator=%ld\n", pApertureValue->s_numerator, pApertureValue->s_denominator);
8698*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8699*53ee8cc1Swenshuai.xi }
8700*53ee8cc1Swenshuai.xi
8701*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL * pExposureBiasValue)8702*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL *pExposureBiasValue)
8703*53ee8cc1Swenshuai.xi {
8704*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8705*53ee8cc1Swenshuai.xi {
8706*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8707*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8708*53ee8cc1Swenshuai.xi }
8709*53ee8cc1Swenshuai.xi pExposureBiasValue->numerator = _stEXIF_ExposureBiasValue.numerator;
8710*53ee8cc1Swenshuai.xi pExposureBiasValue->denominator= _stEXIF_ExposureBiasValue.denominator;
8711*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureBiasValue numerator=%ld, denominator=%ld\n", pExposureBiasValue->numerator, pExposureBiasValue->denominator);
8712*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8713*53ee8cc1Swenshuai.xi }
8714*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL * pFocalLength)8715*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL *pFocalLength)
8716*53ee8cc1Swenshuai.xi {
8717*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8718*53ee8cc1Swenshuai.xi {
8719*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8720*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8721*53ee8cc1Swenshuai.xi }
8722*53ee8cc1Swenshuai.xi pFocalLength->s_numerator = _stEXIF_FocalLength.s_numerator;
8723*53ee8cc1Swenshuai.xi pFocalLength->s_denominator= _stEXIF_FocalLength.s_denominator;
8724*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FocalLength numerator=%ld, denominator=%ld\n", pFocalLength->s_numerator, pFocalLength->s_denominator);
8725*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8726*53ee8cc1Swenshuai.xi }
_MApi_JPEG_GetEXIFImageWidth(MS_U32 * pu32ImageWidth)8727*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFImageWidth(MS_U32 *pu32ImageWidth)
8728*53ee8cc1Swenshuai.xi {
8729*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8730*53ee8cc1Swenshuai.xi {
8731*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8732*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8733*53ee8cc1Swenshuai.xi }
8734*53ee8cc1Swenshuai.xi *pu32ImageWidth = _u32EXIF_ImageWidth;
8735*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Image Width = %ld \n", *pu32ImageWidth);
8736*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8737*53ee8cc1Swenshuai.xi }
8738*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetEXIFImageHeight(MS_U32 * pu32ImageHeight)8739*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFImageHeight(MS_U32 *pu32ImageHeight)
8740*53ee8cc1Swenshuai.xi {
8741*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8742*53ee8cc1Swenshuai.xi {
8743*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8744*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8745*53ee8cc1Swenshuai.xi }
8746*53ee8cc1Swenshuai.xi *pu32ImageHeight = _u32EXIF_ImageHeight;
8747*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG EXIF Image Height = %ld \n", *pu32ImageHeight);
8748*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8749*53ee8cc1Swenshuai.xi }
_MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL * pExposureTime)8750*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL *pExposureTime)
8751*53ee8cc1Swenshuai.xi {
8752*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8753*53ee8cc1Swenshuai.xi {
8754*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8755*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8756*53ee8cc1Swenshuai.xi }
8757*53ee8cc1Swenshuai.xi pExposureTime->s_numerator = _stEXIF_ExposureTime.s_numerator;
8758*53ee8cc1Swenshuai.xi pExposureTime->s_denominator= _stEXIF_ExposureTime.s_denominator;
8759*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("ExposureTime numerator=%ld, denominator=%ld\n", pExposureTime->s_numerator, pExposureTime->s_denominator);
8760*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8761*53ee8cc1Swenshuai.xi }
8762*53ee8cc1Swenshuai.xi
8763*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL * pFNumber)8764*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL *pFNumber)
8765*53ee8cc1Swenshuai.xi {
8766*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8767*53ee8cc1Swenshuai.xi {
8768*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8769*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8770*53ee8cc1Swenshuai.xi }
8771*53ee8cc1Swenshuai.xi pFNumber->s_numerator = _stEXIF_FNumber.s_numerator;
8772*53ee8cc1Swenshuai.xi pFNumber->s_denominator= _stEXIF_FNumber.s_denominator;
8773*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("FNumber numerator=%ld, denominator=%ld\n", pFNumber->s_numerator, pFNumber->s_denominator);
8774*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
8775*53ee8cc1Swenshuai.xi }
8776*53ee8cc1Swenshuai.xi #endif
8777*53ee8cc1Swenshuai.xi
8778*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID,MS_U32 * param,MS_U32 u32size)8779*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID, MS_U32 *param, MS_U32 u32size)
8780*53ee8cc1Swenshuai.xi {
8781*53ee8cc1Swenshuai.xi JPEG_Result eResult = E_JPEG_OKAY;
8782*53ee8cc1Swenshuai.xi
8783*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
8784*53ee8cc1Swenshuai.xi {
8785*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
8786*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
8787*53ee8cc1Swenshuai.xi }
8788*53ee8cc1Swenshuai.xi
8789*53ee8cc1Swenshuai.xi switch(eGetID)
8790*53ee8cc1Swenshuai.xi {
8791*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_MANUFACTURER:
8792*53ee8cc1Swenshuai.xi eResult = MApi_JPEG_GetEXIFManufacturer((MS_U8 *)param, u32size*4);
8793*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Manufacturer = %c%c%c%c%c%c%c%c%c%c%c%c\n",
8794*53ee8cc1Swenshuai.xi *((MS_U8 *)param), *((MS_U8 *)param+1), *((MS_U8 *)param+2), *((MS_U8 *)param+3),
8795*53ee8cc1Swenshuai.xi *((MS_U8 *)param+4),*((MS_U8 *)param+5),*((MS_U8 *)param+6),*((MS_U8 *)param+7),
8796*53ee8cc1Swenshuai.xi *((MS_U8 *)param+8),*((MS_U8 *)param+9),*((MS_U8 *)param+10),*((MS_U8 *)param+11)
8797*53ee8cc1Swenshuai.xi );
8798*53ee8cc1Swenshuai.xi break;
8799*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_MODEL:
8800*53ee8cc1Swenshuai.xi eResult = MApi_JPEG_GetEXIFModel((MS_U8 *)param, u32size*4);
8801*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Model = %c%c%c%c%c%c%c%c%c%c%c%c\n",
8802*53ee8cc1Swenshuai.xi *((MS_U8 *)param), *((MS_U8 *)param+1), *((MS_U8 *)param+2), *((MS_U8 *)param+3),
8803*53ee8cc1Swenshuai.xi *((MS_U8 *)param+4),*((MS_U8 *)param+5),*((MS_U8 *)param+6),*((MS_U8 *)param+7),
8804*53ee8cc1Swenshuai.xi *((MS_U8 *)param+8),*((MS_U8 *)param+9),*((MS_U8 *)param+10),*((MS_U8 *)param+11)
8805*53ee8cc1Swenshuai.xi );
8806*53ee8cc1Swenshuai.xi break;
8807*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_FLASH:
8808*53ee8cc1Swenshuai.xi *param = (MS_U32)_u16EXIF_Flash;
8809*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Flash = %ld \n", *param);
8810*53ee8cc1Swenshuai.xi break;
8811*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_ISO_SPEED_RATINGS:
8812*53ee8cc1Swenshuai.xi *param = _u32EXIF_ISOSpeedRatings;
8813*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF ISO = %ld \n", *param);
8814*53ee8cc1Swenshuai.xi break;
8815*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_SHUTTER_SPEED_VALUE:
8816*53ee8cc1Swenshuai.xi if(u32size<2)
8817*53ee8cc1Swenshuai.xi {
8818*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8819*53ee8cc1Swenshuai.xi }
8820*53ee8cc1Swenshuai.xi *param = _stEXIF_ShutterSpeedValue.numerator;
8821*53ee8cc1Swenshuai.xi *(param+1) = _stEXIF_ShutterSpeedValue.denominator;
8822*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@ShutterSpeedValue numerator=%ld, denominator=%ld\n", *param, *(param+1));
8823*53ee8cc1Swenshuai.xi break;
8824*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_APERTURE_VALUE:
8825*53ee8cc1Swenshuai.xi if(u32size<2)
8826*53ee8cc1Swenshuai.xi {
8827*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8828*53ee8cc1Swenshuai.xi }
8829*53ee8cc1Swenshuai.xi *param = (MS_U32)_stEXIF_ApertureValue.s_numerator;
8830*53ee8cc1Swenshuai.xi *(param+1) = (MS_U32)_stEXIF_ApertureValue.s_denominator;
8831*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@ApertureValue numerator=%ld, denominator=%ld\n", *param, *(param+1));
8832*53ee8cc1Swenshuai.xi break;
8833*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_EXPOSURE_BIAS_VALUE:
8834*53ee8cc1Swenshuai.xi if(u32size<2)
8835*53ee8cc1Swenshuai.xi {
8836*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8837*53ee8cc1Swenshuai.xi }
8838*53ee8cc1Swenshuai.xi *param = _stEXIF_ExposureBiasValue.numerator;
8839*53ee8cc1Swenshuai.xi *(param+1) = _stEXIF_ExposureBiasValue.denominator;
8840*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@ExposureBiasValue numerator=%ld, denominator=%ld\n", *param, *(param+1));
8841*53ee8cc1Swenshuai.xi break;
8842*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_FOCAL_LENGTH:
8843*53ee8cc1Swenshuai.xi if(u32size<2)
8844*53ee8cc1Swenshuai.xi {
8845*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8846*53ee8cc1Swenshuai.xi }
8847*53ee8cc1Swenshuai.xi *param = (MS_U32)_stEXIF_FocalLength.s_numerator;
8848*53ee8cc1Swenshuai.xi *(param+1) = (MS_U32)_stEXIF_FocalLength.s_denominator;
8849*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@FocalLength numerator=%ld, denominator=%ld\n", *param, *(param+1));
8850*53ee8cc1Swenshuai.xi break;
8851*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_IMAGE_WIDTH:
8852*53ee8cc1Swenshuai.xi *param = _u32EXIF_ImageWidth;
8853*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Image Width = %ld \n", *param);
8854*53ee8cc1Swenshuai.xi break;
8855*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_IMAGE_HEIGHT:
8856*53ee8cc1Swenshuai.xi *param = _u32EXIF_ImageHeight;
8857*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Image Height = %ld \n", *param);
8858*53ee8cc1Swenshuai.xi break;
8859*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_EXPOSURE_TIME:
8860*53ee8cc1Swenshuai.xi if(u32size<2)
8861*53ee8cc1Swenshuai.xi {
8862*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8863*53ee8cc1Swenshuai.xi }
8864*53ee8cc1Swenshuai.xi *param = (MS_U32)_stEXIF_ExposureTime.s_numerator;
8865*53ee8cc1Swenshuai.xi *(param+1) = (MS_U32)_stEXIF_ExposureTime.s_denominator;
8866*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@ExposureTime numerator=%ld, denominator=%ld\n", *param, *(param+1));
8867*53ee8cc1Swenshuai.xi break;
8868*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_F_NUMBER:
8869*53ee8cc1Swenshuai.xi if(u32size<2)
8870*53ee8cc1Swenshuai.xi {
8871*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8872*53ee8cc1Swenshuai.xi }
8873*53ee8cc1Swenshuai.xi *param = (MS_U32)_stEXIF_FNumber.s_numerator;
8874*53ee8cc1Swenshuai.xi *(param+1) = (MS_U32)_stEXIF_FNumber.s_denominator;
8875*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@FNumber numerator=%ld, denominator=%ld\n", *param, *(param+1));
8876*53ee8cc1Swenshuai.xi break;
8877*53ee8cc1Swenshuai.xi case E_JPEG_GET_EXIF_EXPOSURE_PROGRAM:
8878*53ee8cc1Swenshuai.xi *param = (MS_U32)_u16EXIF_Exposureprogram;
8879*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("@JPEG EXIF Exposure Program = %ld \n", *param);
8880*53ee8cc1Swenshuai.xi break;
8881*53ee8cc1Swenshuai.xi default:
8882*53ee8cc1Swenshuai.xi eResult = E_JPEG_FAILED;
8883*53ee8cc1Swenshuai.xi break;
8884*53ee8cc1Swenshuai.xi }
8885*53ee8cc1Swenshuai.xi return eResult;
8886*53ee8cc1Swenshuai.xi }
8887*53ee8cc1Swenshuai.xi
8888*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////
8889*53ee8cc1Swenshuai.xi /// current unused function, maybe removed in new MDDI
8890*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////
8891*53ee8cc1Swenshuai.xi #if 0 // not implement for new MDDI
8892*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8893*53ee8cc1Swenshuai.xi void msAPI_MJPEG_Parse_SOF(void)
8894*53ee8cc1Swenshuai.xi {
8895*53ee8cc1Swenshuai.xi JPEG_locate_sof_marker();
8896*53ee8cc1Swenshuai.xi }
8897*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8898*53ee8cc1Swenshuai.xi void msAPI_MJPEG_constructor( PJPEG_FILE_FileSystem_t Pstream, MS_U8 decode_type)
8899*53ee8cc1Swenshuai.xi {
8900*53ee8cc1Swenshuai.xi _u8DecodeType = decode_type;
8901*53ee8cc1Swenshuai.xi JPEG_init_thumbnail();
8902*53ee8cc1Swenshuai.xi msAPI_MJPEG_decode_init( Pstream);
8903*53ee8cc1Swenshuai.xi }
8904*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8905*53ee8cc1Swenshuai.xi //Set Total pics in the file
8906*53ee8cc1Swenshuai.xi void msAPI_MJPEG_SetTotal_Pics(MS_U32 *DecodeTime)
8907*53ee8cc1Swenshuai.xi {
8908*53ee8cc1Swenshuai.xi *DecodeTime = NumPics;
8909*53ee8cc1Swenshuai.xi }
8910*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8911*53ee8cc1Swenshuai.xi MS_S16 msAPI_JPEG_Check_End_Flag( void )
8912*53ee8cc1Swenshuai.xi {
8913*53ee8cc1Swenshuai.xi return ( _bEOF_flag );
8914*53ee8cc1Swenshuai.xi }
8915*53ee8cc1Swenshuai.xi
8916*53ee8cc1Swenshuai.xi #ifndef CMODEL
8917*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8918*53ee8cc1Swenshuai.xi /******************************************************************************/
8919*53ee8cc1Swenshuai.xi ///Set downscale ratio
8920*53ee8cc1Swenshuai.xi ///@param ratio \b OUT scale ratio
8921*53ee8cc1Swenshuai.xi /******************************************************************************/
8922*53ee8cc1Swenshuai.xi void msAPI_JPEG_SetDownScaleRatio(JPEG_DownScaleRatio ratio)
8923*53ee8cc1Swenshuai.xi {
8924*53ee8cc1Swenshuai.xi switch(ratio)
8925*53ee8cc1Swenshuai.xi {
8926*53ee8cc1Swenshuai.xi case E_RATIO_HALF:
8927*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_HALF;
8928*53ee8cc1Swenshuai.xi break;
8929*53ee8cc1Swenshuai.xi case E_RATIO_FOURTH:
8930*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_FOURTH;
8931*53ee8cc1Swenshuai.xi break;
8932*53ee8cc1Swenshuai.xi case E_RATIO_EIGHTH:
8933*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_EIGHTH;
8934*53ee8cc1Swenshuai.xi break;
8935*53ee8cc1Swenshuai.xi default:
8936*53ee8cc1Swenshuai.xi _u8DownScaleRatio = E_JPD_DOWNSCALE_ORG;
8937*53ee8cc1Swenshuai.xi break;
8938*53ee8cc1Swenshuai.xi }
8939*53ee8cc1Swenshuai.xi }
8940*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
8941*53ee8cc1Swenshuai.xi void msAPI_JPEG_GetOutputDimension(MS_U16 *width, MS_U16 *height)
8942*53ee8cc1Swenshuai.xi {
8943*53ee8cc1Swenshuai.xi MS_U8 mcu_width, mcu_height;
8944*53ee8cc1Swenshuai.xi MS_U16 pic_width = _u16Image_x_size;
8945*53ee8cc1Swenshuai.xi MS_U16 pic_height = _u16Image_y_size;
8946*53ee8cc1Swenshuai.xi MS_U8 Y_VSF = _u8Comp_v_samp[0];
8947*53ee8cc1Swenshuai.xi MS_U8 Y_HSF = _u8Comp_h_samp[0];
8948*53ee8cc1Swenshuai.xi MS_U16 ROI_width;
8949*53ee8cc1Swenshuai.xi
8950*53ee8cc1Swenshuai.xi if ( ( mcu_width = pic_width % ( Y_HSF * 8 ) ) )
8951*53ee8cc1Swenshuai.xi {
8952*53ee8cc1Swenshuai.xi pic_width += ( Y_HSF * 8 - mcu_width );
8953*53ee8cc1Swenshuai.xi }
8954*53ee8cc1Swenshuai.xi
8955*53ee8cc1Swenshuai.xi if ( ( mcu_height = pic_height% ( Y_VSF * 8 ) ) )
8956*53ee8cc1Swenshuai.xi {
8957*53ee8cc1Swenshuai.xi pic_height += ( Y_VSF * 8 - mcu_height );
8958*53ee8cc1Swenshuai.xi }
8959*53ee8cc1Swenshuai.xi
8960*53ee8cc1Swenshuai.xi ROI_width = pic_width;
8961*53ee8cc1Swenshuai.xi
8962*53ee8cc1Swenshuai.xi if(_u8DownScaleRatio==E_JPD_DOWNSCALE_FOURTH||_u8DownScaleRatio==E_JPD_DOWNSCALE_EIGHTH)
8963*53ee8cc1Swenshuai.xi {
8964*53ee8cc1Swenshuai.xi MS_U16 ROI_width;
8965*53ee8cc1Swenshuai.xi
8966*53ee8cc1Swenshuai.xi if(_u8DownScaleRatio==E_JPD_DOWNSCALE_FOURTH)
8967*53ee8cc1Swenshuai.xi {
8968*53ee8cc1Swenshuai.xi // width must be multiple of 32
8969*53ee8cc1Swenshuai.xi ROI_width = (pic_width/32)*32;
8970*53ee8cc1Swenshuai.xi }
8971*53ee8cc1Swenshuai.xi else if(_u8DownScaleRatio==E_JPD_DOWNSCALE_EIGHTH)
8972*53ee8cc1Swenshuai.xi {
8973*53ee8cc1Swenshuai.xi // width must be multiple of 64
8974*53ee8cc1Swenshuai.xi ROI_width = (pic_width/64)*64;
8975*53ee8cc1Swenshuai.xi }
8976*53ee8cc1Swenshuai.xi }
8977*53ee8cc1Swenshuai.xi
8978*53ee8cc1Swenshuai.xi switch(_u8DownScaleRatio)
8979*53ee8cc1Swenshuai.xi {
8980*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_HALF:
8981*53ee8cc1Swenshuai.xi *width = ROI_width/2;
8982*53ee8cc1Swenshuai.xi break;
8983*53ee8cc1Swenshuai.xi
8984*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_FOURTH:
8985*53ee8cc1Swenshuai.xi *width = ROI_width/4;
8986*53ee8cc1Swenshuai.xi break;
8987*53ee8cc1Swenshuai.xi
8988*53ee8cc1Swenshuai.xi case E_JPD_DOWNSCALE_EIGHTH:
8989*53ee8cc1Swenshuai.xi *width = ROI_width/8;
8990*53ee8cc1Swenshuai.xi break;
8991*53ee8cc1Swenshuai.xi
8992*53ee8cc1Swenshuai.xi default:
8993*53ee8cc1Swenshuai.xi *width = ROI_width;
8994*53ee8cc1Swenshuai.xi break;
8995*53ee8cc1Swenshuai.xi }
8996*53ee8cc1Swenshuai.xi
8997*53ee8cc1Swenshuai.xi *height = pic_height;
8998*53ee8cc1Swenshuai.xi }
8999*53ee8cc1Swenshuai.xi #endif
9000*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9001*53ee8cc1Swenshuai.xi MS_BOOL msAPI_MJPEG_SetInitParameter(MS_U32 u32RBufAddr, MS_U32 u32RBufSize, MS_U32 u32WBufAddr, MS_U32 u32IBufAddr, MS_U32 u32IBufSize)
9002*53ee8cc1Swenshuai.xi {
9003*53ee8cc1Swenshuai.xi // the buffer size must be multiple of 4 bytes
9004*53ee8cc1Swenshuai.xi //if((u32RBufSize%4)!=0)
9005*53ee8cc1Swenshuai.xi // return FALSE;
9006*53ee8cc1Swenshuai.xi MS_U32 WBuffer = _u16Image_x_size*_u16Image_y_size*2;
9007*53ee8cc1Swenshuai.xi #ifdef CMODEL
9008*53ee8cc1Swenshuai.xi _bReady_flag = FALSE;
9009*53ee8cc1Swenshuai.xi #endif
9010*53ee8cc1Swenshuai.xi MRC_BUFFER_ADDR = _u32ReadBufferAddr + u32RBufAddr;
9011*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MRC_BUFFER_ADDR = %08lx\n",MRC_BUFFER_ADDR);
9012*53ee8cc1Swenshuai.xi //MRC_BUFFER_SIZE = _pu8In_buf + u32RBufSize;
9013*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("_u32WriteBufferAddr = %08X\n",_u32WriteBufferAddr);
9014*53ee8cc1Swenshuai.xi // JPEG_DEBUG_API_MSG("WBuffer = %08X\n",WBuffer);
9015*53ee8cc1Swenshuai.xi MWC_BUFFER_ADDR = _u32WriteBufferAddr + WBuffer;
9016*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MWC_BUFFER_ADDR = %08lx\n",MWC_BUFFER_ADDR);
9017*53ee8cc1Swenshuai.xi //JPEG_DEBUG_API_MSG("MWC_BUFFER_ADDR = %08X\n",MWC_BUFFER_ADDR);
9018*53ee8cc1Swenshuai.xi //INTERNAL_BUFFER_ADDR = u32IBufAddr;
9019*53ee8cc1Swenshuai.xi //INTERNAL_BUFFER_SIZE = u32IBufSize;
9020*53ee8cc1Swenshuai.xi //_u32In_buf_left = 0;
9021*53ee8cc1Swenshuai.xi _pu8In_buf = (MS_U8 *) (_u32ReadBufferAddr);
9022*53ee8cc1Swenshuai.xi _u32Total_bytes_read -= u32RBufAddr;
9023*53ee8cc1Swenshuai.xi //JPEG_MEMORY_init_mempool(((MS_U8 *) (u32IBufAddr + JPEG_DEFAULT_EXIF_SIZE)), u32IBufSize - JPEG_DEFAULT_EXIF_SIZE);
9024*53ee8cc1Swenshuai.xi //JPEG_locate_sof_marker();
9025*53ee8cc1Swenshuai.xi
9026*53ee8cc1Swenshuai.xi return TRUE;
9027*53ee8cc1Swenshuai.xi }
9028*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9029*53ee8cc1Swenshuai.xi MS_BOOL msAPI_MJPEG_ReSetMWC(MS_U32 u32RBufAddr, MS_U32 u32RBufSize, MS_U32 u32WBufAddr, MS_U32 u32IBufAddr, MS_U32 u32IBufSize)
9030*53ee8cc1Swenshuai.xi {
9031*53ee8cc1Swenshuai.xi
9032*53ee8cc1Swenshuai.xi _u32WriteBufferAddr = u32WBufAddr;
9033*53ee8cc1Swenshuai.xi
9034*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MWC_BUFFER_ADDR = %08lx\n",MWC_BUFFER_ADDR);
9035*53ee8cc1Swenshuai.xi
9036*53ee8cc1Swenshuai.xi return TRUE;
9037*53ee8cc1Swenshuai.xi }
9038*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9039*53ee8cc1Swenshuai.xi void msAPI_JPEG_SetErrorCode(MS_U16 u16Code)
9040*53ee8cc1Swenshuai.xi {
9041*53ee8cc1Swenshuai.xi _Error_code = u16Code;
9042*53ee8cc1Swenshuai.xi }
9043*53ee8cc1Swenshuai.xi #if 0
9044*53ee8cc1Swenshuai.xi #ifdef CMODEL
9045*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9046*53ee8cc1Swenshuai.xi // If you wish to decompress the image, call this method after constructing
9047*53ee8cc1Swenshuai.xi // the object. If E_JPEG_OKAY is returned you may then call decode() to
9048*53ee8cc1Swenshuai.xi // fetch the scan lines.
9049*53ee8cc1Swenshuai.xi JPEG_Result msAPI_JPEG_begin( void )
9050*53ee8cc1Swenshuai.xi {
9051*53ee8cc1Swenshuai.xi if ( _bReady_flag )
9052*53ee8cc1Swenshuai.xi {
9053*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Flag!!!!\n");
9054*53ee8cc1Swenshuai.xi return ( E_JPEG_OKAY );
9055*53ee8cc1Swenshuai.xi }
9056*53ee8cc1Swenshuai.xi
9057*53ee8cc1Swenshuai.xi if ( _Error_code )
9058*53ee8cc1Swenshuai.xi {
9059*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Error!!!!\n");
9060*53ee8cc1Swenshuai.xi return ( E_JPEG_FAILED );
9061*53ee8cc1Swenshuai.xi }
9062*53ee8cc1Swenshuai.xi JPEG_locate_sof_marker();
9063*53ee8cc1Swenshuai.xi
9064*53ee8cc1Swenshuai.xi //JPEG_decode_start();
9065*53ee8cc1Swenshuai.xi
9066*53ee8cc1Swenshuai.xi _bReady_flag = TRUE;
9067*53ee8cc1Swenshuai.xi
9068*53ee8cc1Swenshuai.xi return ( E_JPEG_OKAY );
9069*53ee8cc1Swenshuai.xi }
9070*53ee8cc1Swenshuai.xi #endif
9071*53ee8cc1Swenshuai.xi #endif
9072*53ee8cc1Swenshuai.xi #endif // not implement for new MDDI
9073*53ee8cc1Swenshuai.xi
9074*53ee8cc1Swenshuai.xi
9075*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
9076*53ee8cc1Swenshuai.xi // Decodes and dequantizes the next row of coefficients.
msAPI_JPEG_decode_next_row(void)9077*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_decode_next_row( void )
9078*53ee8cc1Swenshuai.xi {
9079*53ee8cc1Swenshuai.xi MS_U16 row_block = 0;
9080*53ee8cc1Swenshuai.xi MS_U16 mcu_row, mcu_block, k;
9081*53ee8cc1Swenshuai.xi
9082*53ee8cc1Swenshuai.xi // Clearing the entire row block buffer can take a lot of time!
9083*53ee8cc1Swenshuai.xi // Instead of clearing the entire buffer each row, keep track
9084*53ee8cc1Swenshuai.xi // of the number of nonzero entries written to each block and do
9085*53ee8cc1Swenshuai.xi // selective clears.
9086*53ee8cc1Swenshuai.xi //memset(_ps16Block_seg[0], 0, _u16Mcus_per_row * _u8Blocks_per_mcu * 64 * sizeof(BLOCK_TYPE));
9087*53ee8cc1Swenshuai.xi
9088*53ee8cc1Swenshuai.xi for ( mcu_row = 0; mcu_row < _u16Mcus_per_row; mcu_row++ )
9089*53ee8cc1Swenshuai.xi {
9090*53ee8cc1Swenshuai.xi if ( ( _u16Restart_interval ) && ( _u16Restarts_left == 0 ) )
9091*53ee8cc1Swenshuai.xi {
9092*53ee8cc1Swenshuai.xi if(!JPEG_process_restart())
9093*53ee8cc1Swenshuai.xi return FALSE;
9094*53ee8cc1Swenshuai.xi }
9095*53ee8cc1Swenshuai.xi
9096*53ee8cc1Swenshuai.xi for ( mcu_block = 0; mcu_block < _u8Blocks_per_mcu; mcu_block++ )
9097*53ee8cc1Swenshuai.xi {
9098*53ee8cc1Swenshuai.xi MS_U8 component_id = _u8Mcu_org[mcu_block];
9099*53ee8cc1Swenshuai.xi MS_U8 prev_num_set;
9100*53ee8cc1Swenshuai.xi JPEG_HuffTbl *Ph;
9101*53ee8cc1Swenshuai.xi
9102*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *p = _ps16Block_seg[row_block];
9103*53ee8cc1Swenshuai.xi JPEG_QUANT_TYPE *q = _QuantTables[_u8Comp_quant[component_id]].s16Value;
9104*53ee8cc1Swenshuai.xi MS_S32 r, s;
9105*53ee8cc1Swenshuai.xi
9106*53ee8cc1Swenshuai.xi if ( ( s = JPEG_huff_decode( &_Huff_tbls[_u8Comp_dc_tab[component_id]] ) ) != 0 )
9107*53ee8cc1Swenshuai.xi {
9108*53ee8cc1Swenshuai.xi r = JPEG_get_bits_2( s );
9109*53ee8cc1Swenshuai.xi s = HUFF_EXTEND( r, s );
9110*53ee8cc1Swenshuai.xi }
9111*53ee8cc1Swenshuai.xi
9112*53ee8cc1Swenshuai.xi //printf("r : %d s : %d\n",s,r);
9113*53ee8cc1Swenshuai.xi
9114*53ee8cc1Swenshuai.xi _u32Last_dc_val[component_id] = ( s += _u32Last_dc_val[component_id] );
9115*53ee8cc1Swenshuai.xi
9116*53ee8cc1Swenshuai.xi p[0] = s * q[0];
9117*53ee8cc1Swenshuai.xi
9118*53ee8cc1Swenshuai.xi prev_num_set = _u8Block_max_zag_set[row_block];
9119*53ee8cc1Swenshuai.xi
9120*53ee8cc1Swenshuai.xi Ph = &_Huff_tbls[_u8Comp_ac_tab[component_id]];
9121*53ee8cc1Swenshuai.xi
9122*53ee8cc1Swenshuai.xi for ( k = 1; k < 64; k++ )
9123*53ee8cc1Swenshuai.xi {
9124*53ee8cc1Swenshuai.xi s = JPEG_huff_decode( Ph );
9125*53ee8cc1Swenshuai.xi
9126*53ee8cc1Swenshuai.xi //printf("Decode s :%d\n",s);
9127*53ee8cc1Swenshuai.xi
9128*53ee8cc1Swenshuai.xi r = s >> 4;
9129*53ee8cc1Swenshuai.xi s &= 15;
9130*53ee8cc1Swenshuai.xi
9131*53ee8cc1Swenshuai.xi if ( s )
9132*53ee8cc1Swenshuai.xi {
9133*53ee8cc1Swenshuai.xi if ( r )
9134*53ee8cc1Swenshuai.xi {
9135*53ee8cc1Swenshuai.xi if ( ( k + r ) > 63 )
9136*53ee8cc1Swenshuai.xi {
9137*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
9138*53ee8cc1Swenshuai.xi return FALSE;
9139*53ee8cc1Swenshuai.xi }
9140*53ee8cc1Swenshuai.xi
9141*53ee8cc1Swenshuai.xi if ( k < prev_num_set )
9142*53ee8cc1Swenshuai.xi {
9143*53ee8cc1Swenshuai.xi MS_U32 n = MIN( r, prev_num_set - k );
9144*53ee8cc1Swenshuai.xi MS_U16 kt = k;
9145*53ee8cc1Swenshuai.xi while ( n-- )
9146*53ee8cc1Swenshuai.xi {
9147*53ee8cc1Swenshuai.xi p[_u8ZAG[kt++]] = 0;
9148*53ee8cc1Swenshuai.xi }
9149*53ee8cc1Swenshuai.xi }
9150*53ee8cc1Swenshuai.xi
9151*53ee8cc1Swenshuai.xi k += r;
9152*53ee8cc1Swenshuai.xi }
9153*53ee8cc1Swenshuai.xi
9154*53ee8cc1Swenshuai.xi r = JPEG_get_bits_2( s );
9155*53ee8cc1Swenshuai.xi s = HUFF_EXTEND( r, s );
9156*53ee8cc1Swenshuai.xi
9157*53ee8cc1Swenshuai.xi //assert(k < 64);
9158*53ee8cc1Swenshuai.xi
9159*53ee8cc1Swenshuai.xi p[_u8ZAG[k]] = s * q[k];
9160*53ee8cc1Swenshuai.xi }
9161*53ee8cc1Swenshuai.xi else
9162*53ee8cc1Swenshuai.xi {
9163*53ee8cc1Swenshuai.xi if ( r == 15 )
9164*53ee8cc1Swenshuai.xi {
9165*53ee8cc1Swenshuai.xi if ( ( k + 15 ) > 63 )
9166*53ee8cc1Swenshuai.xi {
9167*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
9168*53ee8cc1Swenshuai.xi return FALSE;
9169*53ee8cc1Swenshuai.xi }
9170*53ee8cc1Swenshuai.xi
9171*53ee8cc1Swenshuai.xi if ( k < prev_num_set )
9172*53ee8cc1Swenshuai.xi {
9173*53ee8cc1Swenshuai.xi MS_U16 n = MIN( 16, prev_num_set - k ); //bugfix Dec. 19, 2001 - was 15!
9174*53ee8cc1Swenshuai.xi MS_U16 kt = k;
9175*53ee8cc1Swenshuai.xi while ( n-- )
9176*53ee8cc1Swenshuai.xi {
9177*53ee8cc1Swenshuai.xi p[_u8ZAG[kt++]] = 0;
9178*53ee8cc1Swenshuai.xi }
9179*53ee8cc1Swenshuai.xi }
9180*53ee8cc1Swenshuai.xi
9181*53ee8cc1Swenshuai.xi k += 15;
9182*53ee8cc1Swenshuai.xi }
9183*53ee8cc1Swenshuai.xi else
9184*53ee8cc1Swenshuai.xi {
9185*53ee8cc1Swenshuai.xi //while (k < 64)
9186*53ee8cc1Swenshuai.xi // p[ZAG[k++]] = 0;
9187*53ee8cc1Swenshuai.xi
9188*53ee8cc1Swenshuai.xi break;
9189*53ee8cc1Swenshuai.xi }
9190*53ee8cc1Swenshuai.xi }
9191*53ee8cc1Swenshuai.xi }
9192*53ee8cc1Swenshuai.xi
9193*53ee8cc1Swenshuai.xi if ( k < prev_num_set )
9194*53ee8cc1Swenshuai.xi {
9195*53ee8cc1Swenshuai.xi MS_U16 kt = k;
9196*53ee8cc1Swenshuai.xi while ( kt < prev_num_set && kt < 64) // kt < 64 is for coverity check
9197*53ee8cc1Swenshuai.xi {
9198*53ee8cc1Swenshuai.xi p[_u8ZAG[kt++]] = 0;
9199*53ee8cc1Swenshuai.xi }
9200*53ee8cc1Swenshuai.xi }
9201*53ee8cc1Swenshuai.xi
9202*53ee8cc1Swenshuai.xi _u8Block_max_zag_set[row_block] = k;
9203*53ee8cc1Swenshuai.xi
9204*53ee8cc1Swenshuai.xi //block_num[row_block++] = k;
9205*53ee8cc1Swenshuai.xi row_block++;
9206*53ee8cc1Swenshuai.xi }
9207*53ee8cc1Swenshuai.xi
9208*53ee8cc1Swenshuai.xi _u16Restarts_left--;
9209*53ee8cc1Swenshuai.xi }
9210*53ee8cc1Swenshuai.xi return TRUE;
9211*53ee8cc1Swenshuai.xi }
9212*53ee8cc1Swenshuai.xi
9213*53ee8cc1Swenshuai.xi /*----------------------------------------------------------------------------*/
msAPI_JPEG_idct(JPEG_BLOCK_TYPE * data,MS_U8 * Pdst_ptr)9214*53ee8cc1Swenshuai.xi JPEG_STATIC void msAPI_JPEG_idct( JPEG_BLOCK_TYPE *data, MS_U8 *Pdst_ptr )
9215*53ee8cc1Swenshuai.xi {
9216*53ee8cc1Swenshuai.xi MS_S32 t0, t1, t2, t3;
9217*53ee8cc1Swenshuai.xi MS_S32 t10, t11, t12, t13;
9218*53ee8cc1Swenshuai.xi MS_S32 a1, a2, a3, a4, a5;
9219*53ee8cc1Swenshuai.xi MS_S32 rowctl;
9220*53ee8cc1Swenshuai.xi register JPEG_BLOCK_TYPE *pdata;
9221*53ee8cc1Swenshuai.xi
9222*53ee8cc1Swenshuai.xi //kevinhuang, use an internal array in idct to avoid memcpy to save time
9223*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE workspace[64];
9224*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *wsptr;
9225*53ee8cc1Swenshuai.xi
9226*53ee8cc1Swenshuai.xi pdata = data;
9227*53ee8cc1Swenshuai.xi wsptr = workspace;
9228*53ee8cc1Swenshuai.xi for ( rowctl = 8 - 1; rowctl >= 0; rowctl-- )
9229*53ee8cc1Swenshuai.xi {
9230*53ee8cc1Swenshuai.xi if ( ( pdata[1] | pdata[2] | pdata[3] | pdata[4] | pdata[5] | pdata[6] | pdata[7] ) == 0 )
9231*53ee8cc1Swenshuai.xi {
9232*53ee8cc1Swenshuai.xi MS_S16 dc_val = ( MS_S16 )( pdata[0] << 2 );
9233*53ee8cc1Swenshuai.xi
9234*53ee8cc1Swenshuai.xi wsptr[0] = dc_val;
9235*53ee8cc1Swenshuai.xi wsptr[1] = dc_val;
9236*53ee8cc1Swenshuai.xi wsptr[2] = dc_val;
9237*53ee8cc1Swenshuai.xi wsptr[3] = dc_val;
9238*53ee8cc1Swenshuai.xi wsptr[4] = dc_val;
9239*53ee8cc1Swenshuai.xi wsptr[5] = dc_val;
9240*53ee8cc1Swenshuai.xi wsptr[6] = dc_val;
9241*53ee8cc1Swenshuai.xi wsptr[7] = dc_val;
9242*53ee8cc1Swenshuai.xi
9243*53ee8cc1Swenshuai.xi pdata += 8; /* advance pointer to next row */
9244*53ee8cc1Swenshuai.xi wsptr += 8;
9245*53ee8cc1Swenshuai.xi continue;
9246*53ee8cc1Swenshuai.xi }
9247*53ee8cc1Swenshuai.xi
9248*53ee8cc1Swenshuai.xi a2 = ( MS_S32 )pdata[2];
9249*53ee8cc1Swenshuai.xi a3 = ( MS_S32 )pdata[6];
9250*53ee8cc1Swenshuai.xi
9251*53ee8cc1Swenshuai.xi a1 = (FIX_0_5411) * (a2 + a3);
9252*53ee8cc1Swenshuai.xi t2 = (-FIX_1_8477) * a3 + a1;
9253*53ee8cc1Swenshuai.xi t3 = (FIX_0_7653) * a2 + a1;
9254*53ee8cc1Swenshuai.xi
9255*53ee8cc1Swenshuai.xi t0 = ( ( MS_S32 )pdata[0] + ( MS_S32 )pdata[4] ) << 13;
9256*53ee8cc1Swenshuai.xi t1 = ( ( MS_S32 )pdata[0] - ( MS_S32 )pdata[4] ) << 13;
9257*53ee8cc1Swenshuai.xi
9258*53ee8cc1Swenshuai.xi t10 = t0 + t3;
9259*53ee8cc1Swenshuai.xi t13 = t0 - t3;
9260*53ee8cc1Swenshuai.xi t11 = t1 + t2;
9261*53ee8cc1Swenshuai.xi t12 = t1 - t2;
9262*53ee8cc1Swenshuai.xi
9263*53ee8cc1Swenshuai.xi t0 = ( MS_S32 )pdata[7];
9264*53ee8cc1Swenshuai.xi t1 = ( MS_S32 )pdata[5];
9265*53ee8cc1Swenshuai.xi t2 = ( MS_S32 )pdata[3];
9266*53ee8cc1Swenshuai.xi t3 = ( MS_S32 )pdata[1];
9267*53ee8cc1Swenshuai.xi
9268*53ee8cc1Swenshuai.xi a1 = t0 + t3;
9269*53ee8cc1Swenshuai.xi a2 = t1 + t2;
9270*53ee8cc1Swenshuai.xi a3 = t0 + t2;
9271*53ee8cc1Swenshuai.xi a4 = t1 + t3;
9272*53ee8cc1Swenshuai.xi a5 = (FIX_1_1758) * (a3 + a4);
9273*53ee8cc1Swenshuai.xi
9274*53ee8cc1Swenshuai.xi a1 = (-FIX_0_8999) * a1;
9275*53ee8cc1Swenshuai.xi a2 = (-FIX_2_5629) * a2;
9276*53ee8cc1Swenshuai.xi a3 = (-FIX_1_9615) * a3;
9277*53ee8cc1Swenshuai.xi a4 = (-FIX_0_3901) * a4;
9278*53ee8cc1Swenshuai.xi t0 = (FIX_0_2986) * t0;
9279*53ee8cc1Swenshuai.xi t1 = (FIX_2_0531) * t1;
9280*53ee8cc1Swenshuai.xi t2 = (FIX_3_0727) * t2;
9281*53ee8cc1Swenshuai.xi t3 = (FIX_1_5013) * t3;
9282*53ee8cc1Swenshuai.xi
9283*53ee8cc1Swenshuai.xi a3 += a5;
9284*53ee8cc1Swenshuai.xi a4 += a5;
9285*53ee8cc1Swenshuai.xi
9286*53ee8cc1Swenshuai.xi t0 += a1 + a3;
9287*53ee8cc1Swenshuai.xi t1 += a2 + a4;
9288*53ee8cc1Swenshuai.xi t2 += a2 + a3;
9289*53ee8cc1Swenshuai.xi t3 += a1 + a4;
9290*53ee8cc1Swenshuai.xi
9291*53ee8cc1Swenshuai.xi wsptr[0] = ( MS_S16 )DESCALE( t10 + t3, 13 - 2 );
9292*53ee8cc1Swenshuai.xi wsptr[1] = ( MS_S16 )DESCALE( t11 + t2, 13 - 2 );
9293*53ee8cc1Swenshuai.xi wsptr[2] = ( MS_S16 )DESCALE( t12 + t1, 13 - 2 );
9294*53ee8cc1Swenshuai.xi wsptr[3] = ( MS_S16 )DESCALE( t13 + t0, 13 - 2 );
9295*53ee8cc1Swenshuai.xi wsptr[4] = ( MS_S16 )DESCALE( t13 - t0, 13 - 2 );
9296*53ee8cc1Swenshuai.xi wsptr[5] = ( MS_S16 )DESCALE( t12 - t1, 13 - 2 );
9297*53ee8cc1Swenshuai.xi wsptr[6] = ( MS_S16 )DESCALE( t11 - t2, 13 - 2 );
9298*53ee8cc1Swenshuai.xi wsptr[7] = ( MS_S16 )DESCALE( t10 - t3, 13 - 2 );
9299*53ee8cc1Swenshuai.xi
9300*53ee8cc1Swenshuai.xi pdata += 8;
9301*53ee8cc1Swenshuai.xi wsptr += 8;
9302*53ee8cc1Swenshuai.xi }
9303*53ee8cc1Swenshuai.xi
9304*53ee8cc1Swenshuai.xi pdata = workspace;
9305*53ee8cc1Swenshuai.xi for ( rowctl = 8 - 1; rowctl >= 0; rowctl-- )
9306*53ee8cc1Swenshuai.xi {
9307*53ee8cc1Swenshuai.xi MS_S16 i;
9308*53ee8cc1Swenshuai.xi
9309*53ee8cc1Swenshuai.xi if ( ( pdata[8 * 1] | pdata[8 * 2] | pdata[8 * 3] | pdata[8 * 4] | pdata[8 * 5] | pdata[8 * 6] | pdata[8 * 7] ) == 0 )
9310*53ee8cc1Swenshuai.xi {
9311*53ee8cc1Swenshuai.xi MS_S16 dc_val = ( MS_S16 )DESCALE( ( MS_S32 )pdata[0], 2 + 3 ) + 128;
9312*53ee8cc1Swenshuai.xi
9313*53ee8cc1Swenshuai.xi clamp( dc_val );
9314*53ee8cc1Swenshuai.xi
9315*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 0] = ( MS_U8 )dc_val;
9316*53ee8cc1Swenshuai.xi
9317*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9318*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor == 3)
9319*53ee8cc1Swenshuai.xi {
9320*53ee8cc1Swenshuai.xi pdata++;
9321*53ee8cc1Swenshuai.xi Pdst_ptr++;
9322*53ee8cc1Swenshuai.xi continue;
9323*53ee8cc1Swenshuai.xi }
9324*53ee8cc1Swenshuai.xi #endif
9325*53ee8cc1Swenshuai.xi
9326*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 4] = ( MS_U8 )dc_val;
9327*53ee8cc1Swenshuai.xi
9328*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9329*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor == 2)
9330*53ee8cc1Swenshuai.xi {
9331*53ee8cc1Swenshuai.xi pdata++;
9332*53ee8cc1Swenshuai.xi Pdst_ptr++;
9333*53ee8cc1Swenshuai.xi continue;
9334*53ee8cc1Swenshuai.xi }
9335*53ee8cc1Swenshuai.xi #endif
9336*53ee8cc1Swenshuai.xi
9337*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 2] = ( MS_U8 )dc_val;
9338*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 6] = ( MS_U8 )dc_val;
9339*53ee8cc1Swenshuai.xi
9340*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9341*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor == 1)
9342*53ee8cc1Swenshuai.xi {
9343*53ee8cc1Swenshuai.xi pdata++;
9344*53ee8cc1Swenshuai.xi Pdst_ptr++;
9345*53ee8cc1Swenshuai.xi continue;
9346*53ee8cc1Swenshuai.xi }
9347*53ee8cc1Swenshuai.xi #endif
9348*53ee8cc1Swenshuai.xi
9349*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 1] = ( MS_U8 )dc_val;
9350*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 5] = ( MS_U8 )dc_val;
9351*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 3] = ( MS_U8 )dc_val;
9352*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 7] = ( MS_U8 )dc_val;
9353*53ee8cc1Swenshuai.xi
9354*53ee8cc1Swenshuai.xi pdata++;
9355*53ee8cc1Swenshuai.xi Pdst_ptr++;
9356*53ee8cc1Swenshuai.xi continue;
9357*53ee8cc1Swenshuai.xi }
9358*53ee8cc1Swenshuai.xi
9359*53ee8cc1Swenshuai.xi a2 = ( MS_S32 )pdata[8 * 2];
9360*53ee8cc1Swenshuai.xi a3 = ( MS_S32 )pdata[8 * 6];
9361*53ee8cc1Swenshuai.xi
9362*53ee8cc1Swenshuai.xi a1 = (FIX_0_5411) * (a2 + a3);
9363*53ee8cc1Swenshuai.xi t2 = (-FIX_1_8477) * a3 + a1;
9364*53ee8cc1Swenshuai.xi t3 = (FIX_0_7653) * a2 + a1;
9365*53ee8cc1Swenshuai.xi
9366*53ee8cc1Swenshuai.xi t0 = ( ( MS_S32 )pdata[8 * 0] + ( MS_S32 )pdata[8 * 4] ) << 13;
9367*53ee8cc1Swenshuai.xi t1 = ( ( MS_S32 )pdata[8 * 0] - ( MS_S32 )pdata[8 * 4] ) << 13;
9368*53ee8cc1Swenshuai.xi
9369*53ee8cc1Swenshuai.xi t10 = t0 + t3;
9370*53ee8cc1Swenshuai.xi t13 = t0 - t3;
9371*53ee8cc1Swenshuai.xi t11 = t1 + t2;
9372*53ee8cc1Swenshuai.xi t12 = t1 - t2;
9373*53ee8cc1Swenshuai.xi
9374*53ee8cc1Swenshuai.xi t0 = ( MS_S32 )pdata[8 * 7];
9375*53ee8cc1Swenshuai.xi t1 = ( MS_S32 )pdata[8 * 5];
9376*53ee8cc1Swenshuai.xi t2 = ( MS_S32 )pdata[8 * 3];
9377*53ee8cc1Swenshuai.xi t3 = ( MS_S32 )pdata[8 * 1];
9378*53ee8cc1Swenshuai.xi
9379*53ee8cc1Swenshuai.xi a1 = t0 + t3;
9380*53ee8cc1Swenshuai.xi a2 = t1 + t2;
9381*53ee8cc1Swenshuai.xi a3 = t0 + t2;
9382*53ee8cc1Swenshuai.xi a4 = t1 + t3;
9383*53ee8cc1Swenshuai.xi a5 = (FIX_1_1758) * (a3 + a4);
9384*53ee8cc1Swenshuai.xi
9385*53ee8cc1Swenshuai.xi a1 = (-FIX_0_8999) * a1;
9386*53ee8cc1Swenshuai.xi a2 = (-FIX_2_5629) * a2;
9387*53ee8cc1Swenshuai.xi a3 = (-FIX_1_9615) * a3;
9388*53ee8cc1Swenshuai.xi a4 = (-FIX_0_3901) * a4;
9389*53ee8cc1Swenshuai.xi t0 = (FIX_0_2986) * t0;
9390*53ee8cc1Swenshuai.xi t1 = (FIX_2_0531) * t1;
9391*53ee8cc1Swenshuai.xi t2 = (FIX_3_0727) * t2;
9392*53ee8cc1Swenshuai.xi t3 = (FIX_1_5013) * t3;
9393*53ee8cc1Swenshuai.xi
9394*53ee8cc1Swenshuai.xi a3 += a5;
9395*53ee8cc1Swenshuai.xi a4 += a5;
9396*53ee8cc1Swenshuai.xi
9397*53ee8cc1Swenshuai.xi t0 += a1 + a3;
9398*53ee8cc1Swenshuai.xi t1 += a2 + a4;
9399*53ee8cc1Swenshuai.xi t2 += a2 + a3;
9400*53ee8cc1Swenshuai.xi t3 += a1 + a4;
9401*53ee8cc1Swenshuai.xi
9402*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t10 + t3, 13 + 2 + 3 ) + 128;
9403*53ee8cc1Swenshuai.xi clamp( i )
9404*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 0] = ( MS_U8 )i;
9405*53ee8cc1Swenshuai.xi
9406*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9407*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor== 3)
9408*53ee8cc1Swenshuai.xi {
9409*53ee8cc1Swenshuai.xi pdata++;
9410*53ee8cc1Swenshuai.xi Pdst_ptr++;
9411*53ee8cc1Swenshuai.xi continue;
9412*53ee8cc1Swenshuai.xi }
9413*53ee8cc1Swenshuai.xi #endif
9414*53ee8cc1Swenshuai.xi
9415*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t13 - t0, 13 + 2 + 3 ) + 128;
9416*53ee8cc1Swenshuai.xi clamp( i )
9417*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 4] = ( MS_U8 )i;
9418*53ee8cc1Swenshuai.xi
9419*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9420*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor== 2)
9421*53ee8cc1Swenshuai.xi {
9422*53ee8cc1Swenshuai.xi pdata++;
9423*53ee8cc1Swenshuai.xi Pdst_ptr++;
9424*53ee8cc1Swenshuai.xi continue;
9425*53ee8cc1Swenshuai.xi }
9426*53ee8cc1Swenshuai.xi #endif
9427*53ee8cc1Swenshuai.xi
9428*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t12 + t1, 13 + 2 + 3 ) + 128;
9429*53ee8cc1Swenshuai.xi clamp( i )
9430*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 2] = ( MS_U8 )i;
9431*53ee8cc1Swenshuai.xi
9432*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t11 - t2, 13 + 2 + 3 ) + 128;
9433*53ee8cc1Swenshuai.xi clamp( i )
9434*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 6] = ( MS_U8 )i;
9435*53ee8cc1Swenshuai.xi
9436*53ee8cc1Swenshuai.xi #if SW_OPTIMIZE
9437*53ee8cc1Swenshuai.xi if(_u8ScaleDownFactor== 1)
9438*53ee8cc1Swenshuai.xi {
9439*53ee8cc1Swenshuai.xi pdata++;
9440*53ee8cc1Swenshuai.xi Pdst_ptr++;
9441*53ee8cc1Swenshuai.xi continue;
9442*53ee8cc1Swenshuai.xi }
9443*53ee8cc1Swenshuai.xi #endif
9444*53ee8cc1Swenshuai.xi
9445*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t11 + t2, 13 + 2 + 3 ) + 128;
9446*53ee8cc1Swenshuai.xi clamp( i )
9447*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 1] = ( MS_U8 )i;
9448*53ee8cc1Swenshuai.xi
9449*53ee8cc1Swenshuai.xi
9450*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t13 + t0, 13 + 2 + 3 ) + 128;
9451*53ee8cc1Swenshuai.xi clamp( i )
9452*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 3] = ( MS_U8 )i;
9453*53ee8cc1Swenshuai.xi
9454*53ee8cc1Swenshuai.xi
9455*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t12 - t1, 13 + 2 + 3 ) + 128;
9456*53ee8cc1Swenshuai.xi clamp( i )
9457*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 5] = ( MS_U8 )i;
9458*53ee8cc1Swenshuai.xi
9459*53ee8cc1Swenshuai.xi
9460*53ee8cc1Swenshuai.xi i = ( MS_S16 )DESCALE( t10 - t3, 13 + 2 + 3 ) + 128;
9461*53ee8cc1Swenshuai.xi clamp( i )
9462*53ee8cc1Swenshuai.xi Pdst_ptr[8 * 7] = ( MS_U8 )i;
9463*53ee8cc1Swenshuai.xi
9464*53ee8cc1Swenshuai.xi pdata++;
9465*53ee8cc1Swenshuai.xi Pdst_ptr++;
9466*53ee8cc1Swenshuai.xi }
9467*53ee8cc1Swenshuai.xi }
9468*53ee8cc1Swenshuai.xi
msAPI_JPEG_Idct_CMYKConvert(void)9469*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_Idct_CMYKConvert(void)
9470*53ee8cc1Swenshuai.xi {
9471*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *Psrc_ptr = _ps16Block_seg[0];
9472*53ee8cc1Swenshuai.xi MS_U8 *Pdst_ptr = gpu8Sample_buf;
9473*53ee8cc1Swenshuai.xi MS_U8 *u8Start_Each_Block, *u8Start_Each_Row;
9474*53ee8cc1Swenshuai.xi MS_U32 u32_y_Blcok_Pos = 0, Max_Pixel_Per_Row;
9475*53ee8cc1Swenshuai.xi MS_S32 i;
9476*53ee8cc1Swenshuai.xi MS_U8 u8Row_in_block, k;
9477*53ee8cc1Swenshuai.xi MS_U16 u16Pixel_Per_Block_x = 8, u16Pixel_Per_Block_y = 8;
9478*53ee8cc1Swenshuai.xi MS_U16 u16Pixel_Per_Pack_row = 16, u16TotalBlock_Per_Row, u16ScaleDownStep = 1 << _u8ScaleDownFactor;
9479*53ee8cc1Swenshuai.xi
9480*53ee8cc1Swenshuai.xi u16TotalBlock_Per_Row = (_u32Max_blocks_per_row)/2;
9481*53ee8cc1Swenshuai.xi
9482*53ee8cc1Swenshuai.xi u16Pixel_Per_Pack_row = u16Pixel_Per_Pack_row >> _u8ScaleDownFactor;
9483*53ee8cc1Swenshuai.xi u16Pixel_Per_Block_x = u16Pixel_Per_Block_x/* >> _u8ScaleDownFactor*/;
9484*53ee8cc1Swenshuai.xi u16Pixel_Per_Block_y = u16Pixel_Per_Block_y >> _u8ScaleDownFactor;
9485*53ee8cc1Swenshuai.xi
9486*53ee8cc1Swenshuai.xi
9487*53ee8cc1Swenshuai.xi Max_Pixel_Per_Row = (u16TotalBlock_Per_Row*u16Pixel_Per_Block_x >> _u8ScaleDownFactor);
9488*53ee8cc1Swenshuai.xi
9489*53ee8cc1Swenshuai.xi //Get start position of each row
9490*53ee8cc1Swenshuai.xi u8Start_Each_Row = (u8Out_buf + (u32_Decode_Line*(Max_Pixel_Per_Row*u16Pixel_Per_Block_y)));
9491*53ee8cc1Swenshuai.xi
9492*53ee8cc1Swenshuai.xi for ( i = (MS_S32)_u32Max_blocks_per_row; i > 0;)
9493*53ee8cc1Swenshuai.xi {
9494*53ee8cc1Swenshuai.xi //===================GET Y1 BLOCKs=======================
9495*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9496*53ee8cc1Swenshuai.xi
9497*53ee8cc1Swenshuai.xi //Get start position of block
9498*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9499*53ee8cc1Swenshuai.xi
9500*53ee8cc1Swenshuai.xi //Write value to destination buffer
9501*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9502*53ee8cc1Swenshuai.xi {
9503*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9504*53ee8cc1Swenshuai.xi {
9505*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + (k*2) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9506*53ee8cc1Swenshuai.xi }
9507*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9508*53ee8cc1Swenshuai.xi }
9509*53ee8cc1Swenshuai.xi
9510*53ee8cc1Swenshuai.xi //Skip U. V block for 422 format
9511*53ee8cc1Swenshuai.xi Psrc_ptr += 256;
9512*53ee8cc1Swenshuai.xi Pdst_ptr += 256;
9513*53ee8cc1Swenshuai.xi i-=4;
9514*53ee8cc1Swenshuai.xi
9515*53ee8cc1Swenshuai.xi if(i == 0)
9516*53ee8cc1Swenshuai.xi {
9517*53ee8cc1Swenshuai.xi //Already decoded all blocks
9518*53ee8cc1Swenshuai.xi continue;
9519*53ee8cc1Swenshuai.xi }
9520*53ee8cc1Swenshuai.xi else if(i < 0)
9521*53ee8cc1Swenshuai.xi {
9522*53ee8cc1Swenshuai.xi printf("GET BLOCK NUMBER ERROR!\n");
9523*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
9524*53ee8cc1Swenshuai.xi return FALSE;
9525*53ee8cc1Swenshuai.xi }
9526*53ee8cc1Swenshuai.xi
9527*53ee8cc1Swenshuai.xi //Move y block position in a row
9528*53ee8cc1Swenshuai.xi u32_y_Blcok_Pos++;
9529*53ee8cc1Swenshuai.xi //===================GET Y2 BLOCKs=======================
9530*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9531*53ee8cc1Swenshuai.xi
9532*53ee8cc1Swenshuai.xi //Get start position of block
9533*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9534*53ee8cc1Swenshuai.xi
9535*53ee8cc1Swenshuai.xi //Write value to destination buffer
9536*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9537*53ee8cc1Swenshuai.xi {
9538*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9539*53ee8cc1Swenshuai.xi {
9540*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + (k*2) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9541*53ee8cc1Swenshuai.xi }
9542*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9543*53ee8cc1Swenshuai.xi }
9544*53ee8cc1Swenshuai.xi
9545*53ee8cc1Swenshuai.xi //Move idct data position
9546*53ee8cc1Swenshuai.xi Psrc_ptr += 64;
9547*53ee8cc1Swenshuai.xi Pdst_ptr += 64;
9548*53ee8cc1Swenshuai.xi i--;
9549*53ee8cc1Swenshuai.xi
9550*53ee8cc1Swenshuai.xi //Move y block position in a row, Reset position for U block
9551*53ee8cc1Swenshuai.xi u32_y_Blcok_Pos--;
9552*53ee8cc1Swenshuai.xi //===================GET U BLOCKs=======================
9553*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9554*53ee8cc1Swenshuai.xi
9555*53ee8cc1Swenshuai.xi //Get start position of block
9556*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9557*53ee8cc1Swenshuai.xi
9558*53ee8cc1Swenshuai.xi //Write value to destination buffer
9559*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9560*53ee8cc1Swenshuai.xi {
9561*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9562*53ee8cc1Swenshuai.xi {
9563*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + ((k*4) + 1) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9564*53ee8cc1Swenshuai.xi }
9565*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9566*53ee8cc1Swenshuai.xi }
9567*53ee8cc1Swenshuai.xi
9568*53ee8cc1Swenshuai.xi //Move idct data position
9569*53ee8cc1Swenshuai.xi Psrc_ptr += 64;
9570*53ee8cc1Swenshuai.xi Pdst_ptr += 64;
9571*53ee8cc1Swenshuai.xi i--;
9572*53ee8cc1Swenshuai.xi
9573*53ee8cc1Swenshuai.xi //===================GET V BLOCKs=======================
9574*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9575*53ee8cc1Swenshuai.xi
9576*53ee8cc1Swenshuai.xi //Get start position of block
9577*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9578*53ee8cc1Swenshuai.xi
9579*53ee8cc1Swenshuai.xi //Write value to destination buffer
9580*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9581*53ee8cc1Swenshuai.xi {
9582*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9583*53ee8cc1Swenshuai.xi {
9584*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + ((k*4) + 3) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9585*53ee8cc1Swenshuai.xi }
9586*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9587*53ee8cc1Swenshuai.xi }
9588*53ee8cc1Swenshuai.xi
9589*53ee8cc1Swenshuai.xi //Move idct data position
9590*53ee8cc1Swenshuai.xi Psrc_ptr += 128;
9591*53ee8cc1Swenshuai.xi Pdst_ptr += 128;
9592*53ee8cc1Swenshuai.xi i-=2;
9593*53ee8cc1Swenshuai.xi
9594*53ee8cc1Swenshuai.xi //Move y block position in a row, Reset position for U block
9595*53ee8cc1Swenshuai.xi u32_y_Blcok_Pos+=2;
9596*53ee8cc1Swenshuai.xi
9597*53ee8cc1Swenshuai.xi }
9598*53ee8cc1Swenshuai.xi
9599*53ee8cc1Swenshuai.xi u32_Decode_Line++;
9600*53ee8cc1Swenshuai.xi return TRUE;
9601*53ee8cc1Swenshuai.xi }
9602*53ee8cc1Swenshuai.xi
msAPI_JPEG_Idct_RGBConvert(void)9603*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_Idct_RGBConvert(void)
9604*53ee8cc1Swenshuai.xi {
9605*53ee8cc1Swenshuai.xi JPEG_BLOCK_TYPE *Psrc_ptr = _ps16Block_seg[0];
9606*53ee8cc1Swenshuai.xi MS_U8 *Pdst_ptr = gpu8Sample_buf;
9607*53ee8cc1Swenshuai.xi MS_U8 *u8Start_Each_Block, *u8Start_Each_Row;
9608*53ee8cc1Swenshuai.xi MS_U32 u32_y_Blcok_Pos = 0, Max_Pixel_Per_Row;
9609*53ee8cc1Swenshuai.xi MS_S32 i;
9610*53ee8cc1Swenshuai.xi MS_U8 u8Row_in_block, k;
9611*53ee8cc1Swenshuai.xi MS_U16 u16Pixel_Per_Block_x = 8, u16Pixel_Per_Block_y = 8;
9612*53ee8cc1Swenshuai.xi MS_U16 u16Pixel_Per_Pack_row = 16, u16TotalBlock_Per_Row, u16ScaleDownStep = 1 << _u8ScaleDownFactor;
9613*53ee8cc1Swenshuai.xi
9614*53ee8cc1Swenshuai.xi u16TotalBlock_Per_Row = (_u32Max_blocks_per_row*2)/3;
9615*53ee8cc1Swenshuai.xi
9616*53ee8cc1Swenshuai.xi u16Pixel_Per_Pack_row = u16Pixel_Per_Pack_row >> _u8ScaleDownFactor;
9617*53ee8cc1Swenshuai.xi u16Pixel_Per_Block_x = u16Pixel_Per_Block_x/* >> _u8ScaleDownFactor*/;
9618*53ee8cc1Swenshuai.xi u16Pixel_Per_Block_y = u16Pixel_Per_Block_y >> _u8ScaleDownFactor;
9619*53ee8cc1Swenshuai.xi
9620*53ee8cc1Swenshuai.xi
9621*53ee8cc1Swenshuai.xi Max_Pixel_Per_Row = (u16TotalBlock_Per_Row*u16Pixel_Per_Block_x >> _u8ScaleDownFactor);
9622*53ee8cc1Swenshuai.xi
9623*53ee8cc1Swenshuai.xi //Get start position of each row
9624*53ee8cc1Swenshuai.xi u8Start_Each_Row = (u8Out_buf + (u32_Decode_Line*(Max_Pixel_Per_Row*u16Pixel_Per_Block_y)));
9625*53ee8cc1Swenshuai.xi
9626*53ee8cc1Swenshuai.xi for ( i = (MS_S32)_u32Max_blocks_per_row; i > 0;)
9627*53ee8cc1Swenshuai.xi {
9628*53ee8cc1Swenshuai.xi
9629*53ee8cc1Swenshuai.xi //===================GET R BLOCKs========================
9630*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9631*53ee8cc1Swenshuai.xi
9632*53ee8cc1Swenshuai.xi //Get start position of block
9633*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9634*53ee8cc1Swenshuai.xi
9635*53ee8cc1Swenshuai.xi //Write value to destination buffer
9636*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9637*53ee8cc1Swenshuai.xi {
9638*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9639*53ee8cc1Swenshuai.xi {
9640*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + (k*2) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9641*53ee8cc1Swenshuai.xi }
9642*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9643*53ee8cc1Swenshuai.xi }
9644*53ee8cc1Swenshuai.xi
9645*53ee8cc1Swenshuai.xi //Skip U. V block for 422 format
9646*53ee8cc1Swenshuai.xi Psrc_ptr += 64;
9647*53ee8cc1Swenshuai.xi Pdst_ptr += 64;
9648*53ee8cc1Swenshuai.xi i--;
9649*53ee8cc1Swenshuai.xi
9650*53ee8cc1Swenshuai.xi //===================GET G BLOCKs=======================
9651*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9652*53ee8cc1Swenshuai.xi
9653*53ee8cc1Swenshuai.xi //Get start position of block
9654*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9655*53ee8cc1Swenshuai.xi //Write value to destination buffer
9656*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9657*53ee8cc1Swenshuai.xi {
9658*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9659*53ee8cc1Swenshuai.xi {
9660*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + ((k*4) + 1) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9661*53ee8cc1Swenshuai.xi }
9662*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9663*53ee8cc1Swenshuai.xi }
9664*53ee8cc1Swenshuai.xi
9665*53ee8cc1Swenshuai.xi //Move idct data position
9666*53ee8cc1Swenshuai.xi Psrc_ptr += 64;
9667*53ee8cc1Swenshuai.xi Pdst_ptr += 64;
9668*53ee8cc1Swenshuai.xi i--;
9669*53ee8cc1Swenshuai.xi
9670*53ee8cc1Swenshuai.xi //===================GET B BLOCKs=======================
9671*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9672*53ee8cc1Swenshuai.xi
9673*53ee8cc1Swenshuai.xi //Get start position of block
9674*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9675*53ee8cc1Swenshuai.xi //Write value to destination buffer
9676*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9677*53ee8cc1Swenshuai.xi {
9678*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9679*53ee8cc1Swenshuai.xi {
9680*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + ((k*4) + 3) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9681*53ee8cc1Swenshuai.xi }
9682*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9683*53ee8cc1Swenshuai.xi }
9684*53ee8cc1Swenshuai.xi
9685*53ee8cc1Swenshuai.xi //Move idct data position
9686*53ee8cc1Swenshuai.xi Psrc_ptr += 64;
9687*53ee8cc1Swenshuai.xi Pdst_ptr += 64;
9688*53ee8cc1Swenshuai.xi i--;
9689*53ee8cc1Swenshuai.xi
9690*53ee8cc1Swenshuai.xi if(i == 0)
9691*53ee8cc1Swenshuai.xi {
9692*53ee8cc1Swenshuai.xi //Already decoded all blocks
9693*53ee8cc1Swenshuai.xi continue;
9694*53ee8cc1Swenshuai.xi }
9695*53ee8cc1Swenshuai.xi else if(i < 0)
9696*53ee8cc1Swenshuai.xi {
9697*53ee8cc1Swenshuai.xi printf("GET BLOCK NUMBER ERROR!\n");
9698*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_DECODE_ERROR );
9699*53ee8cc1Swenshuai.xi return FALSE;
9700*53ee8cc1Swenshuai.xi }
9701*53ee8cc1Swenshuai.xi
9702*53ee8cc1Swenshuai.xi //Move y block position in a row
9703*53ee8cc1Swenshuai.xi u32_y_Blcok_Pos++;
9704*53ee8cc1Swenshuai.xi //===================GET R BLOCKs=======================
9705*53ee8cc1Swenshuai.xi msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
9706*53ee8cc1Swenshuai.xi
9707*53ee8cc1Swenshuai.xi //Get start position of block
9708*53ee8cc1Swenshuai.xi u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
9709*53ee8cc1Swenshuai.xi //Write value to destination buffer
9710*53ee8cc1Swenshuai.xi for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
9711*53ee8cc1Swenshuai.xi {
9712*53ee8cc1Swenshuai.xi for(k=0;k<u16Pixel_Per_Block_y;k++)
9713*53ee8cc1Swenshuai.xi {
9714*53ee8cc1Swenshuai.xi *(u8Start_Each_Block + (k*2) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
9715*53ee8cc1Swenshuai.xi }
9716*53ee8cc1Swenshuai.xi u8Start_Each_Block += Max_Pixel_Per_Row;
9717*53ee8cc1Swenshuai.xi }
9718*53ee8cc1Swenshuai.xi
9719*53ee8cc1Swenshuai.xi //Move idct data position
9720*53ee8cc1Swenshuai.xi Psrc_ptr += 192;
9721*53ee8cc1Swenshuai.xi Pdst_ptr += 192;
9722*53ee8cc1Swenshuai.xi i-=3;
9723*53ee8cc1Swenshuai.xi
9724*53ee8cc1Swenshuai.xi //Move y block position in a row, Reset position for U block
9725*53ee8cc1Swenshuai.xi u32_y_Blcok_Pos++;
9726*53ee8cc1Swenshuai.xi
9727*53ee8cc1Swenshuai.xi }
9728*53ee8cc1Swenshuai.xi
9729*53ee8cc1Swenshuai.xi u32_Decode_Line++;
9730*53ee8cc1Swenshuai.xi return TRUE;
9731*53ee8cc1Swenshuai.xi }
9732*53ee8cc1Swenshuai.xi
9733*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9734*53ee8cc1Swenshuai.xi // Performs a 2D IDCT over the entire row's coefficient buffer.
msAPI_JPEG_transform_row(void)9735*53ee8cc1Swenshuai.xi JPEG_STATIC MS_BOOL msAPI_JPEG_transform_row( void )
9736*53ee8cc1Swenshuai.xi {
9737*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Max block : %ld\n", _u32Max_blocks_per_row);
9738*53ee8cc1Swenshuai.xi
9739*53ee8cc1Swenshuai.xi switch ( gu8Scan_type )
9740*53ee8cc1Swenshuai.xi {
9741*53ee8cc1Swenshuai.xi case E_JPEG_CMYK:
9742*53ee8cc1Swenshuai.xi if(!msAPI_JPEG_Idct_CMYKConvert())
9743*53ee8cc1Swenshuai.xi return FALSE;
9744*53ee8cc1Swenshuai.xi break;
9745*53ee8cc1Swenshuai.xi case E_JPEG_RGB:
9746*53ee8cc1Swenshuai.xi if(!msAPI_JPEG_Idct_RGBConvert())
9747*53ee8cc1Swenshuai.xi return FALSE;
9748*53ee8cc1Swenshuai.xi break;
9749*53ee8cc1Swenshuai.xi default :
9750*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("System don`t support this format!\n");
9751*53ee8cc1Swenshuai.xi JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
9752*53ee8cc1Swenshuai.xi return FALSE;
9753*53ee8cc1Swenshuai.xi break;
9754*53ee8cc1Swenshuai.xi }
9755*53ee8cc1Swenshuai.xi return TRUE;
9756*53ee8cc1Swenshuai.xi
9757*53ee8cc1Swenshuai.xi }
9758*53ee8cc1Swenshuai.xi
msAPI_JPEG_Baseline_Decode(void)9759*53ee8cc1Swenshuai.xi JPEG_STATIC JPEG_Result msAPI_JPEG_Baseline_Decode(void)
9760*53ee8cc1Swenshuai.xi {
9761*53ee8cc1Swenshuai.xi
9762*53ee8cc1Swenshuai.xi if(_bProgressive_flag==TRUE)
9763*53ee8cc1Swenshuai.xi return (E_JPEG_FAILED);
9764*53ee8cc1Swenshuai.xi
9765*53ee8cc1Swenshuai.xi if ( _u16Total_lines_left == 0 )
9766*53ee8cc1Swenshuai.xi {
9767*53ee8cc1Swenshuai.xi return ( E_JPEG_OKAY );
9768*53ee8cc1Swenshuai.xi }
9769*53ee8cc1Swenshuai.xi
9770*53ee8cc1Swenshuai.xi #ifdef JPD_LONGJUMP_SUPPORT
9771*53ee8cc1Swenshuai.xi if ( setjmp( _jmp_state ) )
9772*53ee8cc1Swenshuai.xi {
9773*53ee8cc1Swenshuai.xi return ( E_JPEG_FAILED );
9774*53ee8cc1Swenshuai.xi }
9775*53ee8cc1Swenshuai.xi #endif
9776*53ee8cc1Swenshuai.xi
9777*53ee8cc1Swenshuai.xi if( _u16Total_lines_left > 0 )
9778*53ee8cc1Swenshuai.xi {
9779*53ee8cc1Swenshuai.xi
9780*53ee8cc1Swenshuai.xi if(!msAPI_JPEG_decode_next_row())
9781*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
9782*53ee8cc1Swenshuai.xi
9783*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Max line num : %d\n",(_u16Total_lines_left));
9784*53ee8cc1Swenshuai.xi
9785*53ee8cc1Swenshuai.xi if(!msAPI_JPEG_transform_row()) //IDCT
9786*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
9787*53ee8cc1Swenshuai.xi
9788*53ee8cc1Swenshuai.xi _u16Total_lines_left -= gu8Max_mcu_y_size;
9789*53ee8cc1Swenshuai.xi }
9790*53ee8cc1Swenshuai.xi
9791*53ee8cc1Swenshuai.xi return (E_JPEG_DONE);
9792*53ee8cc1Swenshuai.xi }
9793*53ee8cc1Swenshuai.xi #endif //SW_JPD_RGB_CMYK
9794*53ee8cc1Swenshuai.xi
9795*53ee8cc1Swenshuai.xi
9796*53ee8cc1Swenshuai.xi
MApi_JPEG_DisableAddressConvert(void)9797*53ee8cc1Swenshuai.xi void MApi_JPEG_DisableAddressConvert(void)
9798*53ee8cc1Swenshuai.xi {
9799*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s\n", __FUNCTION__);
9800*53ee8cc1Swenshuai.xi __bIsMjpeg = FALSE;
9801*53ee8cc1Swenshuai.xi }
9802*53ee8cc1Swenshuai.xi
9803*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9804*53ee8cc1Swenshuai.xi /********************************************************************/
9805*53ee8cc1Swenshuai.xi ///Get the free memory for temporary usage.
9806*53ee8cc1Swenshuai.xi ///@param size \b IN indicate the size of wanted free memory
9807*53ee8cc1Swenshuai.xi ///@return the physical address of free memory
9808*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetFreeMemory(MS_U32 size)9809*53ee8cc1Swenshuai.xi MS_PHYADDR _MApi_JPEG_GetFreeMemory(MS_U32 size)
9810*53ee8cc1Swenshuai.xi {
9811*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
9812*53ee8cc1Swenshuai.xi {
9813*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
9814*53ee8cc1Swenshuai.xi return 0;
9815*53ee8cc1Swenshuai.xi }
9816*53ee8cc1Swenshuai.xi
9817*53ee8cc1Swenshuai.xi if(_bProgressive_flag == TRUE)
9818*53ee8cc1Swenshuai.xi {
9819*53ee8cc1Swenshuai.xi return 0;
9820*53ee8cc1Swenshuai.xi }
9821*53ee8cc1Swenshuai.xi
9822*53ee8cc1Swenshuai.xi if(size > (INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE))
9823*53ee8cc1Swenshuai.xi {
9824*53ee8cc1Swenshuai.xi return 0;
9825*53ee8cc1Swenshuai.xi }
9826*53ee8cc1Swenshuai.xi
9827*53ee8cc1Swenshuai.xi INTERNAL_BUFFER_SIZE = INTERNAL_BUFFER_SIZE - size;
9828*53ee8cc1Swenshuai.xi
9829*53ee8cc1Swenshuai.xi return (MS_VA2PA((MS_U32)INTERNAL_BUFFER_ADDR) + INTERNAL_BUFFER_SIZE);
9830*53ee8cc1Swenshuai.xi }
9831*53ee8cc1Swenshuai.xi
9832*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9833*53ee8cc1Swenshuai.xi /********************************************************************/
9834*53ee8cc1Swenshuai.xi ///Get the data offset of JPEG file.
9835*53ee8cc1Swenshuai.xi ///@return the data offset of JPEG file
9836*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetDataOffset(void)9837*53ee8cc1Swenshuai.xi MS_U32 _MApi_JPEG_GetDataOffset(void)
9838*53ee8cc1Swenshuai.xi {
9839*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
9840*53ee8cc1Swenshuai.xi {
9841*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
9842*53ee8cc1Swenshuai.xi return 0;
9843*53ee8cc1Swenshuai.xi }
9844*53ee8cc1Swenshuai.xi
9845*53ee8cc1Swenshuai.xi if(_bThumbnailAccessMode)
9846*53ee8cc1Swenshuai.xi {
9847*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: Thumbnail mode!!\n", __FUNCTION__);
9848*53ee8cc1Swenshuai.xi return 0;
9849*53ee8cc1Swenshuai.xi }
9850*53ee8cc1Swenshuai.xi
9851*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : u32DataOffset = 0x%lx\n", __FUNCTION__ , u32DataOffset);
9852*53ee8cc1Swenshuai.xi return u32DataOffset;
9853*53ee8cc1Swenshuai.xi }
9854*53ee8cc1Swenshuai.xi
9855*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9856*53ee8cc1Swenshuai.xi /********************************************************************/
9857*53ee8cc1Swenshuai.xi ///Get the sof marker offset of JPEG file.
9858*53ee8cc1Swenshuai.xi ///@return the sof marker offset of JPEG file
9859*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_GetSOFOffset(void)9860*53ee8cc1Swenshuai.xi MS_U32 _MApi_JPEG_GetSOFOffset(void)
9861*53ee8cc1Swenshuai.xi {
9862*53ee8cc1Swenshuai.xi if(_bIsInit == FALSE)
9863*53ee8cc1Swenshuai.xi {
9864*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: JPD have not init!!\n", __FUNCTION__);
9865*53ee8cc1Swenshuai.xi return 0;
9866*53ee8cc1Swenshuai.xi }
9867*53ee8cc1Swenshuai.xi
9868*53ee8cc1Swenshuai.xi if(_bThumbnailAccessMode)
9869*53ee8cc1Swenshuai.xi {
9870*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: Thumbnail mode!!\n", __FUNCTION__);
9871*53ee8cc1Swenshuai.xi return 0;
9872*53ee8cc1Swenshuai.xi }
9873*53ee8cc1Swenshuai.xi
9874*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s : u32SOFOffset = 0x%lx\n", __FUNCTION__ , u32SOFOffset);
9875*53ee8cc1Swenshuai.xi return u32SOFOffset;
9876*53ee8cc1Swenshuai.xi }
9877*53ee8cc1Swenshuai.xi
9878*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9879*53ee8cc1Swenshuai.xi /********************************************************************/
9880*53ee8cc1Swenshuai.xi ///Enable/Disable JPD CMYK support.
9881*53ee8cc1Swenshuai.xi ///@param bEnable \b IN enable/disable supporting JPD CMYK
9882*53ee8cc1Swenshuai.xi ///@return E_JPEG_OKAY/E_JPEG_FAILED
9883*53ee8cc1Swenshuai.xi ///Note: It need to be called before init. The default is JPD CMYK support.
9884*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SupportCMYK(MS_BOOL bEnable)9885*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_SupportCMYK(MS_BOOL bEnable)
9886*53ee8cc1Swenshuai.xi {
9887*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
9888*53ee8cc1Swenshuai.xi bEnableCMYK = bEnable;
9889*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
9890*53ee8cc1Swenshuai.xi #else
9891*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Not Support CMYK formant!!!\n");
9892*53ee8cc1Swenshuai.xi UNUSED(bEnable);
9893*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
9894*53ee8cc1Swenshuai.xi #endif
9895*53ee8cc1Swenshuai.xi }
9896*53ee8cc1Swenshuai.xi
9897*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
9898*53ee8cc1Swenshuai.xi /********************************************************************/
9899*53ee8cc1Swenshuai.xi ///Enable/Disable JPD RGB support.
9900*53ee8cc1Swenshuai.xi ///@param bEnable \b IN enable/disable supporting JPD RGB
9901*53ee8cc1Swenshuai.xi ///@return E_JPEG_OKAY/E_JPEG_FAILED
9902*53ee8cc1Swenshuai.xi ///Note: It need to be called before init. The default is JPD RGB support.
9903*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SupportRGB(MS_BOOL bEnable)9904*53ee8cc1Swenshuai.xi JPEG_Result _MApi_JPEG_SupportRGB(MS_BOOL bEnable)
9905*53ee8cc1Swenshuai.xi {
9906*53ee8cc1Swenshuai.xi #if SW_JPD_RGB_CMYK
9907*53ee8cc1Swenshuai.xi bEnableRGB = bEnable;
9908*53ee8cc1Swenshuai.xi return E_JPEG_OKAY;
9909*53ee8cc1Swenshuai.xi #else
9910*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("Not Support RGB formant!!!\n");
9911*53ee8cc1Swenshuai.xi UNUSED(bEnable);
9912*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
9913*53ee8cc1Swenshuai.xi #endif
9914*53ee8cc1Swenshuai.xi }
9915*53ee8cc1Swenshuai.xi
9916*53ee8cc1Swenshuai.xi
9917*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
_MApi_JPEG_IsMPOFormat(void)9918*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_IsMPOFormat( void )
9919*53ee8cc1Swenshuai.xi {
9920*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("MApi_JPEG_IsMPOFormat=%d\n", bIsMPOFormat);
9921*53ee8cc1Swenshuai.xi return bIsMPOFormat;
9922*53ee8cc1Swenshuai.xi }
9923*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO ** ppMPOIndex)9924*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO **ppMPOIndex)
9925*53ee8cc1Swenshuai.xi {
9926*53ee8cc1Swenshuai.xi if(_stMPOIndex.num_of_image == 0xFFFFFFFF)
9927*53ee8cc1Swenshuai.xi {
9928*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("No MPO Index\n");
9929*53ee8cc1Swenshuai.xi return FALSE;
9930*53ee8cc1Swenshuai.xi }
9931*53ee8cc1Swenshuai.xi
9932*53ee8cc1Swenshuai.xi *ppMPOIndex = &_stMPOIndex;
9933*53ee8cc1Swenshuai.xi return TRUE;
9934*53ee8cc1Swenshuai.xi }
9935*53ee8cc1Swenshuai.xi
_MApi_JPEG_GetMPOAttr(MS_U32 image_no,JPEG_MPO_ATTRIBUTE_INFO ** ppMPOAttr)9936*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_GetMPOAttr(MS_U32 image_no, JPEG_MPO_ATTRIBUTE_INFO **ppMPOAttr)
9937*53ee8cc1Swenshuai.xi {
9938*53ee8cc1Swenshuai.xi if((JPEG_MPO_MAX_SUPPORT_IMAGE < image_no)
9939*53ee8cc1Swenshuai.xi || (FALSE == _stMPOAttri[image_no - 1].used))
9940*53ee8cc1Swenshuai.xi {
9941*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("No MPO Attribute with image no. %ld\n", image_no);
9942*53ee8cc1Swenshuai.xi return FALSE;
9943*53ee8cc1Swenshuai.xi }
9944*53ee8cc1Swenshuai.xi
9945*53ee8cc1Swenshuai.xi *ppMPOAttr = &_stMPOAttri[image_no - 1];
9946*53ee8cc1Swenshuai.xi return TRUE;
9947*53ee8cc1Swenshuai.xi }
9948*53ee8cc1Swenshuai.xi
_MApi_JPEG_DumpMPO(void)9949*53ee8cc1Swenshuai.xi void _MApi_JPEG_DumpMPO(void)
9950*53ee8cc1Swenshuai.xi {
9951*53ee8cc1Swenshuai.xi MS_U32 i = 0;
9952*53ee8cc1Swenshuai.xi
9953*53ee8cc1Swenshuai.xi if(_stMPOIndex.num_of_image == 0xFFFFFFFF)
9954*53ee8cc1Swenshuai.xi {
9955*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("No MPO Index\n");
9956*53ee8cc1Swenshuai.xi return;
9957*53ee8cc1Swenshuai.xi }
9958*53ee8cc1Swenshuai.xi
9959*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("start_of_offset = %ld, num_of_image = %ld\n", _stMPOIndex.start_of_offset, _stMPOIndex.num_of_image);
9960*53ee8cc1Swenshuai.xi for(i = 0; i<JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
9961*53ee8cc1Swenshuai.xi {
9962*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mp_entry[%ld]:attribute = 0x%lx\n", i, _stMPOIndex.mp_entry[i].attribute);
9963*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mp_entry[%ld]:size = 0x%lx\n", i, _stMPOIndex.mp_entry[i].size);
9964*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mp_entry[%ld]:offset = 0x%lx\n", i, _stMPOIndex.mp_entry[i].offset);
9965*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mp_entry[%ld]:image1_no = 0x%x\n", i, _stMPOIndex.mp_entry[i].image1_no);
9966*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("mp_entry[%ld]:image2_no = 0x%x\n", i, _stMPOIndex.mp_entry[i].image2_no);
9967*53ee8cc1Swenshuai.xi
9968*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:MPIndividualNum = 0x%lx\n", i, _stMPOAttri[i].MPIndividualNum);
9969*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOrientation = 0x%lx\n", i, _stMPOAttri[i].PanOrientation);
9970*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_H.numerator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_H.numerator);
9971*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_H.denominator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_H.denominator);
9972*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_V.numerator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_V.numerator);
9973*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PanOverlap_V.denominator = 0x%lx\n", i, _stMPOAttri[i].PanOverlap_V.denominator);
9974*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:BaseViewpointNum = 0x%lx\n", i, _stMPOAttri[i].BaseViewpointNum);
9975*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:ConvergenceAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].ConvergenceAngle.s_numerator);
9976*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:ConvergenceAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].ConvergenceAngle.s_denominator);
9977*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:BaselineLength.numerator = 0x%lx\n", i, _stMPOAttri[i].BaselineLength.numerator);
9978*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:BaselineLength.denominator = 0x%lx\n", i, _stMPOAttri[i].BaselineLength.denominator);
9979*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:VerticalDivergence.s_numerator = 0x%lx\n", i, _stMPOAttri[i].VerticalDivergence.s_numerator);
9980*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:VerticalDivergence.s_denominator = 0x%lx\n", i, _stMPOAttri[i].VerticalDivergence.s_denominator);
9981*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_X.s_numerator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_X.s_numerator);
9982*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_X.s_denominator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_X.s_denominator);
9983*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Y.s_numerator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Y.s_numerator);
9984*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Y.s_denominator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Y.s_denominator);
9985*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Z.s_numerator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Z.s_numerator);
9986*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:AxisDistance_Z.s_denominator = 0x%lx\n", i, _stMPOAttri[i].AxisDistance_Z.s_denominator);
9987*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:YawAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].YawAngle.s_numerator);
9988*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:YawAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].YawAngle.s_denominator);
9989*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PitchAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].PitchAngle.s_numerator);
9990*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:PitchAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].PitchAngle.s_denominator);
9991*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:RollAngle.s_numerator = 0x%lx\n", i, _stMPOAttri[i].RollAngle.s_numerator);
9992*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:RollAngle.s_denominator = 0x%lx\n", i, _stMPOAttri[i].RollAngle.s_denominator);
9993*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("_stMPOAttri[%ld]:used = 0x%d\n", i, _stMPOAttri[i].used);
9994*53ee8cc1Swenshuai.xi }
9995*53ee8cc1Swenshuai.xi return;
9996*53ee8cc1Swenshuai.xi }
9997*53ee8cc1Swenshuai.xi
_MApi_JPEG_SetMPOBuffer(MS_U32 read_offset,MS_U32 output_start)9998*53ee8cc1Swenshuai.xi MS_BOOL _MApi_JPEG_SetMPOBuffer(MS_U32 read_offset, MS_U32 output_start)
9999*53ee8cc1Swenshuai.xi {
10000*53ee8cc1Swenshuai.xi read_offset = MS_PA2KSEG1((MS_U32)read_offset);// | AEON_NON_CACHE_MASK;
10001*53ee8cc1Swenshuai.xi output_start = MS_PA2KSEG1((MS_U32)output_start);// | AEON_NON_CACHE_MASK;
10002*53ee8cc1Swenshuai.xi
10003*53ee8cc1Swenshuai.xi if((read_offset < MRC_BUFFER_ADDR)
10004*53ee8cc1Swenshuai.xi || (read_offset > (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE)))
10005*53ee8cc1Swenshuai.xi {
10006*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_SetMPOBuffer, read_offset invalid\n");
10007*53ee8cc1Swenshuai.xi return FALSE;
10008*53ee8cc1Swenshuai.xi }
10009*53ee8cc1Swenshuai.xi
10010*53ee8cc1Swenshuai.xi if(read_offset > (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE/2))
10011*53ee8cc1Swenshuai.xi {
10012*53ee8cc1Swenshuai.xi mpo_load_data = FALSE;
10013*53ee8cc1Swenshuai.xi }
10014*53ee8cc1Swenshuai.xi
10015*53ee8cc1Swenshuai.xi if(output_start < MWC_BUFFER_ADDR)
10016*53ee8cc1Swenshuai.xi {
10017*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("JPEG_SetMPOBuffer, output_start invalid\n");
10018*53ee8cc1Swenshuai.xi return FALSE;
10019*53ee8cc1Swenshuai.xi }
10020*53ee8cc1Swenshuai.xi
10021*53ee8cc1Swenshuai.xi _pu8In_buf_MPO_ofs = (MS_U8*)read_offset;
10022*53ee8cc1Swenshuai.xi _u32In_buf_MPO_left = (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE) - read_offset;
10023*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("After MApi_JPEG_SetMPOBuffer(), _pu8In_buf_MPO_ofs=0x%lx, _u32In_buf_MPO_left=0x%lx=============\n", (MS_U32)_pu8In_buf_MPO_ofs, (MS_U32)_u32In_buf_MPO_left);
10024*53ee8cc1Swenshuai.xi MWC_BUFFER_ADDR = output_start;
10025*53ee8cc1Swenshuai.xi return TRUE;
10026*53ee8cc1Swenshuai.xi }
10027*53ee8cc1Swenshuai.xi
10028*53ee8cc1Swenshuai.xi /********************************************************************/
10029*53ee8cc1Swenshuai.xi /// Set Max decoding resolution for MPO
10030*53ee8cc1Swenshuai.xi ///@param -u16Width \b IN : indicate max decoding width
10031*53ee8cc1Swenshuai.xi ///@param -u16Height \b IN : indicate max decoding height
10032*53ee8cc1Swenshuai.xi ///@return None
10033*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)10034*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
10035*53ee8cc1Swenshuai.xi {
10036*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: Width = %d, Height = %d\n", __FUNCTION__, u16Width, u16Height);
10037*53ee8cc1Swenshuai.xi JPEG_MPO_MAX_WIDTH = u16Width;
10038*53ee8cc1Swenshuai.xi JPEG_MPO_MAX_HEIGHT = u16Height;
10039*53ee8cc1Swenshuai.xi return;
10040*53ee8cc1Swenshuai.xi }
10041*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
10042*53ee8cc1Swenshuai.xi /********************************************************************/
10043*53ee8cc1Swenshuai.xi /// Set Max decoding resolution of Progressive MPO
10044*53ee8cc1Swenshuai.xi ///@param -u16ProWidth \b IN : indicate max decoding width
10045*53ee8cc1Swenshuai.xi ///@param -u16ProHeight \b IN : indicate max decoding height
10046*53ee8cc1Swenshuai.xi ///@return None
10047*53ee8cc1Swenshuai.xi /********************************************************************/
_MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)10048*53ee8cc1Swenshuai.xi void _MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
10049*53ee8cc1Swenshuai.xi {
10050*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_MSG("%s: ProWidth = %d, ProHeight = %d\n", __FUNCTION__, u16ProWidth, u16ProHeight);
10051*53ee8cc1Swenshuai.xi JPEG_MPO_PRO_MAX_WIDTH = u16ProWidth;
10052*53ee8cc1Swenshuai.xi JPEG_MPO_PRO_MAX_HEIGHT = u16ProHeight;
10053*53ee8cc1Swenshuai.xi return;
10054*53ee8cc1Swenshuai.xi }
10055*53ee8cc1Swenshuai.xi
10056*53ee8cc1Swenshuai.xi #endif
10057*53ee8cc1Swenshuai.xi
msAPI_JPEG_get_APP0_info(MS_U8 * unit,MS_U16 * x,MS_U16 * y)10058*53ee8cc1Swenshuai.xi void msAPI_JPEG_get_APP0_info( MS_U8 *unit,MS_U16 *x, MS_U16 *y )
10059*53ee8cc1Swenshuai.xi {
10060*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10061*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10062*53ee8cc1Swenshuai.xi {
10063*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10064*53ee8cc1Swenshuai.xi return;
10065*53ee8cc1Swenshuai.xi }
10066*53ee8cc1Swenshuai.xi
10067*53ee8cc1Swenshuai.xi JPEG_GETAPP0INFO_PARAM App0Info;
10068*53ee8cc1Swenshuai.xi memset(&App0Info , 0 ,sizeof(JPEG_GETAPP0INFO_PARAM));
10069*53ee8cc1Swenshuai.xi App0Info.unit= unit;
10070*53ee8cc1Swenshuai.xi App0Info.x= x;
10071*53ee8cc1Swenshuai.xi App0Info.y= y;
10072*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_get_APP0_info\n");
10073*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_get_APP0_info, (void*)(&App0Info)) != UTOPIA_STATUS_SUCCESS)
10074*53ee8cc1Swenshuai.xi {
10075*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10076*53ee8cc1Swenshuai.xi }
10077*53ee8cc1Swenshuai.xi #else
10078*53ee8cc1Swenshuai.xi _msAPI_JPEG_get_APP0_info(unit, x, y );
10079*53ee8cc1Swenshuai.xi #endif
10080*53ee8cc1Swenshuai.xi }
10081*53ee8cc1Swenshuai.xi
MApi_JPEG_Init(JPEG_InitParam * pInitParam)10082*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_Init(JPEG_InitParam *pInitParam)
10083*53ee8cc1Swenshuai.xi {
10084*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10085*53ee8cc1Swenshuai.xi if (pInstantJPD == NULL)
10086*53ee8cc1Swenshuai.xi {
10087*53ee8cc1Swenshuai.xi if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) != UTOPIA_STATUS_SUCCESS)
10088*53ee8cc1Swenshuai.xi {
10089*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Open JPD fail\n");
10090*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10091*53ee8cc1Swenshuai.xi }
10092*53ee8cc1Swenshuai.xi }
10093*53ee8cc1Swenshuai.xi
10094*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10095*53ee8cc1Swenshuai.xi {
10096*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10097*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
10098*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10099*53ee8cc1Swenshuai.xi }
10100*53ee8cc1Swenshuai.xi
10101*53ee8cc1Swenshuai.xi JPEG_INIT_PARAM InitPara;
10102*53ee8cc1Swenshuai.xi memset(&InitPara , 0 ,sizeof(JPEG_INIT_PARAM));
10103*53ee8cc1Swenshuai.xi InitPara.pInitParam = pInitParam;
10104*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Init\n");
10105*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_Init, (void*)(&InitPara)) != UTOPIA_STATUS_SUCCESS)
10106*53ee8cc1Swenshuai.xi {
10107*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10108*53ee8cc1Swenshuai.xi InitPara.retVal= E_JPEG_FAILED;
10109*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
10110*53ee8cc1Swenshuai.xi pInstantJPD = NULL;
10111*53ee8cc1Swenshuai.xi }
10112*53ee8cc1Swenshuai.xi return InitPara.retVal;
10113*53ee8cc1Swenshuai.xi #else
10114*53ee8cc1Swenshuai.xi return _MApi_JPEG_Init(pInitParam);
10115*53ee8cc1Swenshuai.xi #endif
10116*53ee8cc1Swenshuai.xi }
10117*53ee8cc1Swenshuai.xi
MApi_JPEG_DecodeHdr(void)10118*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_DecodeHdr(void)
10119*53ee8cc1Swenshuai.xi {
10120*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10121*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10122*53ee8cc1Swenshuai.xi {
10123*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10124*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10125*53ee8cc1Swenshuai.xi }
10126*53ee8cc1Swenshuai.xi
10127*53ee8cc1Swenshuai.xi JPEG_RESULT_PARAM ResPara;
10128*53ee8cc1Swenshuai.xi memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
10129*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_DecodeHdr\n");
10130*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_DecodeHdr, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
10131*53ee8cc1Swenshuai.xi {
10132*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10133*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10134*53ee8cc1Swenshuai.xi }
10135*53ee8cc1Swenshuai.xi return ResPara.retVal;
10136*53ee8cc1Swenshuai.xi #else
10137*53ee8cc1Swenshuai.xi return _MApi_JPEG_DecodeHdr();
10138*53ee8cc1Swenshuai.xi #endif
10139*53ee8cc1Swenshuai.xi }
10140*53ee8cc1Swenshuai.xi
MApi_JPEG_Decode(void)10141*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_Decode(void)
10142*53ee8cc1Swenshuai.xi {
10143*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10144*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10145*53ee8cc1Swenshuai.xi {
10146*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10147*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10148*53ee8cc1Swenshuai.xi }
10149*53ee8cc1Swenshuai.xi
10150*53ee8cc1Swenshuai.xi JPEG_RESULT_PARAM ResPara;
10151*53ee8cc1Swenshuai.xi memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
10152*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Decode\n");
10153*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_Decode, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
10154*53ee8cc1Swenshuai.xi {
10155*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10156*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10157*53ee8cc1Swenshuai.xi }
10158*53ee8cc1Swenshuai.xi return ResPara.retVal;
10159*53ee8cc1Swenshuai.xi #else
10160*53ee8cc1Swenshuai.xi return _MApi_JPEG_Decode();
10161*53ee8cc1Swenshuai.xi #endif
10162*53ee8cc1Swenshuai.xi }
10163*53ee8cc1Swenshuai.xi
MApi_JPEG_Exit(void)10164*53ee8cc1Swenshuai.xi void MApi_JPEG_Exit(void)
10165*53ee8cc1Swenshuai.xi {
10166*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10167*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10168*53ee8cc1Swenshuai.xi {
10169*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10170*53ee8cc1Swenshuai.xi return;
10171*53ee8cc1Swenshuai.xi }
10172*53ee8cc1Swenshuai.xi
10173*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Exit\n");
10174*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_Exit, NULL) != UTOPIA_STATUS_SUCCESS)
10175*53ee8cc1Swenshuai.xi {
10176*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10177*53ee8cc1Swenshuai.xi }
10178*53ee8cc1Swenshuai.xi else
10179*53ee8cc1Swenshuai.xi {
10180*53ee8cc1Swenshuai.xi if(UtopiaClose(pInstantJPD) != UTOPIA_STATUS_SUCCESS)
10181*53ee8cc1Swenshuai.xi {
10182*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Utopia Close JPD failed\n");
10183*53ee8cc1Swenshuai.xi return;
10184*53ee8cc1Swenshuai.xi }
10185*53ee8cc1Swenshuai.xi pInstantJPD = NULL;
10186*53ee8cc1Swenshuai.xi }
10187*53ee8cc1Swenshuai.xi
10188*53ee8cc1Swenshuai.xi #else
10189*53ee8cc1Swenshuai.xi _MApi_JPEG_Exit();
10190*53ee8cc1Swenshuai.xi #endif
10191*53ee8cc1Swenshuai.xi }
10192*53ee8cc1Swenshuai.xi
MApi_JPEG_GetErrorCode(void)10193*53ee8cc1Swenshuai.xi JPEG_ErrCode MApi_JPEG_GetErrorCode(void)
10194*53ee8cc1Swenshuai.xi {
10195*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10196*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10197*53ee8cc1Swenshuai.xi {
10198*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10199*53ee8cc1Swenshuai.xi return E_JPEG_NOT_INIT;
10200*53ee8cc1Swenshuai.xi }
10201*53ee8cc1Swenshuai.xi
10202*53ee8cc1Swenshuai.xi JPEG_GETERRORCODE_PARAM GetErrorCode;
10203*53ee8cc1Swenshuai.xi memset(&GetErrorCode , 0 ,sizeof(JPEG_GETERRORCODE_PARAM));
10204*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetErrorCode\n");
10205*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetErrorCode, (void*)(&GetErrorCode)) != UTOPIA_STATUS_SUCCESS)
10206*53ee8cc1Swenshuai.xi {
10207*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10208*53ee8cc1Swenshuai.xi return E_JPEG_NOT_INIT;
10209*53ee8cc1Swenshuai.xi }
10210*53ee8cc1Swenshuai.xi return GetErrorCode.ErrCode;
10211*53ee8cc1Swenshuai.xi #else
10212*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetErrorCode();
10213*53ee8cc1Swenshuai.xi #endif
10214*53ee8cc1Swenshuai.xi }
10215*53ee8cc1Swenshuai.xi
MApi_JPEG_GetJPDEventFlag(void)10216*53ee8cc1Swenshuai.xi JPEG_Event MApi_JPEG_GetJPDEventFlag(void)
10217*53ee8cc1Swenshuai.xi {
10218*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10219*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10220*53ee8cc1Swenshuai.xi {
10221*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10222*53ee8cc1Swenshuai.xi return 0;
10223*53ee8cc1Swenshuai.xi }
10224*53ee8cc1Swenshuai.xi
10225*53ee8cc1Swenshuai.xi JPEG_JPEGEVENT_PARAM JpegEvent;
10226*53ee8cc1Swenshuai.xi memset(&JpegEvent , 0 ,sizeof(JPEG_JPEGEVENT_PARAM));
10227*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetJPDEventFlag\n");
10228*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetJPDEventFlag, (void*)(&JpegEvent)) != UTOPIA_STATUS_SUCCESS)
10229*53ee8cc1Swenshuai.xi {
10230*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10231*53ee8cc1Swenshuai.xi return 0;
10232*53ee8cc1Swenshuai.xi }
10233*53ee8cc1Swenshuai.xi return JpegEvent.eEvtVal;
10234*53ee8cc1Swenshuai.xi #else
10235*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetJPDEventFlag();
10236*53ee8cc1Swenshuai.xi #endif
10237*53ee8cc1Swenshuai.xi }
10238*53ee8cc1Swenshuai.xi
MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)10239*53ee8cc1Swenshuai.xi void MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)
10240*53ee8cc1Swenshuai.xi {
10241*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10242*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10243*53ee8cc1Swenshuai.xi {
10244*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10245*53ee8cc1Swenshuai.xi return;
10246*53ee8cc1Swenshuai.xi }
10247*53ee8cc1Swenshuai.xi
10248*53ee8cc1Swenshuai.xi JPEG_JPEGEVENT_PARAM JpegEvent;
10249*53ee8cc1Swenshuai.xi memset(&JpegEvent , 0 ,sizeof(JPEG_JPEGEVENT_PARAM));
10250*53ee8cc1Swenshuai.xi JpegEvent.eEvtVal = eEvtVal;
10251*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetJPDEventFlag\n");
10252*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetJPDEventFlag, (void*)(&JpegEvent)) != UTOPIA_STATUS_SUCCESS)
10253*53ee8cc1Swenshuai.xi {
10254*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10255*53ee8cc1Swenshuai.xi }
10256*53ee8cc1Swenshuai.xi #else
10257*53ee8cc1Swenshuai.xi _MApi_JPEG_SetJPDEventFlag(eEvtVal);
10258*53ee8cc1Swenshuai.xi #endif
10259*53ee8cc1Swenshuai.xi }
10260*53ee8cc1Swenshuai.xi
MApi_JPEG_Rst(void)10261*53ee8cc1Swenshuai.xi void MApi_JPEG_Rst(void)
10262*53ee8cc1Swenshuai.xi {
10263*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10264*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10265*53ee8cc1Swenshuai.xi {
10266*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10267*53ee8cc1Swenshuai.xi return;
10268*53ee8cc1Swenshuai.xi }
10269*53ee8cc1Swenshuai.xi
10270*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Rst\n");
10271*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_Rst, NULL) != UTOPIA_STATUS_SUCCESS)
10272*53ee8cc1Swenshuai.xi {
10273*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10274*53ee8cc1Swenshuai.xi }
10275*53ee8cc1Swenshuai.xi #else
10276*53ee8cc1Swenshuai.xi _MApi_JPEG_Rst();
10277*53ee8cc1Swenshuai.xi #endif
10278*53ee8cc1Swenshuai.xi }
10279*53ee8cc1Swenshuai.xi
MApi_JPEG_PowerOn(void)10280*53ee8cc1Swenshuai.xi void MApi_JPEG_PowerOn(void)
10281*53ee8cc1Swenshuai.xi {
10282*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10283*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10284*53ee8cc1Swenshuai.xi {
10285*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10286*53ee8cc1Swenshuai.xi return;
10287*53ee8cc1Swenshuai.xi }
10288*53ee8cc1Swenshuai.xi
10289*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_PowerOn\n");
10290*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_PowerOn, NULL) != UTOPIA_STATUS_SUCCESS)
10291*53ee8cc1Swenshuai.xi {
10292*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10293*53ee8cc1Swenshuai.xi }
10294*53ee8cc1Swenshuai.xi #else
10295*53ee8cc1Swenshuai.xi _MApi_JPEG_PowerOn();
10296*53ee8cc1Swenshuai.xi #endif
10297*53ee8cc1Swenshuai.xi }
10298*53ee8cc1Swenshuai.xi
MApi_JPEG_PowerOff(void)10299*53ee8cc1Swenshuai.xi void MApi_JPEG_PowerOff(void)
10300*53ee8cc1Swenshuai.xi {
10301*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10302*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10303*53ee8cc1Swenshuai.xi {
10304*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10305*53ee8cc1Swenshuai.xi return;
10306*53ee8cc1Swenshuai.xi }
10307*53ee8cc1Swenshuai.xi
10308*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_PowerOff\n");
10309*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_PowerOff, NULL) != UTOPIA_STATUS_SUCCESS)
10310*53ee8cc1Swenshuai.xi {
10311*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10312*53ee8cc1Swenshuai.xi }
10313*53ee8cc1Swenshuai.xi #else
10314*53ee8cc1Swenshuai.xi _MApi_JPEG_PowerOff();
10315*53ee8cc1Swenshuai.xi #endif
10316*53ee8cc1Swenshuai.xi }
10317*53ee8cc1Swenshuai.xi
MApi_JPEG_GetCurVidx(void)10318*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetCurVidx(void)
10319*53ee8cc1Swenshuai.xi {
10320*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10321*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10322*53ee8cc1Swenshuai.xi {
10323*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10324*53ee8cc1Swenshuai.xi return 0;
10325*53ee8cc1Swenshuai.xi }
10326*53ee8cc1Swenshuai.xi
10327*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10328*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10329*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetCurVidx\n");
10330*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetCurVidx, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10331*53ee8cc1Swenshuai.xi {
10332*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10333*53ee8cc1Swenshuai.xi return 0;
10334*53ee8cc1Swenshuai.xi }
10335*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10336*53ee8cc1Swenshuai.xi #else
10337*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetCurVidx();
10338*53ee8cc1Swenshuai.xi #endif
10339*53ee8cc1Swenshuai.xi }
10340*53ee8cc1Swenshuai.xi
MApi_JPEG_IsProgressive(void)10341*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_IsProgressive(void)
10342*53ee8cc1Swenshuai.xi {
10343*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10344*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10345*53ee8cc1Swenshuai.xi {
10346*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10347*53ee8cc1Swenshuai.xi return 0;
10348*53ee8cc1Swenshuai.xi }
10349*53ee8cc1Swenshuai.xi
10350*53ee8cc1Swenshuai.xi JPEG_BOOL_PARAM bPARA;
10351*53ee8cc1Swenshuai.xi memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
10352*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_IsProgressive\n");
10353*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_IsProgressive, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
10354*53ee8cc1Swenshuai.xi {
10355*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10356*53ee8cc1Swenshuai.xi return 0;
10357*53ee8cc1Swenshuai.xi }
10358*53ee8cc1Swenshuai.xi return bPARA.bValue;
10359*53ee8cc1Swenshuai.xi #else
10360*53ee8cc1Swenshuai.xi return _MApi_JPEG_IsProgressive();
10361*53ee8cc1Swenshuai.xi #endif
10362*53ee8cc1Swenshuai.xi }
10363*53ee8cc1Swenshuai.xi
MApi_JPEG_ThumbnailFound(void)10364*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_ThumbnailFound(void)
10365*53ee8cc1Swenshuai.xi {
10366*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10367*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10368*53ee8cc1Swenshuai.xi {
10369*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10370*53ee8cc1Swenshuai.xi return 0;
10371*53ee8cc1Swenshuai.xi }
10372*53ee8cc1Swenshuai.xi
10373*53ee8cc1Swenshuai.xi JPEG_BOOL_PARAM bPARA;
10374*53ee8cc1Swenshuai.xi memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
10375*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_ThumbnailFound\n");
10376*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_ThumbnailFound, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
10377*53ee8cc1Swenshuai.xi {
10378*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10379*53ee8cc1Swenshuai.xi return 0;
10380*53ee8cc1Swenshuai.xi }
10381*53ee8cc1Swenshuai.xi return bPARA.bValue;
10382*53ee8cc1Swenshuai.xi #else
10383*53ee8cc1Swenshuai.xi return _MApi_JPEG_ThumbnailFound();
10384*53ee8cc1Swenshuai.xi #endif
10385*53ee8cc1Swenshuai.xi }
10386*53ee8cc1Swenshuai.xi
MApi_JPEG_GetWidth(void)10387*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetWidth(void)
10388*53ee8cc1Swenshuai.xi {
10389*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10390*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10391*53ee8cc1Swenshuai.xi {
10392*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10393*53ee8cc1Swenshuai.xi return 0;
10394*53ee8cc1Swenshuai.xi }
10395*53ee8cc1Swenshuai.xi
10396*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10397*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10398*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetWidth\n");
10399*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10400*53ee8cc1Swenshuai.xi {
10401*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10402*53ee8cc1Swenshuai.xi return 0;
10403*53ee8cc1Swenshuai.xi }
10404*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10405*53ee8cc1Swenshuai.xi #else
10406*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetWidth();
10407*53ee8cc1Swenshuai.xi #endif
10408*53ee8cc1Swenshuai.xi }
10409*53ee8cc1Swenshuai.xi
MApi_JPEG_GetHeight(void)10410*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetHeight(void)
10411*53ee8cc1Swenshuai.xi {
10412*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10413*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10414*53ee8cc1Swenshuai.xi {
10415*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10416*53ee8cc1Swenshuai.xi return 0;
10417*53ee8cc1Swenshuai.xi }
10418*53ee8cc1Swenshuai.xi
10419*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10420*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10421*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetHeight\n");
10422*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10423*53ee8cc1Swenshuai.xi {
10424*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10425*53ee8cc1Swenshuai.xi return 0;
10426*53ee8cc1Swenshuai.xi }
10427*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10428*53ee8cc1Swenshuai.xi #else
10429*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetHeight();
10430*53ee8cc1Swenshuai.xi #endif
10431*53ee8cc1Swenshuai.xi }
10432*53ee8cc1Swenshuai.xi
MApi_JPEG_GetOriginalWidth(void)10433*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetOriginalWidth(void)
10434*53ee8cc1Swenshuai.xi {
10435*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10436*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10437*53ee8cc1Swenshuai.xi {
10438*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10439*53ee8cc1Swenshuai.xi return 0;
10440*53ee8cc1Swenshuai.xi }
10441*53ee8cc1Swenshuai.xi
10442*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10443*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10444*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetOriginalWidth\n");
10445*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetOriginalWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10446*53ee8cc1Swenshuai.xi {
10447*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10448*53ee8cc1Swenshuai.xi return 0;
10449*53ee8cc1Swenshuai.xi }
10450*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10451*53ee8cc1Swenshuai.xi #else
10452*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetOriginalWidth();
10453*53ee8cc1Swenshuai.xi #endif
10454*53ee8cc1Swenshuai.xi }
10455*53ee8cc1Swenshuai.xi
MApi_JPEG_GetOriginalHeight(void)10456*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetOriginalHeight(void)
10457*53ee8cc1Swenshuai.xi {
10458*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10459*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10460*53ee8cc1Swenshuai.xi {
10461*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10462*53ee8cc1Swenshuai.xi return 0;
10463*53ee8cc1Swenshuai.xi }
10464*53ee8cc1Swenshuai.xi
10465*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10466*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10467*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetOriginalHeight\n");
10468*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetOriginalHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10469*53ee8cc1Swenshuai.xi {
10470*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10471*53ee8cc1Swenshuai.xi return 0;
10472*53ee8cc1Swenshuai.xi }
10473*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10474*53ee8cc1Swenshuai.xi #else
10475*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetOriginalHeight();
10476*53ee8cc1Swenshuai.xi #endif
10477*53ee8cc1Swenshuai.xi }
10478*53ee8cc1Swenshuai.xi
MApi_JPEG_GetNonAlignmentWidth(void)10479*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetNonAlignmentWidth(void)
10480*53ee8cc1Swenshuai.xi {
10481*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10482*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10483*53ee8cc1Swenshuai.xi {
10484*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10485*53ee8cc1Swenshuai.xi return 0;
10486*53ee8cc1Swenshuai.xi }
10487*53ee8cc1Swenshuai.xi
10488*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10489*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10490*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetNonAlignmentWidth\n");
10491*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetNonAlignmentWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10492*53ee8cc1Swenshuai.xi {
10493*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10494*53ee8cc1Swenshuai.xi return 0;
10495*53ee8cc1Swenshuai.xi }
10496*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10497*53ee8cc1Swenshuai.xi #else
10498*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetNonAlignmentWidth();
10499*53ee8cc1Swenshuai.xi #endif
10500*53ee8cc1Swenshuai.xi }
10501*53ee8cc1Swenshuai.xi
MApi_JPEG_GetNonAlignmentHeight(void)10502*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetNonAlignmentHeight(void)
10503*53ee8cc1Swenshuai.xi {
10504*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10505*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10506*53ee8cc1Swenshuai.xi {
10507*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10508*53ee8cc1Swenshuai.xi return 0;
10509*53ee8cc1Swenshuai.xi }
10510*53ee8cc1Swenshuai.xi
10511*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10512*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10513*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetNonAlignmentHeight\n");
10514*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetNonAlignmentHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10515*53ee8cc1Swenshuai.xi {
10516*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10517*53ee8cc1Swenshuai.xi return 0;
10518*53ee8cc1Swenshuai.xi }
10519*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10520*53ee8cc1Swenshuai.xi #else
10521*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetWidth();
10522*53ee8cc1Swenshuai.xi #endif
10523*53ee8cc1Swenshuai.xi }
10524*53ee8cc1Swenshuai.xi
MApi_JPEG_GetAlignedPitch(void)10525*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedPitch(void)
10526*53ee8cc1Swenshuai.xi {
10527*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10528*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10529*53ee8cc1Swenshuai.xi {
10530*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10531*53ee8cc1Swenshuai.xi return 0;
10532*53ee8cc1Swenshuai.xi }
10533*53ee8cc1Swenshuai.xi
10534*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10535*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10536*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedPitch\n");
10537*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetAlignedPitch, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10538*53ee8cc1Swenshuai.xi {
10539*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10540*53ee8cc1Swenshuai.xi return 0;
10541*53ee8cc1Swenshuai.xi }
10542*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10543*53ee8cc1Swenshuai.xi #else
10544*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetAlignedPitch();
10545*53ee8cc1Swenshuai.xi #endif
10546*53ee8cc1Swenshuai.xi }
10547*53ee8cc1Swenshuai.xi
MApi_JPEG_GetAlignedPitch_H(void)10548*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedPitch_H(void)
10549*53ee8cc1Swenshuai.xi {
10550*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10551*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10552*53ee8cc1Swenshuai.xi {
10553*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10554*53ee8cc1Swenshuai.xi return 0;
10555*53ee8cc1Swenshuai.xi }
10556*53ee8cc1Swenshuai.xi
10557*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10558*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10559*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedPitch_H\n");
10560*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetAlignedPitch_H, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10561*53ee8cc1Swenshuai.xi {
10562*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10563*53ee8cc1Swenshuai.xi return 0;
10564*53ee8cc1Swenshuai.xi }
10565*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10566*53ee8cc1Swenshuai.xi #else
10567*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetAlignedPitch_H();
10568*53ee8cc1Swenshuai.xi #endif
10569*53ee8cc1Swenshuai.xi }
10570*53ee8cc1Swenshuai.xi
MApi_JPEG_GetAlignedWidth(void)10571*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedWidth(void)
10572*53ee8cc1Swenshuai.xi {
10573*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10574*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10575*53ee8cc1Swenshuai.xi {
10576*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10577*53ee8cc1Swenshuai.xi return 0;
10578*53ee8cc1Swenshuai.xi }
10579*53ee8cc1Swenshuai.xi
10580*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10581*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10582*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedWidth\n");
10583*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetAlignedWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10584*53ee8cc1Swenshuai.xi {
10585*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10586*53ee8cc1Swenshuai.xi return 0;
10587*53ee8cc1Swenshuai.xi }
10588*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10589*53ee8cc1Swenshuai.xi #else
10590*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetAlignedWidth();
10591*53ee8cc1Swenshuai.xi #endif
10592*53ee8cc1Swenshuai.xi }
10593*53ee8cc1Swenshuai.xi
MApi_JPEG_GetAlignedHeight(void)10594*53ee8cc1Swenshuai.xi MS_U16 MApi_JPEG_GetAlignedHeight(void)
10595*53ee8cc1Swenshuai.xi {
10596*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10597*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10598*53ee8cc1Swenshuai.xi {
10599*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10600*53ee8cc1Swenshuai.xi return 0;
10601*53ee8cc1Swenshuai.xi }
10602*53ee8cc1Swenshuai.xi
10603*53ee8cc1Swenshuai.xi JPEG_U16_PARAM U16PARA;
10604*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
10605*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedHeight\n");
10606*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetAlignedHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
10607*53ee8cc1Swenshuai.xi {
10608*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10609*53ee8cc1Swenshuai.xi return 0;
10610*53ee8cc1Swenshuai.xi }
10611*53ee8cc1Swenshuai.xi return U16PARA.u16Value;
10612*53ee8cc1Swenshuai.xi #else
10613*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetAlignedHeight();
10614*53ee8cc1Swenshuai.xi #endif
10615*53ee8cc1Swenshuai.xi }
10616*53ee8cc1Swenshuai.xi
MApi_JPEG_GetScaleDownFactor(void)10617*53ee8cc1Swenshuai.xi MS_U8 MApi_JPEG_GetScaleDownFactor(void)
10618*53ee8cc1Swenshuai.xi {
10619*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10620*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10621*53ee8cc1Swenshuai.xi {
10622*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10623*53ee8cc1Swenshuai.xi return 0;
10624*53ee8cc1Swenshuai.xi }
10625*53ee8cc1Swenshuai.xi
10626*53ee8cc1Swenshuai.xi JPEG_U8_PARAM U8PARA;
10627*53ee8cc1Swenshuai.xi memset(&U8PARA , 0 ,sizeof(JPEG_U8_PARAM));
10628*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetScaleDownFactor\n");
10629*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetScaleDownFactor, (void*)(&U8PARA)) != UTOPIA_STATUS_SUCCESS)
10630*53ee8cc1Swenshuai.xi {
10631*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10632*53ee8cc1Swenshuai.xi return 0;
10633*53ee8cc1Swenshuai.xi }
10634*53ee8cc1Swenshuai.xi return U8PARA.u8Value;
10635*53ee8cc1Swenshuai.xi #else
10636*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetScaleDownFactor();
10637*53ee8cc1Swenshuai.xi #endif
10638*53ee8cc1Swenshuai.xi }
10639*53ee8cc1Swenshuai.xi
MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)10640*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
10641*53ee8cc1Swenshuai.xi {
10642*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10643*53ee8cc1Swenshuai.xi if (pInstantJPD == NULL)
10644*53ee8cc1Swenshuai.xi {
10645*53ee8cc1Swenshuai.xi if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) != UTOPIA_STATUS_SUCCESS)
10646*53ee8cc1Swenshuai.xi {
10647*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Open JPD fail\n");
10648*53ee8cc1Swenshuai.xi return;
10649*53ee8cc1Swenshuai.xi }
10650*53ee8cc1Swenshuai.xi }
10651*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10652*53ee8cc1Swenshuai.xi {
10653*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10654*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
10655*53ee8cc1Swenshuai.xi return;
10656*53ee8cc1Swenshuai.xi }
10657*53ee8cc1Swenshuai.xi
10658*53ee8cc1Swenshuai.xi JPEG_RESOLUTION_PARAM Resol;
10659*53ee8cc1Swenshuai.xi memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
10660*53ee8cc1Swenshuai.xi Resol.u16Width= u16Width;
10661*53ee8cc1Swenshuai.xi Resol.u16Height= u16Height;
10662*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMaxDecodeResolution\n");
10663*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
10664*53ee8cc1Swenshuai.xi {
10665*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10666*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
10667*53ee8cc1Swenshuai.xi pInstantJPD = NULL;
10668*53ee8cc1Swenshuai.xi }
10669*53ee8cc1Swenshuai.xi #else
10670*53ee8cc1Swenshuai.xi _MApi_JPEG_SetMaxDecodeResolution(u16Width, u16Height);
10671*53ee8cc1Swenshuai.xi #endif
10672*53ee8cc1Swenshuai.xi }
10673*53ee8cc1Swenshuai.xi
MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)10674*53ee8cc1Swenshuai.xi void MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
10675*53ee8cc1Swenshuai.xi {
10676*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10677*53ee8cc1Swenshuai.xi if (pInstantJPD == NULL)
10678*53ee8cc1Swenshuai.xi {
10679*53ee8cc1Swenshuai.xi if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) != UTOPIA_STATUS_SUCCESS)
10680*53ee8cc1Swenshuai.xi {
10681*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Open JPD fail\n");
10682*53ee8cc1Swenshuai.xi return;
10683*53ee8cc1Swenshuai.xi }
10684*53ee8cc1Swenshuai.xi }
10685*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10686*53ee8cc1Swenshuai.xi {
10687*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10688*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
10689*53ee8cc1Swenshuai.xi return;
10690*53ee8cc1Swenshuai.xi }
10691*53ee8cc1Swenshuai.xi
10692*53ee8cc1Swenshuai.xi JPEG_RESOLUTION_PARAM Resol;
10693*53ee8cc1Swenshuai.xi memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
10694*53ee8cc1Swenshuai.xi Resol.u16Width= u16ProWidth;
10695*53ee8cc1Swenshuai.xi Resol.u16Height= u16ProHeight;
10696*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetProMaxDecodeResolution\n");
10697*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetProMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
10698*53ee8cc1Swenshuai.xi {
10699*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10700*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
10701*53ee8cc1Swenshuai.xi pInstantJPD = NULL;
10702*53ee8cc1Swenshuai.xi }
10703*53ee8cc1Swenshuai.xi #else
10704*53ee8cc1Swenshuai.xi _MApi_JPEG_SetProMaxDecodeResolution(u16ProWidth, u16ProHeight);
10705*53ee8cc1Swenshuai.xi #endif
10706*53ee8cc1Swenshuai.xi }
10707*53ee8cc1Swenshuai.xi
MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)10708*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)
10709*53ee8cc1Swenshuai.xi {
10710*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10711*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10712*53ee8cc1Swenshuai.xi {
10713*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10714*53ee8cc1Swenshuai.xi return;
10715*53ee8cc1Swenshuai.xi }
10716*53ee8cc1Swenshuai.xi
10717*53ee8cc1Swenshuai.xi JPEG_SETMBUFFERVALID_PARAM MBuffValid;
10718*53ee8cc1Swenshuai.xi memset(&MBuffValid , 0 ,sizeof(JPEG_SETMBUFFERVALID_PARAM));
10719*53ee8cc1Swenshuai.xi MBuffValid.u8MRBuffType = u8MRBuffType;
10720*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMRBufferValid\n");
10721*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMRBufferValid, (void*)(&MBuffValid)) != UTOPIA_STATUS_SUCCESS)
10722*53ee8cc1Swenshuai.xi {
10723*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10724*53ee8cc1Swenshuai.xi }
10725*53ee8cc1Swenshuai.xi #else
10726*53ee8cc1Swenshuai.xi _MApi_JPEG_SetMRBufferValid(u8MRBuffType);
10727*53ee8cc1Swenshuai.xi #endif
10728*53ee8cc1Swenshuai.xi }
10729*53ee8cc1Swenshuai.xi
MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead,MS_BOOL bEOFflag)10730*53ee8cc1Swenshuai.xi void MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead, MS_BOOL bEOFflag)
10731*53ee8cc1Swenshuai.xi {
10732*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10733*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10734*53ee8cc1Swenshuai.xi {
10735*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10736*53ee8cc1Swenshuai.xi return;
10737*53ee8cc1Swenshuai.xi }
10738*53ee8cc1Swenshuai.xi
10739*53ee8cc1Swenshuai.xi JPEG_UPDATEREADINFO_PARAM ReadInfo;
10740*53ee8cc1Swenshuai.xi memset(&ReadInfo , 0 ,sizeof(JPEG_UPDATEREADINFO_PARAM));
10741*53ee8cc1Swenshuai.xi ReadInfo.u32DataRead = u32DataRead;
10742*53ee8cc1Swenshuai.xi ReadInfo.bEOFflag = bEOFflag;
10743*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_UpdateReadInfo\n");
10744*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_UpdateReadInfo, (void*)(&ReadInfo)) != UTOPIA_STATUS_SUCCESS)
10745*53ee8cc1Swenshuai.xi {
10746*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10747*53ee8cc1Swenshuai.xi }
10748*53ee8cc1Swenshuai.xi #else
10749*53ee8cc1Swenshuai.xi _MApi_JPEG_UpdateReadInfo(u32DataRead, bEOFflag);
10750*53ee8cc1Swenshuai.xi #endif
10751*53ee8cc1Swenshuai.xi }
10752*53ee8cc1Swenshuai.xi
MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)10753*53ee8cc1Swenshuai.xi void MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)
10754*53ee8cc1Swenshuai.xi {
10755*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10756*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10757*53ee8cc1Swenshuai.xi {
10758*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10759*53ee8cc1Swenshuai.xi return;
10760*53ee8cc1Swenshuai.xi }
10761*53ee8cc1Swenshuai.xi
10762*53ee8cc1Swenshuai.xi JPEG_PROCESSEOF_PARAM EofPara;
10763*53ee8cc1Swenshuai.xi memset(&EofPara , 0 ,sizeof(JPEG_PROCESSEOF_PARAM));
10764*53ee8cc1Swenshuai.xi EofPara.u8MRBuffType = u8MRBuffType;
10765*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_ProcessEOF\n");
10766*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_ProcessEOF, (void*)(&EofPara)) != UTOPIA_STATUS_SUCCESS)
10767*53ee8cc1Swenshuai.xi {
10768*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10769*53ee8cc1Swenshuai.xi }
10770*53ee8cc1Swenshuai.xi #else
10771*53ee8cc1Swenshuai.xi _MApi_JPEG_ProcessEOF(u8MRBuffType);
10772*53ee8cc1Swenshuai.xi #endif
10773*53ee8cc1Swenshuai.xi }
10774*53ee8cc1Swenshuai.xi
MApi_JPEG_SetErrCode(JPEG_ErrCode ErrStatus)10775*53ee8cc1Swenshuai.xi void MApi_JPEG_SetErrCode(JPEG_ErrCode ErrStatus)
10776*53ee8cc1Swenshuai.xi {
10777*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10778*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10779*53ee8cc1Swenshuai.xi {
10780*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10781*53ee8cc1Swenshuai.xi return;
10782*53ee8cc1Swenshuai.xi }
10783*53ee8cc1Swenshuai.xi
10784*53ee8cc1Swenshuai.xi JPEG_SETERRORCODE_PARAM ErrCode;
10785*53ee8cc1Swenshuai.xi memset(&ErrCode , 0 ,sizeof(JPEG_SETERRORCODE_PARAM));
10786*53ee8cc1Swenshuai.xi ErrCode.ErrStatus = ErrStatus;
10787*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetErrCode\n");
10788*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetErrCode, (void*)(&ErrCode)) != UTOPIA_STATUS_SUCCESS)
10789*53ee8cc1Swenshuai.xi {
10790*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10791*53ee8cc1Swenshuai.xi }
10792*53ee8cc1Swenshuai.xi #else
10793*53ee8cc1Swenshuai.xi _MApi_JPEG_SetErrCode(ErrStatus);
10794*53ee8cc1Swenshuai.xi #endif
10795*53ee8cc1Swenshuai.xi }
10796*53ee8cc1Swenshuai.xi
MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)10797*53ee8cc1Swenshuai.xi void MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)
10798*53ee8cc1Swenshuai.xi {
10799*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10800*53ee8cc1Swenshuai.xi if (pInstantJPD == NULL)
10801*53ee8cc1Swenshuai.xi {
10802*53ee8cc1Swenshuai.xi if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) != UTOPIA_STATUS_SUCCESS)
10803*53ee8cc1Swenshuai.xi {
10804*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Open JPD fail\n");
10805*53ee8cc1Swenshuai.xi return;
10806*53ee8cc1Swenshuai.xi }
10807*53ee8cc1Swenshuai.xi }
10808*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10809*53ee8cc1Swenshuai.xi {
10810*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10811*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
10812*53ee8cc1Swenshuai.xi return;
10813*53ee8cc1Swenshuai.xi }
10814*53ee8cc1Swenshuai.xi
10815*53ee8cc1Swenshuai.xi JPEG_U8_PARAM U8PARA;
10816*53ee8cc1Swenshuai.xi memset(&U8PARA , 0 ,sizeof(JPEG_U8_PARAM));
10817*53ee8cc1Swenshuai.xi U8PARA.u8Value = u8DbgLevel;
10818*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetDbgLevel\n");
10819*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetDbgLevel, (void*)(&U8PARA)) != UTOPIA_STATUS_SUCCESS)
10820*53ee8cc1Swenshuai.xi {
10821*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10822*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
10823*53ee8cc1Swenshuai.xi pInstantJPD = NULL;
10824*53ee8cc1Swenshuai.xi }
10825*53ee8cc1Swenshuai.xi #else
10826*53ee8cc1Swenshuai.xi _MApi_JPEG_SetDbgLevel(u8DbgLevel);
10827*53ee8cc1Swenshuai.xi #endif
10828*53ee8cc1Swenshuai.xi }
10829*53ee8cc1Swenshuai.xi
MApi_JPEG_GetDbgLevel(void)10830*53ee8cc1Swenshuai.xi MS_U8 MApi_JPEG_GetDbgLevel(void)
10831*53ee8cc1Swenshuai.xi {
10832*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10833*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10834*53ee8cc1Swenshuai.xi {
10835*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10836*53ee8cc1Swenshuai.xi return 0;
10837*53ee8cc1Swenshuai.xi }
10838*53ee8cc1Swenshuai.xi
10839*53ee8cc1Swenshuai.xi JPEG_U8_PARAM U8PARA;
10840*53ee8cc1Swenshuai.xi memset(&U8PARA , 0 ,sizeof(JPEG_U8_PARAM));
10841*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetDbgLevel\n");
10842*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetDbgLevel, (void*)(&U8PARA)) != UTOPIA_STATUS_SUCCESS)
10843*53ee8cc1Swenshuai.xi {
10844*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10845*53ee8cc1Swenshuai.xi }
10846*53ee8cc1Swenshuai.xi return U8PARA.u8Value;
10847*53ee8cc1Swenshuai.xi #else
10848*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetDbgLevel();
10849*53ee8cc1Swenshuai.xi #endif
10850*53ee8cc1Swenshuai.xi }
10851*53ee8cc1Swenshuai.xi
MApi_JPEG_GetInfo(JPEG_Info * pJPEG_Info)10852*53ee8cc1Swenshuai.xi void MApi_JPEG_GetInfo(JPEG_Info *pJPEG_Info)
10853*53ee8cc1Swenshuai.xi {
10854*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10855*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10856*53ee8cc1Swenshuai.xi {
10857*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10858*53ee8cc1Swenshuai.xi return;
10859*53ee8cc1Swenshuai.xi }
10860*53ee8cc1Swenshuai.xi
10861*53ee8cc1Swenshuai.xi JPEG_GETINFO_PARAM eGETINFO;
10862*53ee8cc1Swenshuai.xi memset(&eGETINFO , 0 ,sizeof(JPEG_GETINFO_PARAM));
10863*53ee8cc1Swenshuai.xi eGETINFO.pJPEG_Info = pJPEG_Info;
10864*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetInfo\n");
10865*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetInfo, (void*)(&eGETINFO)) != UTOPIA_STATUS_SUCCESS)
10866*53ee8cc1Swenshuai.xi {
10867*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10868*53ee8cc1Swenshuai.xi }
10869*53ee8cc1Swenshuai.xi #else
10870*53ee8cc1Swenshuai.xi _MApi_JPEG_GetInfo(pJPEG_Info);
10871*53ee8cc1Swenshuai.xi #endif
10872*53ee8cc1Swenshuai.xi }
10873*53ee8cc1Swenshuai.xi
MApi_JPEG_GetStatus(JPEG_Status * pJPEG_Status)10874*53ee8cc1Swenshuai.xi void MApi_JPEG_GetStatus(JPEG_Status *pJPEG_Status)
10875*53ee8cc1Swenshuai.xi {
10876*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10877*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10878*53ee8cc1Swenshuai.xi {
10879*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10880*53ee8cc1Swenshuai.xi return;
10881*53ee8cc1Swenshuai.xi }
10882*53ee8cc1Swenshuai.xi
10883*53ee8cc1Swenshuai.xi JPEG_GETSTATUS_PARAM eGETSTATUS;
10884*53ee8cc1Swenshuai.xi memset(&eGETSTATUS , 0 ,sizeof(JPEG_GETSTATUS_PARAM));
10885*53ee8cc1Swenshuai.xi eGETSTATUS.pJPEG_Status = pJPEG_Status;
10886*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetStatus\n");
10887*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetStatus, (void*)(&eGETSTATUS)) != UTOPIA_STATUS_SUCCESS)
10888*53ee8cc1Swenshuai.xi {
10889*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10890*53ee8cc1Swenshuai.xi }
10891*53ee8cc1Swenshuai.xi #else
10892*53ee8cc1Swenshuai.xi _MApi_JPEG_GetStatus(pJPEG_Status);
10893*53ee8cc1Swenshuai.xi #endif
10894*53ee8cc1Swenshuai.xi }
10895*53ee8cc1Swenshuai.xi
MApi_JPEG_GetLibVer(const MSIF_Version ** ppVersion)10896*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetLibVer(const MSIF_Version **ppVersion)
10897*53ee8cc1Swenshuai.xi {
10898*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10899*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10900*53ee8cc1Swenshuai.xi {
10901*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10902*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10903*53ee8cc1Swenshuai.xi }
10904*53ee8cc1Swenshuai.xi
10905*53ee8cc1Swenshuai.xi JPEG_GETLIBVER_PARAM eLIBVER;
10906*53ee8cc1Swenshuai.xi memset(&eLIBVER , 0 ,sizeof(JPEG_GETLIBVER_PARAM));
10907*53ee8cc1Swenshuai.xi eLIBVER.ppVersion = ppVersion;
10908*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetLibVer\n");
10909*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetLibVer, (void*)(&eLIBVER)) != UTOPIA_STATUS_SUCCESS)
10910*53ee8cc1Swenshuai.xi {
10911*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10912*53ee8cc1Swenshuai.xi }
10913*53ee8cc1Swenshuai.xi return eLIBVER.retVal;
10914*53ee8cc1Swenshuai.xi #else
10915*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetLibVer(ppVersion);
10916*53ee8cc1Swenshuai.xi #endif
10917*53ee8cc1Swenshuai.xi }
10918*53ee8cc1Swenshuai.xi
MApi_JPEG_HdlVidxChk(void)10919*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_HdlVidxChk(void)
10920*53ee8cc1Swenshuai.xi {
10921*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10922*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10923*53ee8cc1Swenshuai.xi {
10924*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10925*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10926*53ee8cc1Swenshuai.xi }
10927*53ee8cc1Swenshuai.xi
10928*53ee8cc1Swenshuai.xi JPEG_RESULT_PARAM ResPara;
10929*53ee8cc1Swenshuai.xi memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
10930*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_HdlVidxChk\n");
10931*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_HdlVidxChk, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
10932*53ee8cc1Swenshuai.xi {
10933*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10934*53ee8cc1Swenshuai.xi }
10935*53ee8cc1Swenshuai.xi return ResPara.retVal;
10936*53ee8cc1Swenshuai.xi #else
10937*53ee8cc1Swenshuai.xi return _MApi_JPEG_HdlVidxChk();
10938*53ee8cc1Swenshuai.xi #endif
10939*53ee8cc1Swenshuai.xi }
10940*53ee8cc1Swenshuai.xi
MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType * pBuffLoadType)10941*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType *pBuffLoadType)
10942*53ee8cc1Swenshuai.xi {
10943*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10944*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10945*53ee8cc1Swenshuai.xi {
10946*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10947*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10948*53ee8cc1Swenshuai.xi }
10949*53ee8cc1Swenshuai.xi
10950*53ee8cc1Swenshuai.xi JPEG_GETBUFFLOADTYPE_PARAM eBufferLoad;
10951*53ee8cc1Swenshuai.xi memset(&eBufferLoad , 0 ,sizeof(JPEG_GETBUFFLOADTYPE_PARAM));
10952*53ee8cc1Swenshuai.xi eBufferLoad.pBuffLoadType = pBuffLoadType;
10953*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetBuffLoadType\n");
10954*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetBuffLoadType, (void*)(&eBufferLoad)) != UTOPIA_STATUS_SUCCESS)
10955*53ee8cc1Swenshuai.xi {
10956*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10957*53ee8cc1Swenshuai.xi }
10958*53ee8cc1Swenshuai.xi return eBufferLoad.retVal;
10959*53ee8cc1Swenshuai.xi #else
10960*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetBuffLoadType(pBuffLoadType);
10961*53ee8cc1Swenshuai.xi #endif
10962*53ee8cc1Swenshuai.xi }
10963*53ee8cc1Swenshuai.xi
MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)10964*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)
10965*53ee8cc1Swenshuai.xi {
10966*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10967*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10968*53ee8cc1Swenshuai.xi {
10969*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10970*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10971*53ee8cc1Swenshuai.xi }
10972*53ee8cc1Swenshuai.xi
10973*53ee8cc1Swenshuai.xi JPEG_ENABLEISR_PARAM eISR;
10974*53ee8cc1Swenshuai.xi memset(&eISR , 0 ,sizeof(JPEG_ENABLEISR_PARAM));
10975*53ee8cc1Swenshuai.xi eISR.IsrCb = IsrCb;
10976*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_EnableISR\n");
10977*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_EnableISR, (void*)(&eISR)) != UTOPIA_STATUS_SUCCESS)
10978*53ee8cc1Swenshuai.xi {
10979*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10980*53ee8cc1Swenshuai.xi }
10981*53ee8cc1Swenshuai.xi return eISR.retVal;
10982*53ee8cc1Swenshuai.xi #else
10983*53ee8cc1Swenshuai.xi return _MApi_JPEG_EnableISR(IsrCb);
10984*53ee8cc1Swenshuai.xi #endif
10985*53ee8cc1Swenshuai.xi }
10986*53ee8cc1Swenshuai.xi
MApi_JPEG_DisableISR(void)10987*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_DisableISR(void)
10988*53ee8cc1Swenshuai.xi {
10989*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
10990*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
10991*53ee8cc1Swenshuai.xi {
10992*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10993*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
10994*53ee8cc1Swenshuai.xi }
10995*53ee8cc1Swenshuai.xi
10996*53ee8cc1Swenshuai.xi JPEG_RESULT_PARAM ResPara;
10997*53ee8cc1Swenshuai.xi memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
10998*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_DisableISR\n");
10999*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_DisableISR, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
11000*53ee8cc1Swenshuai.xi {
11001*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11002*53ee8cc1Swenshuai.xi }
11003*53ee8cc1Swenshuai.xi return ResPara.retVal;
11004*53ee8cc1Swenshuai.xi #else
11005*53ee8cc1Swenshuai.xi return _MApi_JPEG_DisableISR();
11006*53ee8cc1Swenshuai.xi #endif
11007*53ee8cc1Swenshuai.xi }
11008*53ee8cc1Swenshuai.xi
MApi_JPEG_WaitDone(void)11009*53ee8cc1Swenshuai.xi JPEG_DecodeStatus MApi_JPEG_WaitDone(void)
11010*53ee8cc1Swenshuai.xi {
11011*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11012*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11013*53ee8cc1Swenshuai.xi {
11014*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11015*53ee8cc1Swenshuai.xi return E_JPEG_DEC_DECODING;
11016*53ee8cc1Swenshuai.xi }
11017*53ee8cc1Swenshuai.xi
11018*53ee8cc1Swenshuai.xi JPEG_WAITDONE_PARAM eWaitDone;
11019*53ee8cc1Swenshuai.xi memset(&eWaitDone , 0 ,sizeof(JPEG_WAITDONE_PARAM));
11020*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_WaitDone\n");
11021*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_WaitDone, (void*)(&eWaitDone)) != UTOPIA_STATUS_SUCCESS)
11022*53ee8cc1Swenshuai.xi {
11023*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11024*53ee8cc1Swenshuai.xi }
11025*53ee8cc1Swenshuai.xi return eWaitDone.retVal;
11026*53ee8cc1Swenshuai.xi #else
11027*53ee8cc1Swenshuai.xi return _MApi_JPEG_WaitDone();
11028*53ee8cc1Swenshuai.xi #endif
11029*53ee8cc1Swenshuai.xi }
11030*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime * DateTime)11031*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime *DateTime)
11032*53ee8cc1Swenshuai.xi {
11033*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11034*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11035*53ee8cc1Swenshuai.xi {
11036*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11037*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11038*53ee8cc1Swenshuai.xi }
11039*53ee8cc1Swenshuai.xi
11040*53ee8cc1Swenshuai.xi JPEG_GETEXIFDATETIME_PARAM eEXIFDate;
11041*53ee8cc1Swenshuai.xi memset(&eEXIFDate , 0 ,sizeof(JPEG_GETEXIFDATETIME_PARAM));
11042*53ee8cc1Swenshuai.xi eEXIFDate.DateTime = DateTime;
11043*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFDateTime\n");
11044*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFDateTime, (void*)(&eEXIFDate)) != UTOPIA_STATUS_SUCCESS)
11045*53ee8cc1Swenshuai.xi {
11046*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11047*53ee8cc1Swenshuai.xi }
11048*53ee8cc1Swenshuai.xi return eEXIFDate.retVal;
11049*53ee8cc1Swenshuai.xi #else
11050*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFDateTime(DateTime);
11051*53ee8cc1Swenshuai.xi #endif
11052*53ee8cc1Swenshuai.xi }
11053*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation * eOrientation)11054*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation *eOrientation)
11055*53ee8cc1Swenshuai.xi {
11056*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11057*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11058*53ee8cc1Swenshuai.xi {
11059*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11060*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11061*53ee8cc1Swenshuai.xi }
11062*53ee8cc1Swenshuai.xi
11063*53ee8cc1Swenshuai.xi JPEG_GETEXIFORIENTATION_PARAM eEXIFOri;
11064*53ee8cc1Swenshuai.xi memset(&eEXIFOri , 0 ,sizeof(JPEG_GETEXIFORIENTATION_PARAM));
11065*53ee8cc1Swenshuai.xi eEXIFOri.eOrientation = eOrientation;
11066*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFOrientation\n");
11067*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFOrientation, (void*)(&eEXIFOri)) != UTOPIA_STATUS_SUCCESS)
11068*53ee8cc1Swenshuai.xi {
11069*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11070*53ee8cc1Swenshuai.xi }
11071*53ee8cc1Swenshuai.xi return eEXIFOri.retVal;
11072*53ee8cc1Swenshuai.xi #else
11073*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFOrientation(eOrientation);
11074*53ee8cc1Swenshuai.xi #endif
11075*53ee8cc1Swenshuai.xi }
11076*53ee8cc1Swenshuai.xi
11077*53ee8cc1Swenshuai.xi #if SUPPORT_EXIF_EXTRA_INFO
MApi_JPEG_GetEXIFManufacturer(MS_U8 * pu8Manufacturer,MS_U8 u8size)11078*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFManufacturer(MS_U8 *pu8Manufacturer, MS_U8 u8size)
11079*53ee8cc1Swenshuai.xi {
11080*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11081*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11082*53ee8cc1Swenshuai.xi {
11083*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11084*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11085*53ee8cc1Swenshuai.xi }
11086*53ee8cc1Swenshuai.xi
11087*53ee8cc1Swenshuai.xi JPEG_GETEXIFSTRING_PARAM eEXIFStr;
11088*53ee8cc1Swenshuai.xi memset(&eEXIFStr , 0 ,sizeof(JPEG_GETEXIFSTRING_PARAM));
11089*53ee8cc1Swenshuai.xi eEXIFStr.pu8String = pu8Manufacturer;
11090*53ee8cc1Swenshuai.xi eEXIFStr.u8size = u8size;
11091*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFManufacturer\n");
11092*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFManufacturer, (void*)(&eEXIFStr)) != UTOPIA_STATUS_SUCCESS)
11093*53ee8cc1Swenshuai.xi {
11094*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11095*53ee8cc1Swenshuai.xi }
11096*53ee8cc1Swenshuai.xi return eEXIFStr.retVal;
11097*53ee8cc1Swenshuai.xi #else
11098*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFManufacturer(pu8Manufacturer, u8size);
11099*53ee8cc1Swenshuai.xi #endif
11100*53ee8cc1Swenshuai.xi }
11101*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFModel(MS_U8 * pu8Model,MS_U8 u8size)11102*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFModel(MS_U8 *pu8Model, MS_U8 u8size)
11103*53ee8cc1Swenshuai.xi {
11104*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11105*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11106*53ee8cc1Swenshuai.xi {
11107*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11108*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11109*53ee8cc1Swenshuai.xi }
11110*53ee8cc1Swenshuai.xi
11111*53ee8cc1Swenshuai.xi JPEG_GETEXIFSTRING_PARAM eEXIFStr;
11112*53ee8cc1Swenshuai.xi memset(&eEXIFStr , 0 ,sizeof(JPEG_GETEXIFSTRING_PARAM));
11113*53ee8cc1Swenshuai.xi eEXIFStr.pu8String = pu8Model;
11114*53ee8cc1Swenshuai.xi eEXIFStr.u8size = u8size;
11115*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFModel\n");
11116*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFModel, (void*)(&eEXIFStr)) != UTOPIA_STATUS_SUCCESS)
11117*53ee8cc1Swenshuai.xi {
11118*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11119*53ee8cc1Swenshuai.xi }
11120*53ee8cc1Swenshuai.xi return eEXIFStr.retVal;
11121*53ee8cc1Swenshuai.xi #else
11122*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFModel(pu8Model, u8size);
11123*53ee8cc1Swenshuai.xi #endif
11124*53ee8cc1Swenshuai.xi }
11125*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFFlash(MS_U16 * pu16Flash)11126*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFFlash(MS_U16 *pu16Flash)
11127*53ee8cc1Swenshuai.xi {
11128*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11129*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11130*53ee8cc1Swenshuai.xi {
11131*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11132*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11133*53ee8cc1Swenshuai.xi }
11134*53ee8cc1Swenshuai.xi
11135*53ee8cc1Swenshuai.xi JPEG_GETEXIFU16_PARAM U16PARA;
11136*53ee8cc1Swenshuai.xi memset(&U16PARA , 0 ,sizeof(JPEG_GETEXIFU16_PARAM));
11137*53ee8cc1Swenshuai.xi U16PARA.pu16Value = pu16Flash;
11138*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFFlash\n");
11139*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFFlash, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11140*53ee8cc1Swenshuai.xi {
11141*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11142*53ee8cc1Swenshuai.xi }
11143*53ee8cc1Swenshuai.xi return U16PARA.retVal;
11144*53ee8cc1Swenshuai.xi #else
11145*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFFlash(pu16Flash);
11146*53ee8cc1Swenshuai.xi #endif
11147*53ee8cc1Swenshuai.xi }
11148*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 * pu32ISOSpeedRatings)11149*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 *pu32ISOSpeedRatings)
11150*53ee8cc1Swenshuai.xi {
11151*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11152*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11153*53ee8cc1Swenshuai.xi {
11154*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11155*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11156*53ee8cc1Swenshuai.xi }
11157*53ee8cc1Swenshuai.xi
11158*53ee8cc1Swenshuai.xi JPEG_GETEXIFU32_PARAM U32PARA;
11159*53ee8cc1Swenshuai.xi memset(&U32PARA , 0 ,sizeof(JPEG_GETEXIFU32_PARAM));
11160*53ee8cc1Swenshuai.xi U32PARA.pu32Value = pu32ISOSpeedRatings;
11161*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFISOSpeedRatings\n");
11162*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFISOSpeedRatings, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
11163*53ee8cc1Swenshuai.xi {
11164*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11165*53ee8cc1Swenshuai.xi }
11166*53ee8cc1Swenshuai.xi return U32PARA.retVal;
11167*53ee8cc1Swenshuai.xi #else
11168*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFISOSpeedRatings(pu32ISOSpeedRatings);
11169*53ee8cc1Swenshuai.xi #endif
11170*53ee8cc1Swenshuai.xi }
11171*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL * pShutterSpeedValue)11172*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL *pShutterSpeedValue)
11173*53ee8cc1Swenshuai.xi {
11174*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11175*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11176*53ee8cc1Swenshuai.xi {
11177*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11178*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11179*53ee8cc1Swenshuai.xi }
11180*53ee8cc1Swenshuai.xi
11181*53ee8cc1Swenshuai.xi JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11182*53ee8cc1Swenshuai.xi memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11183*53ee8cc1Swenshuai.xi RATIONALPARA.pRational = pShutterSpeedValue;
11184*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFShutterSpeedValue\n");
11185*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFShutterSpeedValue, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11186*53ee8cc1Swenshuai.xi {
11187*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11188*53ee8cc1Swenshuai.xi }
11189*53ee8cc1Swenshuai.xi return RATIONALPARA.retVal;
11190*53ee8cc1Swenshuai.xi #else
11191*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFShutterSpeedValue(pShutterSpeedValue);
11192*53ee8cc1Swenshuai.xi #endif
11193*53ee8cc1Swenshuai.xi }
11194*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL * pApertureValue)11195*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL *pApertureValue)
11196*53ee8cc1Swenshuai.xi {
11197*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11198*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11199*53ee8cc1Swenshuai.xi {
11200*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11201*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11202*53ee8cc1Swenshuai.xi }
11203*53ee8cc1Swenshuai.xi
11204*53ee8cc1Swenshuai.xi JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11205*53ee8cc1Swenshuai.xi memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11206*53ee8cc1Swenshuai.xi RATIONALPARA.pRational = pApertureValue;
11207*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFApertureValue\n");
11208*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFApertureValue, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11209*53ee8cc1Swenshuai.xi {
11210*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11211*53ee8cc1Swenshuai.xi }
11212*53ee8cc1Swenshuai.xi return RATIONALPARA.retVal;
11213*53ee8cc1Swenshuai.xi #else
11214*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFApertureValue(pApertureValue);
11215*53ee8cc1Swenshuai.xi #endif
11216*53ee8cc1Swenshuai.xi }
11217*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL * pExposureBiasValue)11218*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL *pExposureBiasValue)
11219*53ee8cc1Swenshuai.xi {
11220*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11221*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11222*53ee8cc1Swenshuai.xi {
11223*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11224*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11225*53ee8cc1Swenshuai.xi }
11226*53ee8cc1Swenshuai.xi
11227*53ee8cc1Swenshuai.xi JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11228*53ee8cc1Swenshuai.xi memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11229*53ee8cc1Swenshuai.xi RATIONALPARA.pRational = pExposureBiasValue;
11230*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFExposureBiasValue\n");
11231*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFExposureBiasValue, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11232*53ee8cc1Swenshuai.xi {
11233*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11234*53ee8cc1Swenshuai.xi }
11235*53ee8cc1Swenshuai.xi return RATIONALPARA.retVal;
11236*53ee8cc1Swenshuai.xi #else
11237*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFExposureBiasValue(pExposureBiasValue);
11238*53ee8cc1Swenshuai.xi #endif
11239*53ee8cc1Swenshuai.xi }
11240*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL * pFocalLength)11241*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL *pFocalLength)
11242*53ee8cc1Swenshuai.xi {
11243*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11244*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11245*53ee8cc1Swenshuai.xi {
11246*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11247*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11248*53ee8cc1Swenshuai.xi }
11249*53ee8cc1Swenshuai.xi
11250*53ee8cc1Swenshuai.xi JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11251*53ee8cc1Swenshuai.xi memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11252*53ee8cc1Swenshuai.xi RATIONALPARA.pRational = pFocalLength;
11253*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFFocalLength\n");
11254*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFFocalLength, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11255*53ee8cc1Swenshuai.xi {
11256*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11257*53ee8cc1Swenshuai.xi }
11258*53ee8cc1Swenshuai.xi return RATIONALPARA.retVal;
11259*53ee8cc1Swenshuai.xi #else
11260*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFFocalLength(pFocalLength);
11261*53ee8cc1Swenshuai.xi #endif
11262*53ee8cc1Swenshuai.xi }
11263*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFImageWidth(MS_U32 * pu32ImageWidth)11264*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFImageWidth(MS_U32 *pu32ImageWidth)
11265*53ee8cc1Swenshuai.xi {
11266*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11267*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11268*53ee8cc1Swenshuai.xi {
11269*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11270*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11271*53ee8cc1Swenshuai.xi }
11272*53ee8cc1Swenshuai.xi
11273*53ee8cc1Swenshuai.xi JPEG_GETEXIFU32_PARAM U32PARA;
11274*53ee8cc1Swenshuai.xi memset(&U32PARA , 0 ,sizeof(JPEG_GETEXIFU32_PARAM));
11275*53ee8cc1Swenshuai.xi U32PARA.pu32Value = pu32ImageWidth;
11276*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFImageWidth\n");
11277*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFImageWidth, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
11278*53ee8cc1Swenshuai.xi {
11279*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11280*53ee8cc1Swenshuai.xi }
11281*53ee8cc1Swenshuai.xi return U32PARA.retVal;
11282*53ee8cc1Swenshuai.xi #else
11283*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFImageWidth(pu32ImageWidth);
11284*53ee8cc1Swenshuai.xi #endif
11285*53ee8cc1Swenshuai.xi }
11286*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFImageHeight(MS_U32 * pu32ImageHeight)11287*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFImageHeight(MS_U32 *pu32ImageHeight)
11288*53ee8cc1Swenshuai.xi {
11289*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11290*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11291*53ee8cc1Swenshuai.xi {
11292*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11293*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11294*53ee8cc1Swenshuai.xi }
11295*53ee8cc1Swenshuai.xi
11296*53ee8cc1Swenshuai.xi JPEG_GETEXIFU32_PARAM U32PARA;
11297*53ee8cc1Swenshuai.xi memset(&U32PARA , 0 ,sizeof(JPEG_GETEXIFU32_PARAM));
11298*53ee8cc1Swenshuai.xi U32PARA.pu32Value = pu32ImageHeight;
11299*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFImageHeight\n");
11300*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFImageHeight, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
11301*53ee8cc1Swenshuai.xi {
11302*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11303*53ee8cc1Swenshuai.xi }
11304*53ee8cc1Swenshuai.xi return U32PARA.retVal;
11305*53ee8cc1Swenshuai.xi #else
11306*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFImageHeight(pu32ImageHeight);
11307*53ee8cc1Swenshuai.xi #endif
11308*53ee8cc1Swenshuai.xi }
11309*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL * pExposureTime)11310*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL *pExposureTime)
11311*53ee8cc1Swenshuai.xi {
11312*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11313*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11314*53ee8cc1Swenshuai.xi {
11315*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11316*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11317*53ee8cc1Swenshuai.xi }
11318*53ee8cc1Swenshuai.xi
11319*53ee8cc1Swenshuai.xi JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11320*53ee8cc1Swenshuai.xi memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11321*53ee8cc1Swenshuai.xi RATIONALPARA.pRational = pExposureTime;
11322*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFExposureTime\n");
11323*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFExposureTime, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11324*53ee8cc1Swenshuai.xi {
11325*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11326*53ee8cc1Swenshuai.xi }
11327*53ee8cc1Swenshuai.xi return RATIONALPARA.retVal;
11328*53ee8cc1Swenshuai.xi #else
11329*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFExposureTime(pExposureTime);
11330*53ee8cc1Swenshuai.xi #endif
11331*53ee8cc1Swenshuai.xi }
11332*53ee8cc1Swenshuai.xi
MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL * pFNumber)11333*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL *pFNumber)
11334*53ee8cc1Swenshuai.xi {
11335*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11336*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11337*53ee8cc1Swenshuai.xi {
11338*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11339*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11340*53ee8cc1Swenshuai.xi }
11341*53ee8cc1Swenshuai.xi
11342*53ee8cc1Swenshuai.xi JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
11343*53ee8cc1Swenshuai.xi memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
11344*53ee8cc1Swenshuai.xi RATIONALPARA.pRational = pFNumber;
11345*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFFNumber\n");
11346*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetEXIFFNumber, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
11347*53ee8cc1Swenshuai.xi {
11348*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11349*53ee8cc1Swenshuai.xi }
11350*53ee8cc1Swenshuai.xi return RATIONALPARA.retVal;
11351*53ee8cc1Swenshuai.xi #else
11352*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetEXIFFNumber(pFNumber);
11353*53ee8cc1Swenshuai.xi #endif
11354*53ee8cc1Swenshuai.xi }
11355*53ee8cc1Swenshuai.xi
11356*53ee8cc1Swenshuai.xi #endif
11357*53ee8cc1Swenshuai.xi
MApi_JPEG_GetFreeMemory(MS_U32 size)11358*53ee8cc1Swenshuai.xi MS_PHYADDR MApi_JPEG_GetFreeMemory(MS_U32 size)
11359*53ee8cc1Swenshuai.xi {
11360*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11361*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11362*53ee8cc1Swenshuai.xi {
11363*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11364*53ee8cc1Swenshuai.xi return 0;
11365*53ee8cc1Swenshuai.xi }
11366*53ee8cc1Swenshuai.xi
11367*53ee8cc1Swenshuai.xi JPEG_GETFREEMEMORY_PARAM MEMORYPARA;
11368*53ee8cc1Swenshuai.xi memset(&MEMORYPARA , 0 ,sizeof(JPEG_GETFREEMEMORY_PARAM));
11369*53ee8cc1Swenshuai.xi MEMORYPARA.size = size;
11370*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetFreeMemory\n");
11371*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetFreeMemory, (void*)(&MEMORYPARA)) != UTOPIA_STATUS_SUCCESS)
11372*53ee8cc1Swenshuai.xi {
11373*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11374*53ee8cc1Swenshuai.xi }
11375*53ee8cc1Swenshuai.xi return MEMORYPARA.addr;
11376*53ee8cc1Swenshuai.xi #else
11377*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetFreeMemory(size);
11378*53ee8cc1Swenshuai.xi #endif
11379*53ee8cc1Swenshuai.xi }
11380*53ee8cc1Swenshuai.xi
11381*53ee8cc1Swenshuai.xi
MApi_JPEG_GetDataOffset(void)11382*53ee8cc1Swenshuai.xi MS_U32 MApi_JPEG_GetDataOffset(void)
11383*53ee8cc1Swenshuai.xi {
11384*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11385*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11386*53ee8cc1Swenshuai.xi {
11387*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11388*53ee8cc1Swenshuai.xi return 0;
11389*53ee8cc1Swenshuai.xi }
11390*53ee8cc1Swenshuai.xi
11391*53ee8cc1Swenshuai.xi JPEG_U32_PARAM U32PARA;
11392*53ee8cc1Swenshuai.xi memset(&U32PARA , 0 ,sizeof(JPEG_U32_PARAM));
11393*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetDataOffset\n");
11394*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetDataOffset, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
11395*53ee8cc1Swenshuai.xi {
11396*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11397*53ee8cc1Swenshuai.xi return 0;
11398*53ee8cc1Swenshuai.xi }
11399*53ee8cc1Swenshuai.xi return U32PARA.u32Value;
11400*53ee8cc1Swenshuai.xi #else
11401*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetDataOffset();
11402*53ee8cc1Swenshuai.xi #endif
11403*53ee8cc1Swenshuai.xi }
11404*53ee8cc1Swenshuai.xi
MApi_JPEG_GetSOFOffset(void)11405*53ee8cc1Swenshuai.xi MS_U32 MApi_JPEG_GetSOFOffset(void)
11406*53ee8cc1Swenshuai.xi {
11407*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11408*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11409*53ee8cc1Swenshuai.xi {
11410*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11411*53ee8cc1Swenshuai.xi return 0;
11412*53ee8cc1Swenshuai.xi }
11413*53ee8cc1Swenshuai.xi
11414*53ee8cc1Swenshuai.xi JPEG_U32_PARAM U32PARA;
11415*53ee8cc1Swenshuai.xi memset(&U32PARA , 0 ,sizeof(JPEG_U32_PARAM));
11416*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetSOFOffset\n");
11417*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetSOFOffset, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
11418*53ee8cc1Swenshuai.xi {
11419*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11420*53ee8cc1Swenshuai.xi return 0;
11421*53ee8cc1Swenshuai.xi }
11422*53ee8cc1Swenshuai.xi return U32PARA.u32Value;
11423*53ee8cc1Swenshuai.xi #else
11424*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetSOFOffset();
11425*53ee8cc1Swenshuai.xi #endif
11426*53ee8cc1Swenshuai.xi }
11427*53ee8cc1Swenshuai.xi
MApi_JPEG_SupportCMYK(MS_BOOL bEnable)11428*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_SupportCMYK(MS_BOOL bEnable)
11429*53ee8cc1Swenshuai.xi {
11430*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11431*53ee8cc1Swenshuai.xi if (pInstantJPD == NULL)
11432*53ee8cc1Swenshuai.xi {
11433*53ee8cc1Swenshuai.xi if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) != UTOPIA_STATUS_SUCCESS)
11434*53ee8cc1Swenshuai.xi {
11435*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Open JPD fail\n");
11436*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11437*53ee8cc1Swenshuai.xi }
11438*53ee8cc1Swenshuai.xi }
11439*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11440*53ee8cc1Swenshuai.xi {
11441*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11442*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
11443*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11444*53ee8cc1Swenshuai.xi }
11445*53ee8cc1Swenshuai.xi
11446*53ee8cc1Swenshuai.xi JPEG_SUPPORTCMYK_PARAM CMYKRGB;
11447*53ee8cc1Swenshuai.xi memset(&CMYKRGB , 0 ,sizeof(JPEG_SUPPORTCMYK_PARAM));
11448*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SupportCMYK\n");
11449*53ee8cc1Swenshuai.xi CMYKRGB.bEnable = bEnable;
11450*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SupportCMYK, (void*)(&CMYKRGB)) != UTOPIA_STATUS_SUCCESS)
11451*53ee8cc1Swenshuai.xi {
11452*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11453*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
11454*53ee8cc1Swenshuai.xi pInstantJPD = NULL;
11455*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11456*53ee8cc1Swenshuai.xi }
11457*53ee8cc1Swenshuai.xi return CMYKRGB.retVal;
11458*53ee8cc1Swenshuai.xi #else
11459*53ee8cc1Swenshuai.xi return _MApi_JPEG_SupportCMYK(bEnable);
11460*53ee8cc1Swenshuai.xi #endif
11461*53ee8cc1Swenshuai.xi }
11462*53ee8cc1Swenshuai.xi
MApi_JPEG_SupportRGB(MS_BOOL bEnable)11463*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_SupportRGB(MS_BOOL bEnable)
11464*53ee8cc1Swenshuai.xi {
11465*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11466*53ee8cc1Swenshuai.xi if (pInstantJPD == NULL)
11467*53ee8cc1Swenshuai.xi {
11468*53ee8cc1Swenshuai.xi if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) != UTOPIA_STATUS_SUCCESS)
11469*53ee8cc1Swenshuai.xi {
11470*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Open JPD fail\n");
11471*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11472*53ee8cc1Swenshuai.xi }
11473*53ee8cc1Swenshuai.xi }
11474*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11475*53ee8cc1Swenshuai.xi {
11476*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11477*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
11478*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11479*53ee8cc1Swenshuai.xi }
11480*53ee8cc1Swenshuai.xi
11481*53ee8cc1Swenshuai.xi JPEG_SUPPORTCMYK_PARAM CMYKRGB;
11482*53ee8cc1Swenshuai.xi memset(&CMYKRGB , 0 ,sizeof(JPEG_SUPPORTCMYK_PARAM));
11483*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SupportRGB\n");
11484*53ee8cc1Swenshuai.xi CMYKRGB.bEnable = bEnable;
11485*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SupportRGB, (void*)(&CMYKRGB)) != UTOPIA_STATUS_SUCCESS)
11486*53ee8cc1Swenshuai.xi {
11487*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11488*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
11489*53ee8cc1Swenshuai.xi pInstantJPD = NULL;
11490*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11491*53ee8cc1Swenshuai.xi }
11492*53ee8cc1Swenshuai.xi return CMYKRGB.retVal;
11493*53ee8cc1Swenshuai.xi #else
11494*53ee8cc1Swenshuai.xi return _MApi_JPEG_SupportRGB(bEnable);
11495*53ee8cc1Swenshuai.xi #endif
11496*53ee8cc1Swenshuai.xi }
11497*53ee8cc1Swenshuai.xi
MApi_JPEG_SetMHEG5(MS_BOOL bEnable)11498*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMHEG5(MS_BOOL bEnable)
11499*53ee8cc1Swenshuai.xi {
11500*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11501*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11502*53ee8cc1Swenshuai.xi {
11503*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11504*53ee8cc1Swenshuai.xi return;
11505*53ee8cc1Swenshuai.xi }
11506*53ee8cc1Swenshuai.xi
11507*53ee8cc1Swenshuai.xi JPEG_BOOL_PARAM bPARA;
11508*53ee8cc1Swenshuai.xi memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
11509*53ee8cc1Swenshuai.xi bPARA.bValue= bEnable;
11510*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMHEG5\n");
11511*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMHEG5, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
11512*53ee8cc1Swenshuai.xi {
11513*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11514*53ee8cc1Swenshuai.xi return;
11515*53ee8cc1Swenshuai.xi }
11516*53ee8cc1Swenshuai.xi return;
11517*53ee8cc1Swenshuai.xi #else
11518*53ee8cc1Swenshuai.xi _MApi_JPEG_SetMHEG5(bEnable);
11519*53ee8cc1Swenshuai.xi #endif
11520*53ee8cc1Swenshuai.xi }
11521*53ee8cc1Swenshuai.xi
11522*53ee8cc1Swenshuai.xi
11523*53ee8cc1Swenshuai.xi #if SUPPORT_MPO_FORMAT
11524*53ee8cc1Swenshuai.xi //For MPO
MApi_JPEG_IsMPOFormat(void)11525*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_IsMPOFormat(void)
11526*53ee8cc1Swenshuai.xi {
11527*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11528*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11529*53ee8cc1Swenshuai.xi {
11530*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11531*53ee8cc1Swenshuai.xi return 0;
11532*53ee8cc1Swenshuai.xi }
11533*53ee8cc1Swenshuai.xi
11534*53ee8cc1Swenshuai.xi JPEG_BOOL_PARAM bPARA;
11535*53ee8cc1Swenshuai.xi memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
11536*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_IsMPOFormat\n");
11537*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_IsMPOFormat, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
11538*53ee8cc1Swenshuai.xi {
11539*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11540*53ee8cc1Swenshuai.xi return 0;
11541*53ee8cc1Swenshuai.xi }
11542*53ee8cc1Swenshuai.xi return bPARA.bValue;
11543*53ee8cc1Swenshuai.xi #else
11544*53ee8cc1Swenshuai.xi return _MApi_JPEG_IsMPOFormat();
11545*53ee8cc1Swenshuai.xi #endif
11546*53ee8cc1Swenshuai.xi }
11547*53ee8cc1Swenshuai.xi
11548*53ee8cc1Swenshuai.xi
MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO ** ppMPOIndex)11549*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO **ppMPOIndex)
11550*53ee8cc1Swenshuai.xi {
11551*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11552*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11553*53ee8cc1Swenshuai.xi {
11554*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11555*53ee8cc1Swenshuai.xi return 0;
11556*53ee8cc1Swenshuai.xi }
11557*53ee8cc1Swenshuai.xi
11558*53ee8cc1Swenshuai.xi JPEG_GETMPOINDEX_PARAM eMPOIndex;
11559*53ee8cc1Swenshuai.xi memset(&eMPOIndex , 0 ,sizeof(JPEG_GETMPOINDEX_PARAM));
11560*53ee8cc1Swenshuai.xi eMPOIndex.ppMPOIndex = ppMPOIndex;
11561*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetMPOIndex\n");
11562*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetMPOIndex, (void*)(&eMPOIndex)) != UTOPIA_STATUS_SUCCESS)
11563*53ee8cc1Swenshuai.xi {
11564*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11565*53ee8cc1Swenshuai.xi return 0;
11566*53ee8cc1Swenshuai.xi }
11567*53ee8cc1Swenshuai.xi return eMPOIndex.bretVal;
11568*53ee8cc1Swenshuai.xi #else
11569*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetMPOIndex(ppMPOIndex);
11570*53ee8cc1Swenshuai.xi #endif
11571*53ee8cc1Swenshuai.xi }
11572*53ee8cc1Swenshuai.xi
MApi_JPEG_GetMPOAttr(MS_U32 image_no,JPEG_MPO_ATTRIBUTE_INFO ** ppMPOAttr)11573*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_GetMPOAttr(MS_U32 image_no, JPEG_MPO_ATTRIBUTE_INFO **ppMPOAttr)
11574*53ee8cc1Swenshuai.xi {
11575*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11576*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11577*53ee8cc1Swenshuai.xi {
11578*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11579*53ee8cc1Swenshuai.xi return 0;
11580*53ee8cc1Swenshuai.xi }
11581*53ee8cc1Swenshuai.xi
11582*53ee8cc1Swenshuai.xi JPEG_GETMPOATTR_PARAM eMPOAttr;
11583*53ee8cc1Swenshuai.xi memset(&eMPOAttr , 0 ,sizeof(JPEG_GETMPOATTR_PARAM));
11584*53ee8cc1Swenshuai.xi eMPOAttr.image_no = image_no;
11585*53ee8cc1Swenshuai.xi eMPOAttr.ppMPOAttr = ppMPOAttr;
11586*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetMPOAttr\n");
11587*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetMPOAttr, (void*)(&eMPOAttr)) != UTOPIA_STATUS_SUCCESS)
11588*53ee8cc1Swenshuai.xi {
11589*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11590*53ee8cc1Swenshuai.xi return 0;
11591*53ee8cc1Swenshuai.xi }
11592*53ee8cc1Swenshuai.xi return eMPOAttr.bretVal;
11593*53ee8cc1Swenshuai.xi #else
11594*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetMPOAttr(image_no, ppMPOAttr);
11595*53ee8cc1Swenshuai.xi #endif
11596*53ee8cc1Swenshuai.xi }
11597*53ee8cc1Swenshuai.xi
MApi_JPEG_DumpMPO(void)11598*53ee8cc1Swenshuai.xi void MApi_JPEG_DumpMPO(void)
11599*53ee8cc1Swenshuai.xi {
11600*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11601*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11602*53ee8cc1Swenshuai.xi {
11603*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11604*53ee8cc1Swenshuai.xi return;
11605*53ee8cc1Swenshuai.xi }
11606*53ee8cc1Swenshuai.xi
11607*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_DumpMPO\n");
11608*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_DumpMPO, NULL) != UTOPIA_STATUS_SUCCESS)
11609*53ee8cc1Swenshuai.xi {
11610*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11611*53ee8cc1Swenshuai.xi }
11612*53ee8cc1Swenshuai.xi #else
11613*53ee8cc1Swenshuai.xi _MApi_JPEG_DumpMPO();
11614*53ee8cc1Swenshuai.xi #endif
11615*53ee8cc1Swenshuai.xi }
11616*53ee8cc1Swenshuai.xi
MApi_JPEG_SetMPOBuffer(MS_U32 read_offset,MS_U32 output_start)11617*53ee8cc1Swenshuai.xi MS_BOOL MApi_JPEG_SetMPOBuffer(MS_U32 read_offset, MS_U32 output_start)
11618*53ee8cc1Swenshuai.xi {
11619*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11620*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11621*53ee8cc1Swenshuai.xi {
11622*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11623*53ee8cc1Swenshuai.xi return 0;
11624*53ee8cc1Swenshuai.xi }
11625*53ee8cc1Swenshuai.xi
11626*53ee8cc1Swenshuai.xi JPEG_SETMPOBUFFER_PARAM eMPOBuff;
11627*53ee8cc1Swenshuai.xi memset(&eMPOBuff , 0 ,sizeof(JPEG_SETMPOBUFFER_PARAM));
11628*53ee8cc1Swenshuai.xi eMPOBuff.read_offset = read_offset;
11629*53ee8cc1Swenshuai.xi eMPOBuff.output_start = output_start;
11630*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMPOBuffer\n");
11631*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMPOBuffer, (void*)(&eMPOBuff)) != UTOPIA_STATUS_SUCCESS)
11632*53ee8cc1Swenshuai.xi {
11633*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11634*53ee8cc1Swenshuai.xi return 0;
11635*53ee8cc1Swenshuai.xi }
11636*53ee8cc1Swenshuai.xi return eMPOBuff.bretVal;
11637*53ee8cc1Swenshuai.xi #else
11638*53ee8cc1Swenshuai.xi return _MApi_JPEG_SetMPOBuffer(read_offset, output_start);
11639*53ee8cc1Swenshuai.xi #endif
11640*53ee8cc1Swenshuai.xi }
11641*53ee8cc1Swenshuai.xi
MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)11642*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
11643*53ee8cc1Swenshuai.xi {
11644*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11645*53ee8cc1Swenshuai.xi if (pInstantJPD == NULL)
11646*53ee8cc1Swenshuai.xi {
11647*53ee8cc1Swenshuai.xi if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) != UTOPIA_STATUS_SUCCESS)
11648*53ee8cc1Swenshuai.xi {
11649*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Open JPD fail\n");
11650*53ee8cc1Swenshuai.xi return;
11651*53ee8cc1Swenshuai.xi }
11652*53ee8cc1Swenshuai.xi }
11653*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11654*53ee8cc1Swenshuai.xi {
11655*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11656*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
11657*53ee8cc1Swenshuai.xi return;
11658*53ee8cc1Swenshuai.xi }
11659*53ee8cc1Swenshuai.xi
11660*53ee8cc1Swenshuai.xi JPEG_RESOLUTION_PARAM Resol;
11661*53ee8cc1Swenshuai.xi memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
11662*53ee8cc1Swenshuai.xi Resol.u16Width= u16Width;
11663*53ee8cc1Swenshuai.xi Resol.u16Height= u16Height;
11664*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMPOMaxDecodeResolution\n");
11665*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMPOMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
11666*53ee8cc1Swenshuai.xi {
11667*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11668*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
11669*53ee8cc1Swenshuai.xi pInstantJPD = NULL;
11670*53ee8cc1Swenshuai.xi }
11671*53ee8cc1Swenshuai.xi #else
11672*53ee8cc1Swenshuai.xi _MApi_JPEG_SetMPOMaxDecodeResolution(u16Width, u16Height);
11673*53ee8cc1Swenshuai.xi #endif
11674*53ee8cc1Swenshuai.xi }
11675*53ee8cc1Swenshuai.xi
MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)11676*53ee8cc1Swenshuai.xi void MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
11677*53ee8cc1Swenshuai.xi {
11678*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11679*53ee8cc1Swenshuai.xi if (pInstantJPD == NULL)
11680*53ee8cc1Swenshuai.xi {
11681*53ee8cc1Swenshuai.xi if(UtopiaOpen(MODULE_JPEG, &pInstantJPD, 0, NULL) != UTOPIA_STATUS_SUCCESS)
11682*53ee8cc1Swenshuai.xi {
11683*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("Open JPD fail\n");
11684*53ee8cc1Swenshuai.xi return;
11685*53ee8cc1Swenshuai.xi }
11686*53ee8cc1Swenshuai.xi }
11687*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11688*53ee8cc1Swenshuai.xi {
11689*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11690*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
11691*53ee8cc1Swenshuai.xi return;
11692*53ee8cc1Swenshuai.xi }
11693*53ee8cc1Swenshuai.xi
11694*53ee8cc1Swenshuai.xi JPEG_RESOLUTION_PARAM Resol;
11695*53ee8cc1Swenshuai.xi memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
11696*53ee8cc1Swenshuai.xi Resol.u16Width= u16ProWidth;
11697*53ee8cc1Swenshuai.xi Resol.u16Height= u16ProHeight;
11698*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMPOProMaxDecodeResolution\n");
11699*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_SetMPOProMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
11700*53ee8cc1Swenshuai.xi {
11701*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11702*53ee8cc1Swenshuai.xi UtopiaClose(pInstantJPD);
11703*53ee8cc1Swenshuai.xi pInstantJPD = NULL;
11704*53ee8cc1Swenshuai.xi }
11705*53ee8cc1Swenshuai.xi #else
11706*53ee8cc1Swenshuai.xi _MApi_JPEG_SetMPOProMaxDecodeResolution(u16ProWidth, u16ProHeight);
11707*53ee8cc1Swenshuai.xi #endif
11708*53ee8cc1Swenshuai.xi }
11709*53ee8cc1Swenshuai.xi
11710*53ee8cc1Swenshuai.xi #endif
11711*53ee8cc1Swenshuai.xi
MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID,MS_U32 * param,MS_U32 u32size)11712*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID, MS_U32 *param, MS_U32 u32size)
11713*53ee8cc1Swenshuai.xi {
11714*53ee8cc1Swenshuai.xi #if (JPEG_UTOPIA20)
11715*53ee8cc1Swenshuai.xi if(pInstantJPD==NULL)
11716*53ee8cc1Swenshuai.xi {
11717*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11718*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11719*53ee8cc1Swenshuai.xi }
11720*53ee8cc1Swenshuai.xi
11721*53ee8cc1Swenshuai.xi JPEG_GET_CTRL_PARAM eGetCTRL;
11722*53ee8cc1Swenshuai.xi memset(&eGetCTRL , 0 ,sizeof(JPEG_GET_CTRL_PARAM));
11723*53ee8cc1Swenshuai.xi eGetCTRL.eGetID = eGetID;
11724*53ee8cc1Swenshuai.xi eGetCTRL.param = param;
11725*53ee8cc1Swenshuai.xi eGetCTRL.u32size = u32size;
11726*53ee8cc1Swenshuai.xi
11727*53ee8cc1Swenshuai.xi UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetControl\n");
11728*53ee8cc1Swenshuai.xi if(UtopiaIoctl(pInstantJPD,MApi_CMD_JPEG_GetControl, (void*)(&eGetCTRL)) != UTOPIA_STATUS_SUCCESS)
11729*53ee8cc1Swenshuai.xi {
11730*53ee8cc1Swenshuai.xi JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11731*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11732*53ee8cc1Swenshuai.xi }
11733*53ee8cc1Swenshuai.xi return eGetCTRL.retVal;
11734*53ee8cc1Swenshuai.xi #else
11735*53ee8cc1Swenshuai.xi return _MApi_JPEG_GetControl(eGetID, param, u32size);
11736*53ee8cc1Swenshuai.xi #endif
11737*53ee8cc1Swenshuai.xi }
11738*53ee8cc1Swenshuai.xi
MApi_JPEG_EnableOJPD(MS_BOOL bOnOff)11739*53ee8cc1Swenshuai.xi void MApi_JPEG_EnableOJPD(MS_BOOL bOnOff)
11740*53ee8cc1Swenshuai.xi {
11741*53ee8cc1Swenshuai.xi // wrapper only
11742*53ee8cc1Swenshuai.xi UNUSED(bOnOff);
11743*53ee8cc1Swenshuai.xi return;
11744*53ee8cc1Swenshuai.xi }
MApi_JPEG_Init_UsingOJPD(JPEG_InitParam * pInitParam)11745*53ee8cc1Swenshuai.xi JPEG_Result MApi_JPEG_Init_UsingOJPD(JPEG_InitParam *pInitParam)
11746*53ee8cc1Swenshuai.xi {
11747*53ee8cc1Swenshuai.xi // wrapper only
11748*53ee8cc1Swenshuai.xi UNUSED(pInitParam);
11749*53ee8cc1Swenshuai.xi return E_JPEG_FAILED;
11750*53ee8cc1Swenshuai.xi }
MApi_JPEG_SetNJPDInstance(MS_U8 JPDNum)11751*53ee8cc1Swenshuai.xi void MApi_JPEG_SetNJPDInstance(MS_U8 JPDNum)
11752*53ee8cc1Swenshuai.xi {
11753*53ee8cc1Swenshuai.xi // wrapper only
11754*53ee8cc1Swenshuai.xi UNUSED(JPDNum);
11755*53ee8cc1Swenshuai.xi return;
11756*53ee8cc1Swenshuai.xi }
MApi_JPEG_SetVerificationMode(NJPEG_VerificationMode VerificationMode)11757*53ee8cc1Swenshuai.xi void MApi_JPEG_SetVerificationMode(NJPEG_VerificationMode VerificationMode)
11758*53ee8cc1Swenshuai.xi {
11759*53ee8cc1Swenshuai.xi // wrapper only
11760*53ee8cc1Swenshuai.xi UNUSED(VerificationMode);
11761*53ee8cc1Swenshuai.xi return;
11762*53ee8cc1Swenshuai.xi }
MApi_JPEG_GetVerificationMode(void)11763*53ee8cc1Swenshuai.xi NJPEG_VerificationMode MApi_JPEG_GetVerificationMode(void)
11764*53ee8cc1Swenshuai.xi {
11765*53ee8cc1Swenshuai.xi // wrapper only
11766*53ee8cc1Swenshuai.xi return E_NJPEG00_NONE;
11767*53ee8cc1Swenshuai.xi }
MApi_NJPD_Debug(void)11768*53ee8cc1Swenshuai.xi void MApi_NJPD_Debug(void)
11769*53ee8cc1Swenshuai.xi {
11770*53ee8cc1Swenshuai.xi // wrapper only
11771*53ee8cc1Swenshuai.xi return;
11772*53ee8cc1Swenshuai.xi }
11773*53ee8cc1Swenshuai.xi
11774*53ee8cc1Swenshuai.xi
11775