xref: /utopia/UTPA2-700.0.x/modules/vdec_v2/api/vdec_ex/apiMJPEG_EX.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file    apiMJPEG.c
98*53ee8cc1Swenshuai.xi /// @brief  MJPEG API
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
103*53ee8cc1Swenshuai.xi //  Include Files
104*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
105*53ee8cc1Swenshuai.xi #include "MsCommon.h"
106*53ee8cc1Swenshuai.xi // JPEG
107*53ee8cc1Swenshuai.xi #include "drvMJPEG.h"
108*53ee8cc1Swenshuai.xi #include "apiJPEG.h"
109*53ee8cc1Swenshuai.xi #include "apiMJPEG_EX.h"
110*53ee8cc1Swenshuai.xi // RIU Base
111*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
112*53ee8cc1Swenshuai.xi 
113*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
114*53ee8cc1Swenshuai.xi #include <linux/string.h>
115*53ee8cc1Swenshuai.xi #else
116*53ee8cc1Swenshuai.xi #include <string.h>
117*53ee8cc1Swenshuai.xi #endif
118*53ee8cc1Swenshuai.xi 
119*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
120*53ee8cc1Swenshuai.xi //  Local Compiler Options
121*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi #define ENABLE_MJPEG_FIRMWARE           1
124*53ee8cc1Swenshuai.xi 
125*53ee8cc1Swenshuai.xi #define ENABLE_AVSYNC_ID_CHECK          0
126*53ee8cc1Swenshuai.xi 
127*53ee8cc1Swenshuai.xi #define ENABLE_DOUBLE_FRAMERATE         0
128*53ee8cc1Swenshuai.xi 
129*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
130*53ee8cc1Swenshuai.xi //  Local Defines
131*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
132*53ee8cc1Swenshuai.xi #define JPEGBASEWIDTHMAX    1920//1600
133*53ee8cc1Swenshuai.xi #define JPEGBASEHEIGHTMAX   1080//1200
134*53ee8cc1Swenshuai.xi #define JPEGPROWIDTHMAX     1024
135*53ee8cc1Swenshuai.xi #define JPEGPROHEIGHTMAX    768
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi #define MJPEG_SD_WIDTH      640
138*53ee8cc1Swenshuai.xi #define MJPEG_SD_HEIGHT     480
139*53ee8cc1Swenshuai.xi 
140*53ee8cc1Swenshuai.xi #define MJPEG_HD_800x600_WIDTH      800
141*53ee8cc1Swenshuai.xi #define MJPEG_HD_800x600_HEIGHT     600
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi #define MJPEG_MAX_SUPPORT_WIDTH     1368
144*53ee8cc1Swenshuai.xi #define MJPEG_MAX_SUPPORT_HEIGHT     768
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi #define MAX_SUPPORTED_FRAME_RATE_720P   30000
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi #define DISPLAY_QUEUE_NUM           8
149*53ee8cc1Swenshuai.xi 
150*53ee8cc1Swenshuai.xi #define SUPPORT_ASF_MJPEG_MODE                      TRUE
151*53ee8cc1Swenshuai.xi #define MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE       (0x400000*2)
152*53ee8cc1Swenshuai.xi #define VDEC_EX_MVD_PIC_START_FLAG                  0x40000000
153*53ee8cc1Swenshuai.xi 
154*53ee8cc1Swenshuai.xi #define SUPPORT_SKIP_ERROR_FRAME                    TRUE
155*53ee8cc1Swenshuai.xi #define SKIP_ERROR_FRAME_THRESHOLD                  60
156*53ee8cc1Swenshuai.xi #define printf_red(args...)           do{ printf("\033[1;31m"); printf(args); printf("\033[m"); }while(0)
157*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
158*53ee8cc1Swenshuai.xi //  Local Structures
159*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
160*53ee8cc1Swenshuai.xi #define JPEG_memcpy(pDstAddr, pSrcAddr, u32Size) memcpy((pDstAddr), (pSrcAddr), (u32Size))
161*53ee8cc1Swenshuai.xi #define JPEG_memset(pDstAddr, u8value, u32Size)  memset((pDstAddr), (u8value), (u32Size))
162*53ee8cc1Swenshuai.xi 
163*53ee8cc1Swenshuai.xi #ifndef UNUSED
164*53ee8cc1Swenshuai.xi #define UNUSED(x) ((x)=(x))
165*53ee8cc1Swenshuai.xi #endif
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi #define _MJPEG_Memcpy(pDstAddr, pSrcAddr, u32Size)               \
168*53ee8cc1Swenshuai.xi     do {                                                        \
169*53ee8cc1Swenshuai.xi         MS_U32 i = 0;                                           \
170*53ee8cc1Swenshuai.xi         volatile MS_U8 *dst = (volatile MS_U8 *)(pDstAddr);     \
171*53ee8cc1Swenshuai.xi         volatile MS_U8 *src = (volatile MS_U8 *)(pSrcAddr);     \
172*53ee8cc1Swenshuai.xi         for (i = 0; i < (u32Size); i++)                         \
173*53ee8cc1Swenshuai.xi         {                                                       \
174*53ee8cc1Swenshuai.xi             dst[i] = src[i];                                    \
175*53ee8cc1Swenshuai.xi         }                                                       \
176*53ee8cc1Swenshuai.xi     } while (0)
177*53ee8cc1Swenshuai.xi 
178*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
179*53ee8cc1Swenshuai.xi typedef enum
180*53ee8cc1Swenshuai.xi {
181*53ee8cc1Swenshuai.xi     E_MJPEG_BUF_AVAILABLE   = 0
182*53ee8cc1Swenshuai.xi   , E_MJPEG_BUF_USING     = 1
183*53ee8cc1Swenshuai.xi   , E_MJPEG_BUF_BUSY     = 2
184*53ee8cc1Swenshuai.xi } MJPEG_COLLECT_BUF_STATUS;
185*53ee8cc1Swenshuai.xi #endif
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi #if ENABLE_INC_BUILD
188*53ee8cc1Swenshuai.xi 
189*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
190*53ee8cc1Swenshuai.xi //  Global Variables
191*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
192*53ee8cc1Swenshuai.xi 
193*53ee8cc1Swenshuai.xi 
194*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
195*53ee8cc1Swenshuai.xi //  Local Variables
196*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
197*53ee8cc1Swenshuai.xi static MS_BOOL bEnableDispCmdQ[E_MJPEG_MJPEG_TOTAL];
198*53ee8cc1Swenshuai.xi 
199*53ee8cc1Swenshuai.xi //static MS_U32 __u32FwAddr = 0xFFFFFFFF;           // Address to load firmware
200*53ee8cc1Swenshuai.xi static MS_U32 __u32MRCBufAddr[E_MJPEG_MJPEG_TOTAL];
201*53ee8cc1Swenshuai.xi static MS_U32 __u32MWCBufAddr[E_MJPEG_MJPEG_TOTAL];
202*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
203*53ee8cc1Swenshuai.xi static MS_U32 __u32CollectBufAddr[E_MJPEG_MJPEG_TOTAL];
204*53ee8cc1Swenshuai.xi static MS_BOOL __bAsfMjpegMode[E_MJPEG_MJPEG_TOTAL];
205*53ee8cc1Swenshuai.xi static MS_BOOL __bAsfFirstFrame[E_MJPEG_MJPEG_TOTAL];
206*53ee8cc1Swenshuai.xi static MS_BOOL __bAsfFirstPacketInFrame[E_MJPEG_MJPEG_TOTAL];
207*53ee8cc1Swenshuai.xi static MS_U32 __u32CollectBufWptr[E_MJPEG_MJPEG_TOTAL];
208*53ee8cc1Swenshuai.xi static MS_U32 __u32PrevBufAddr[E_MJPEG_MJPEG_TOTAL];
209*53ee8cc1Swenshuai.xi static MJPEG_COLLECT_BUF_STATUS __eColBufStatus[E_MJPEG_MJPEG_TOTAL][2];
210*53ee8cc1Swenshuai.xi #endif
211*53ee8cc1Swenshuai.xi 
212*53ee8cc1Swenshuai.xi static MS_U32 __u32InternalBufAddr[E_MJPEG_MJPEG_TOTAL];
213*53ee8cc1Swenshuai.xi static MS_U32 __u32InternalBufSize[E_MJPEG_MJPEG_TOTAL];
214*53ee8cc1Swenshuai.xi 
215*53ee8cc1Swenshuai.xi static MS_U32 __u32ReadPtr[E_MJPEG_MJPEG_TOTAL];
216*53ee8cc1Swenshuai.xi static MS_U32 __u32WritePtr[E_MJPEG_MJPEG_TOTAL];
217*53ee8cc1Swenshuai.xi 
218*53ee8cc1Swenshuai.xi static MS_U32 __u32FrameCnt[E_MJPEG_MJPEG_TOTAL];
219*53ee8cc1Swenshuai.xi static MS_U32 __u32FrameTime[E_MJPEG_MJPEG_TOTAL];
220*53ee8cc1Swenshuai.xi static MS_U32 __u32FrameRate[E_MJPEG_MJPEG_TOTAL];
221*53ee8cc1Swenshuai.xi static MS_U32 __u32FrameRateBase[E_MJPEG_MJPEG_TOTAL];
222*53ee8cc1Swenshuai.xi 
223*53ee8cc1Swenshuai.xi static MS_U16 __u16Width[E_MJPEG_MJPEG_TOTAL];
224*53ee8cc1Swenshuai.xi static MS_U16 __u16Height[E_MJPEG_MJPEG_TOTAL];
225*53ee8cc1Swenshuai.xi static MS_U16 __u16Pitch[E_MJPEG_MJPEG_TOTAL];
226*53ee8cc1Swenshuai.xi 
227*53ee8cc1Swenshuai.xi static MS_U8 __u8FrameBuffTotalNum[E_MJPEG_MJPEG_TOTAL];
228*53ee8cc1Swenshuai.xi static MS_U32 __u32FrameBuffUnitSize[E_MJPEG_MJPEG_TOTAL];
229*53ee8cc1Swenshuai.xi 
230*53ee8cc1Swenshuai.xi static MS_BOOL __bIsFirstFrameRdy[E_MJPEG_MJPEG_TOTAL];
231*53ee8cc1Swenshuai.xi 
232*53ee8cc1Swenshuai.xi static MS_U16 PreVIdx[E_MJPEG_MJPEG_TOTAL];
233*53ee8cc1Swenshuai.xi static MS_U16 ReCheckTime[E_MJPEG_MJPEG_TOTAL];
234*53ee8cc1Swenshuai.xi 
235*53ee8cc1Swenshuai.xi static MS_BOOL __bIsDecodeDone[E_MJPEG_MJPEG_TOTAL];
236*53ee8cc1Swenshuai.xi static MS_U32 __u32DropFrameCnt[E_MJPEG_MJPEG_TOTAL];
237*53ee8cc1Swenshuai.xi static MS_U32 u32NextFrameBuffIdx[E_MJPEG_MJPEG_TOTAL];
238*53ee8cc1Swenshuai.xi static MS_U32 u32EndAddr[E_MJPEG_MJPEG_TOTAL];
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi // Speed Control
241*53ee8cc1Swenshuai.xi static MJPEG_SpeedType eCurSpeedType[E_MJPEG_MJPEG_TOTAL];
242*53ee8cc1Swenshuai.xi static MJPEG_DispSpeed eCurDispSpeed[E_MJPEG_MJPEG_TOTAL];
243*53ee8cc1Swenshuai.xi static MS_U32 __u32SpeedCtrlFrameCntBase[E_MJPEG_MJPEG_TOTAL];
244*53ee8cc1Swenshuai.xi 
245*53ee8cc1Swenshuai.xi static MS_U8 _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi 
248*53ee8cc1Swenshuai.xi MJPEG_FrameInfo infoDecFrame[E_MJPEG_MJPEG_TOTAL];
249*53ee8cc1Swenshuai.xi static MS_BOOL isDecFrameInfoValid[E_MJPEG_MJPEG_TOTAL];
250*53ee8cc1Swenshuai.xi static MS_BOOL bStepDec[E_MJPEG_MJPEG_TOTAL];
251*53ee8cc1Swenshuai.xi static MS_BOOL bLstFrame[E_MJPEG_MJPEG_TOTAL];
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi static MS_BOOL __bSkipToPts[E_MJPEG_MJPEG_TOTAL];
254*53ee8cc1Swenshuai.xi static MS_BOOL __bSeekToPts[E_MJPEG_MJPEG_TOTAL];
255*53ee8cc1Swenshuai.xi static MS_U32 __u32TargetPts[E_MJPEG_MJPEG_TOTAL];
256*53ee8cc1Swenshuai.xi static MS_U32 __u32Skip2PtsBase[E_MJPEG_MJPEG_TOTAL];
257*53ee8cc1Swenshuai.xi 
258*53ee8cc1Swenshuai.xi static MJPEG_ErrorCode eMJPEGErrCode[E_MJPEG_MJPEG_TOTAL];
259*53ee8cc1Swenshuai.xi 
260*53ee8cc1Swenshuai.xi static MS_U16 u16NullCnt[E_MJPEG_MJPEG_TOTAL];
261*53ee8cc1Swenshuai.xi 
262*53ee8cc1Swenshuai.xi #if SUPPORT_SKIP_ERROR_FRAME
263*53ee8cc1Swenshuai.xi static MS_U32 _u32SkipCnt[E_MJPEG_MJPEG_TOTAL];
264*53ee8cc1Swenshuai.xi static MS_U32 _u32ErrCnt[E_MJPEG_MJPEG_TOTAL];
265*53ee8cc1Swenshuai.xi static MS_U32 _u32StartDecodeTime[E_MJPEG_MJPEG_TOTAL];
266*53ee8cc1Swenshuai.xi #endif
267*53ee8cc1Swenshuai.xi 
268*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
269*53ee8cc1Swenshuai.xi //  Debug Functions
270*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
271*53ee8cc1Swenshuai.xi #ifndef ANDROID
272*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG(format, args...)          do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_MJPEG) printf(format, ##args);}while(0)
273*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG_API_MSG(format, args...)  do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_API) printf(format, ##args);}while(0)
274*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG_API_ERR(format, args...)  do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) printf(format, ##args);}while(0)
275*53ee8cc1Swenshuai.xi #else
276*53ee8cc1Swenshuai.xi #define LOG_TAG "API_JPEG"
277*53ee8cc1Swenshuai.xi #include <cutils/log.h>
278*53ee8cc1Swenshuai.xi #ifndef LOGD
279*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG(format, args...)          do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_MJPEG) ALOGI(format, ##args);}while(0)
280*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG_API_MSG(format, args...)  do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_API) ALOGI(format, ##args);}while(0)
281*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG_API_ERR(format, args...)  do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) ALOGE(format, ##args);}while(0)
282*53ee8cc1Swenshuai.xi #else
283*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG(format, args...)          do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_MJPEG) LOGI(format, ##args);}while(0)
284*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG_API_MSG(format, args...)  do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_API) LOGI(format, ##args);}while(0)
285*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG_API_ERR(format, args...)  do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) LOGE(format, ##args);}while(0)
286*53ee8cc1Swenshuai.xi #endif
287*53ee8cc1Swenshuai.xi 
288*53ee8cc1Swenshuai.xi #endif
289*53ee8cc1Swenshuai.xi 
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi 
292*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
293*53ee8cc1Swenshuai.xi //  Local Functions
294*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
295*53ee8cc1Swenshuai.xi 
_MApi_MJPEG_InitPara(MS_U32 u32Id)296*53ee8cc1Swenshuai.xi void _MApi_MJPEG_InitPara(MS_U32 u32Id)
297*53ee8cc1Swenshuai.xi {
298*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
299*53ee8cc1Swenshuai.xi     MJPEG_DEBUG("[MJPEG]_MApi_MJPEG_InitPara()!!!\n");
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi     bEnableDispCmdQ[u8DrvId] = TRUE;
302*53ee8cc1Swenshuai.xi 
303*53ee8cc1Swenshuai.xi     __u32MRCBufAddr[u8DrvId] = 0;
304*53ee8cc1Swenshuai.xi     __u32MWCBufAddr[u8DrvId] = 0;
305*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
306*53ee8cc1Swenshuai.xi     __u32CollectBufAddr[u8DrvId] = 0;
307*53ee8cc1Swenshuai.xi     __u32CollectBufWptr[u8DrvId] = 0;
308*53ee8cc1Swenshuai.xi     __u32PrevBufAddr[u8DrvId] = 0;
309*53ee8cc1Swenshuai.xi     __bAsfMjpegMode[u8DrvId] = 0;
310*53ee8cc1Swenshuai.xi     __bAsfFirstFrame[u8DrvId] = 0;
311*53ee8cc1Swenshuai.xi     __bAsfFirstPacketInFrame[u8DrvId] = 0;
312*53ee8cc1Swenshuai.xi     __eColBufStatus[u8DrvId][0] = E_MJPEG_BUF_AVAILABLE;
313*53ee8cc1Swenshuai.xi     __eColBufStatus[u8DrvId][1] = E_MJPEG_BUF_AVAILABLE;
314*53ee8cc1Swenshuai.xi #endif
315*53ee8cc1Swenshuai.xi 
316*53ee8cc1Swenshuai.xi     __u32InternalBufAddr[u8DrvId] = 0;
317*53ee8cc1Swenshuai.xi     __u32InternalBufSize[u8DrvId] = 0;
318*53ee8cc1Swenshuai.xi 
319*53ee8cc1Swenshuai.xi     __u32ReadPtr[u8DrvId] = 0;
320*53ee8cc1Swenshuai.xi     __u32WritePtr[u8DrvId] = 0;
321*53ee8cc1Swenshuai.xi 
322*53ee8cc1Swenshuai.xi     __u32FrameCnt[u8DrvId] = 0;
323*53ee8cc1Swenshuai.xi     __u32FrameTime[u8DrvId] = 0;
324*53ee8cc1Swenshuai.xi     __u32FrameRate[u8DrvId] = 600;
325*53ee8cc1Swenshuai.xi     __u32FrameRateBase[u8DrvId] = 20;
326*53ee8cc1Swenshuai.xi 
327*53ee8cc1Swenshuai.xi     __u16Width[u8DrvId] = 0;
328*53ee8cc1Swenshuai.xi     __u16Height[u8DrvId] = 0;
329*53ee8cc1Swenshuai.xi     __u16Pitch[u8DrvId] = 0;
330*53ee8cc1Swenshuai.xi 
331*53ee8cc1Swenshuai.xi     __u8FrameBuffTotalNum[u8DrvId] = 0;
332*53ee8cc1Swenshuai.xi     __u32FrameBuffUnitSize[u8DrvId] = 0;
333*53ee8cc1Swenshuai.xi 
334*53ee8cc1Swenshuai.xi     __bIsFirstFrameRdy[u8DrvId] = FALSE;
335*53ee8cc1Swenshuai.xi 
336*53ee8cc1Swenshuai.xi     PreVIdx[u8DrvId] = 0;
337*53ee8cc1Swenshuai.xi     ReCheckTime[u8DrvId] = 0;
338*53ee8cc1Swenshuai.xi 
339*53ee8cc1Swenshuai.xi     __bIsDecodeDone[u8DrvId] = FALSE;
340*53ee8cc1Swenshuai.xi     __u32DropFrameCnt[u8DrvId] = 0;
341*53ee8cc1Swenshuai.xi     u32NextFrameBuffIdx[u8DrvId] = 0;
342*53ee8cc1Swenshuai.xi     u32EndAddr[u8DrvId] = 0;
343*53ee8cc1Swenshuai.xi 
344*53ee8cc1Swenshuai.xi // Speed Control
345*53ee8cc1Swenshuai.xi     eCurSpeedType[u8DrvId] = E_MJPEG_SPEED_DEFAULT;
346*53ee8cc1Swenshuai.xi     eCurDispSpeed[u8DrvId] = E_MJPEG_DISP_SPEED_1X;
347*53ee8cc1Swenshuai.xi     __u32SpeedCtrlFrameCntBase[u8DrvId] = 0;
348*53ee8cc1Swenshuai.xi 
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi     isDecFrameInfoValid[u8DrvId] = FALSE;
351*53ee8cc1Swenshuai.xi     bStepDec[u8DrvId] = FALSE;
352*53ee8cc1Swenshuai.xi     bLstFrame[u8DrvId] = FALSE;
353*53ee8cc1Swenshuai.xi 
354*53ee8cc1Swenshuai.xi     __bSkipToPts[u8DrvId] = FALSE;
355*53ee8cc1Swenshuai.xi     __bSeekToPts[u8DrvId] = FALSE;
356*53ee8cc1Swenshuai.xi     __u32TargetPts[u8DrvId] = 0;
357*53ee8cc1Swenshuai.xi     __u32Skip2PtsBase[u8DrvId] = 0;
358*53ee8cc1Swenshuai.xi 
359*53ee8cc1Swenshuai.xi     u16NullCnt[u8DrvId] = 0;
360*53ee8cc1Swenshuai.xi 
361*53ee8cc1Swenshuai.xi #if SUPPORT_SKIP_ERROR_FRAME
362*53ee8cc1Swenshuai.xi     _u32SkipCnt[u8DrvId] = 0;
363*53ee8cc1Swenshuai.xi     _u32ErrCnt[u8DrvId] = 0;
364*53ee8cc1Swenshuai.xi     _u32StartDecodeTime[u8DrvId] = 0;
365*53ee8cc1Swenshuai.xi #endif
366*53ee8cc1Swenshuai.xi 
367*53ee8cc1Swenshuai.xi 
368*53ee8cc1Swenshuai.xi }
369*53ee8cc1Swenshuai.xi 
_MApi_MJPEG_SetErrCode(MS_U32 u32Id,MJPEG_ErrorCode eErrorCode)370*53ee8cc1Swenshuai.xi void _MApi_MJPEG_SetErrCode(MS_U32 u32Id, MJPEG_ErrorCode eErrorCode)
371*53ee8cc1Swenshuai.xi {
372*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
373*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("_MApi_MJPEG_SetErrCode() with eMJPEGErrCode=0x%x\n", eErrorCode);
374*53ee8cc1Swenshuai.xi     eMJPEGErrCode[u8DrvId] = eErrorCode;
375*53ee8cc1Swenshuai.xi }
376*53ee8cc1Swenshuai.xi 
377*53ee8cc1Swenshuai.xi /******************************************************************************/
378*53ee8cc1Swenshuai.xi ///Check if JPEG decode done
379*53ee8cc1Swenshuai.xi ///@return status
380*53ee8cc1Swenshuai.xi /******************************************************************************/
__MApi_MJPEG_CheckDecodeDone(MS_U32 u32Id)381*53ee8cc1Swenshuai.xi static MJPEG_Result __MApi_MJPEG_CheckDecodeDone(MS_U32 u32Id)
382*53ee8cc1Swenshuai.xi {
383*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi 
386*53ee8cc1Swenshuai.xi     if (__bIsFirstFrameRdy[u8DrvId])
387*53ee8cc1Swenshuai.xi     {
388*53ee8cc1Swenshuai.xi         JPEG_Event reg_val = MApi_JPEG_GetJPDEventFlag();
389*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("        EventFlag = %d\n", reg_val);
390*53ee8cc1Swenshuai.xi 
391*53ee8cc1Swenshuai.xi         if(MApi_JPEG_IsNJPD()==FALSE)
392*53ee8cc1Swenshuai.xi         {
393*53ee8cc1Swenshuai.xi             MS_U16 cur_vidx = 0;
394*53ee8cc1Swenshuai.xi             //For H/W bug, some cases can not exit after decode done. Check Vidx to exit.
395*53ee8cc1Swenshuai.xi             if(PreVIdx[u8DrvId] != (cur_vidx = MApi_JPEG_GetCurVidx()))
396*53ee8cc1Swenshuai.xi             {
397*53ee8cc1Swenshuai.xi                 PreVIdx[u8DrvId] = cur_vidx;
398*53ee8cc1Swenshuai.xi                 ReCheckTime[u8DrvId] = 0;
399*53ee8cc1Swenshuai.xi             }
400*53ee8cc1Swenshuai.xi             else
401*53ee8cc1Swenshuai.xi             {
402*53ee8cc1Swenshuai.xi                 ReCheckTime[u8DrvId]++;
403*53ee8cc1Swenshuai.xi                 if(ReCheckTime[u8DrvId] >= 1000)
404*53ee8cc1Swenshuai.xi                 {
405*53ee8cc1Swenshuai.xi                     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID, u32NextFrameBuffIdx[u8DrvId]);
406*53ee8cc1Swenshuai.xi                     MJPEG_DEBUG_API_MSG("Set frame buffer index %ld as Valid", u32NextFrameBuffIdx[u8DrvId]);
407*53ee8cc1Swenshuai.xi                     __bIsDecodeDone[u8DrvId] = TRUE;
408*53ee8cc1Swenshuai.xi                     __u32DropFrameCnt[u8DrvId]++;
409*53ee8cc1Swenshuai.xi 
410*53ee8cc1Swenshuai.xi                     MJPEG_DEBUG_API_ERR("Decode timeout!!!!\n");
411*53ee8cc1Swenshuai.xi                     reg_val = E_JPEG_EVENT_DEC_ERROR_MASK;
412*53ee8cc1Swenshuai.xi                     return E_MJPEG_RET_FAIL;
413*53ee8cc1Swenshuai.xi                 }
414*53ee8cc1Swenshuai.xi             }
415*53ee8cc1Swenshuai.xi         }
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi         if(E_JPEG_EVENT_DEC_DONE & reg_val)
418*53ee8cc1Swenshuai.xi         {
419*53ee8cc1Swenshuai.xi             ReCheckTime[u8DrvId] = 0;
420*53ee8cc1Swenshuai.xi 
421*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("        Decode Done -- ");
422*53ee8cc1Swenshuai.xi #if ENABLE_MJPEG_FIRMWARE
423*53ee8cc1Swenshuai.xi             if (__bIsDecodeDone[u8DrvId] == FALSE)
424*53ee8cc1Swenshuai.xi             {
425*53ee8cc1Swenshuai.xi                 if (__u32DropFrameCnt[u8DrvId] != 0)
426*53ee8cc1Swenshuai.xi                 {
427*53ee8cc1Swenshuai.xi                     // Ask firmware to compensate PTS
428*53ee8cc1Swenshuai.xi                     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_COMPENSATE_PTS, __u32DropFrameCnt[u8DrvId]);
429*53ee8cc1Swenshuai.xi                     MJPEG_DEBUG_API_MSG("Compensate PTS for %ld dropped frames", __u32DropFrameCnt[u8DrvId]);
430*53ee8cc1Swenshuai.xi                 }
431*53ee8cc1Swenshuai.xi                 __u32DropFrameCnt[u8DrvId] = 0;
432*53ee8cc1Swenshuai.xi 
433*53ee8cc1Swenshuai.xi                 MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_BUFF_IDX_READY, u32NextFrameBuffIdx[u8DrvId]);
434*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG("[MJPEG]Frame Buffer Index %ld", u32NextFrameBuffIdx[u8DrvId]);
435*53ee8cc1Swenshuai.xi                 __bIsDecodeDone[u8DrvId] = TRUE;
436*53ee8cc1Swenshuai.xi             }
437*53ee8cc1Swenshuai.xi #endif
438*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("\n");
439*53ee8cc1Swenshuai.xi             //__u32FrameCnt++;
440*53ee8cc1Swenshuai.xi             //__u32ReadPtr = u32EndAddr;
441*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Count %ld\n", __u32FrameCnt[u8DrvId]);
442*53ee8cc1Swenshuai.xi         }
443*53ee8cc1Swenshuai.xi         else
444*53ee8cc1Swenshuai.xi         if(E_JPEG_EVENT_DEC_ERROR_MASK & reg_val)
445*53ee8cc1Swenshuai.xi         {
446*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("   JPD Decode Error\n");
447*53ee8cc1Swenshuai.xi             //MApi_MJPEG_Debug();
448*53ee8cc1Swenshuai.xi 
449*53ee8cc1Swenshuai.xi             MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID, u32NextFrameBuffIdx[u8DrvId]);
450*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Set frame buffer index %ld as Valid", u32NextFrameBuffIdx[u8DrvId]);
451*53ee8cc1Swenshuai.xi             __bIsDecodeDone[u8DrvId] = TRUE;
452*53ee8cc1Swenshuai.xi             __u32DropFrameCnt[u8DrvId]++;
453*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODE_ERROR;
454*53ee8cc1Swenshuai.xi         }
455*53ee8cc1Swenshuai.xi         else
456*53ee8cc1Swenshuai.xi         {
457*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("   Still decoding previous JPEG ......\n");
458*53ee8cc1Swenshuai.xi #if SUPPORT_SKIP_ERROR_FRAME
459*53ee8cc1Swenshuai.xi             if(MsOS_GetSystemTime() - _u32StartDecodeTime[u8DrvId] > SKIP_ERROR_FRAME_THRESHOLD)
460*53ee8cc1Swenshuai.xi             {
461*53ee8cc1Swenshuai.xi                MJPEG_DEBUG_API_ERR("%s: JPEG decode frame timeout!!!!!!!!!!\n", __FUNCTION__);
462*53ee8cc1Swenshuai.xi                 _u32SkipCnt[u8DrvId]++;
463*53ee8cc1Swenshuai.xi                 _u32ErrCnt[u8DrvId]++;
464*53ee8cc1Swenshuai.xi                 // Repeat next frame because previous frame decode timeout
465*53ee8cc1Swenshuai.xi                 //MApi_MJPEG_Debug();
466*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("%s: Reset JPD!!!!!!!!!!\n", __FUNCTION__);
467*53ee8cc1Swenshuai.xi                 MApi_JPEG_Rst();
468*53ee8cc1Swenshuai.xi                 MApi_JPEG_Exit();
469*53ee8cc1Swenshuai.xi                 return E_MJPEG_RET_DECODE_ERROR;
470*53ee8cc1Swenshuai.xi             }
471*53ee8cc1Swenshuai.xi #endif
472*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODING;
473*53ee8cc1Swenshuai.xi         }
474*53ee8cc1Swenshuai.xi     }
475*53ee8cc1Swenshuai.xi     else
476*53ee8cc1Swenshuai.xi     {
477*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
478*53ee8cc1Swenshuai.xi     }
479*53ee8cc1Swenshuai.xi 
480*53ee8cc1Swenshuai.xi 
481*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
482*53ee8cc1Swenshuai.xi }
483*53ee8cc1Swenshuai.xi 
484*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
485*53ee8cc1Swenshuai.xi 
_MApi_MJPEG_ASFParameterSetting(MS_U32 u32Id,MJPEG_Packet_Info * pInfo)486*53ee8cc1Swenshuai.xi static void _MApi_MJPEG_ASFParameterSetting(MS_U32 u32Id, MJPEG_Packet_Info *pInfo)
487*53ee8cc1Swenshuai.xi {
488*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
489*53ee8cc1Swenshuai.xi     if(__bAsfMjpegMode[u8DrvId]==FALSE)
490*53ee8cc1Swenshuai.xi     {
491*53ee8cc1Swenshuai.xi         if(pInfo->u32StAddr & VDEC_EX_MVD_PIC_START_FLAG)
492*53ee8cc1Swenshuai.xi         {
493*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("[ASF_MJPEG]Set to ASF-MJPEG mode!!!!!!!!!!!!!!!!\n");
494*53ee8cc1Swenshuai.xi             __bAsfMjpegMode[u8DrvId] = TRUE;
495*53ee8cc1Swenshuai.xi             __bAsfFirstFrame[u8DrvId] = TRUE;
496*53ee8cc1Swenshuai.xi             __bAsfFirstPacketInFrame[u8DrvId] = TRUE;
497*53ee8cc1Swenshuai.xi         }
498*53ee8cc1Swenshuai.xi     }
499*53ee8cc1Swenshuai.xi     else
500*53ee8cc1Swenshuai.xi     {
501*53ee8cc1Swenshuai.xi         __bAsfFirstFrame[u8DrvId] = FALSE;
502*53ee8cc1Swenshuai.xi 
503*53ee8cc1Swenshuai.xi         if(pInfo->u32StAddr & VDEC_EX_MVD_PIC_START_FLAG)
504*53ee8cc1Swenshuai.xi         {
505*53ee8cc1Swenshuai.xi             __bAsfFirstPacketInFrame[u8DrvId] = TRUE;
506*53ee8cc1Swenshuai.xi         }
507*53ee8cc1Swenshuai.xi         else
508*53ee8cc1Swenshuai.xi         {
509*53ee8cc1Swenshuai.xi             __bAsfFirstPacketInFrame[u8DrvId] = FALSE;
510*53ee8cc1Swenshuai.xi         }
511*53ee8cc1Swenshuai.xi     }
512*53ee8cc1Swenshuai.xi }
513*53ee8cc1Swenshuai.xi 
_MApi_MJPEG_IsColWPtrInLow(MS_U8 u8DrvId)514*53ee8cc1Swenshuai.xi static MS_BOOL _MApi_MJPEG_IsColWPtrInLow(MS_U8 u8DrvId)
515*53ee8cc1Swenshuai.xi {
516*53ee8cc1Swenshuai.xi     if(__u32CollectBufWptr[u8DrvId] >= __u32CollectBufAddr[u8DrvId] + MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE/2)
517*53ee8cc1Swenshuai.xi         return FALSE;
518*53ee8cc1Swenshuai.xi     else
519*53ee8cc1Swenshuai.xi         return TRUE;
520*53ee8cc1Swenshuai.xi }
521*53ee8cc1Swenshuai.xi 
_MApi_MJPEG_IsAbleToPushNextFrame(MS_U8 u32Id)522*53ee8cc1Swenshuai.xi static MS_BOOL _MApi_MJPEG_IsAbleToPushNextFrame(MS_U8 u32Id)
523*53ee8cc1Swenshuai.xi {
524*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
525*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("is able to push?.....%x, %x, %lx, %lx, %lx\n", __eColBufStatus[u8DrvId][0], __eColBufStatus[u8DrvId][1],
526*53ee8cc1Swenshuai.xi         __u32CollectBufWptr[u8DrvId],__u32CollectBufAddr[u8DrvId],
527*53ee8cc1Swenshuai.xi         __u32CollectBufAddr[u8DrvId] + MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE/2);
528*53ee8cc1Swenshuai.xi     if(__MApi_MJPEG_CheckDecodeDone(u32Id) != E_MJPEG_RET_DECODING)
529*53ee8cc1Swenshuai.xi     {
530*53ee8cc1Swenshuai.xi         if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId) ==TRUE
531*53ee8cc1Swenshuai.xi             && __eColBufStatus[u8DrvId][1]==E_MJPEG_BUF_BUSY)
532*53ee8cc1Swenshuai.xi         {
533*53ee8cc1Swenshuai.xi             __eColBufStatus[u8DrvId][1] = E_MJPEG_BUF_AVAILABLE;
534*53ee8cc1Swenshuai.xi         }
535*53ee8cc1Swenshuai.xi         else if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId)==FALSE
536*53ee8cc1Swenshuai.xi             && __eColBufStatus[u8DrvId][0]==E_MJPEG_BUF_BUSY)
537*53ee8cc1Swenshuai.xi         {
538*53ee8cc1Swenshuai.xi             __eColBufStatus[u8DrvId][0] = E_MJPEG_BUF_AVAILABLE;
539*53ee8cc1Swenshuai.xi         }
540*53ee8cc1Swenshuai.xi     }
541*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("is able to push?.....[%x, %x]\n", __eColBufStatus[u8DrvId][0], __eColBufStatus[u8DrvId][1]);
542*53ee8cc1Swenshuai.xi 
543*53ee8cc1Swenshuai.xi     if(__eColBufStatus[u8DrvId][0] != E_MJPEG_BUF_AVAILABLE
544*53ee8cc1Swenshuai.xi         && __eColBufStatus[u8DrvId][1] != E_MJPEG_BUF_AVAILABLE)
545*53ee8cc1Swenshuai.xi         return FALSE;
546*53ee8cc1Swenshuai.xi     else
547*53ee8cc1Swenshuai.xi         return TRUE;
548*53ee8cc1Swenshuai.xi }
549*53ee8cc1Swenshuai.xi 
_MApi_MJPEG_PushToLowBuffer(MS_U8 u32Id,MS_U32 u32SrcAddrVA,MS_U32 u32Size)550*53ee8cc1Swenshuai.xi static void _MApi_MJPEG_PushToLowBuffer(MS_U8 u32Id, MS_U32 u32SrcAddrVA, MS_U32 u32Size)
551*53ee8cc1Swenshuai.xi {
552*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
553*53ee8cc1Swenshuai.xi     if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId) == FALSE)
554*53ee8cc1Swenshuai.xi     {
555*53ee8cc1Swenshuai.xi         __u32PrevBufAddr[u8DrvId] = __u32CollectBufWptr[u8DrvId];
556*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("[ASF_MJPEG]_MApi_MJPEG_PushToLowBuffer...............start\n");
557*53ee8cc1Swenshuai.xi         // Step 1: reset write ptr to start of low buffer
558*53ee8cc1Swenshuai.xi         __u32CollectBufWptr[u8DrvId] = __u32CollectBufAddr[u8DrvId];
559*53ee8cc1Swenshuai.xi         // Step 2: memcpy
560*53ee8cc1Swenshuai.xi         JPEG_memcpy((void *)MsOS_PA2KSEG1(__u32CollectBufWptr[u8DrvId]), (void *)u32SrcAddrVA, u32Size);
561*53ee8cc1Swenshuai.xi         // Step 3: update write ptr address
562*53ee8cc1Swenshuai.xi         __u32CollectBufWptr[u8DrvId] = __u32CollectBufWptr[u8DrvId] + u32Size;
563*53ee8cc1Swenshuai.xi     }
564*53ee8cc1Swenshuai.xi     else
565*53ee8cc1Swenshuai.xi     {
566*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("[ASF_MJPEG]_MApi_MJPEG_PushToLowBuffer...............middle\n");
567*53ee8cc1Swenshuai.xi         JPEG_memcpy((void *)MsOS_PA2KSEG1(__u32CollectBufWptr[u8DrvId]), (void *)u32SrcAddrVA, u32Size);
568*53ee8cc1Swenshuai.xi         __u32CollectBufWptr[u8DrvId] = __u32CollectBufWptr[u8DrvId] + u32Size;
569*53ee8cc1Swenshuai.xi     }
570*53ee8cc1Swenshuai.xi }
571*53ee8cc1Swenshuai.xi 
_MApi_MJPEG_PushToHighBuffer(MS_U8 u32Id,MS_U32 u32SrcAddrVA,MS_U32 u32Size)572*53ee8cc1Swenshuai.xi static void _MApi_MJPEG_PushToHighBuffer(MS_U8 u32Id, MS_U32 u32SrcAddrVA, MS_U32 u32Size)
573*53ee8cc1Swenshuai.xi {
574*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
575*53ee8cc1Swenshuai.xi     if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId) == TRUE)
576*53ee8cc1Swenshuai.xi     {
577*53ee8cc1Swenshuai.xi         __u32PrevBufAddr[u8DrvId] = __u32CollectBufWptr[u8DrvId];
578*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("[ASF_MJPEG]_MApi_MJPEG_PushToHighBuffer...............start\n");
579*53ee8cc1Swenshuai.xi         // Step 1: reset write ptr to start of low buffer
580*53ee8cc1Swenshuai.xi         __u32CollectBufWptr[u8DrvId] = __u32CollectBufAddr[u8DrvId]+MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE/2;
581*53ee8cc1Swenshuai.xi         // Step 2: memcpy
582*53ee8cc1Swenshuai.xi         JPEG_memcpy((void *)MsOS_PA2KSEG1(__u32CollectBufWptr[u8DrvId]), (void *)u32SrcAddrVA, u32Size);
583*53ee8cc1Swenshuai.xi         // Step 3: update write ptr address
584*53ee8cc1Swenshuai.xi         __u32CollectBufWptr[u8DrvId] = __u32CollectBufWptr[u8DrvId] + u32Size;
585*53ee8cc1Swenshuai.xi     }
586*53ee8cc1Swenshuai.xi     else
587*53ee8cc1Swenshuai.xi     {
588*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("[ASF_MJPEG]_MApi_MJPEG_PushToHighBuffer...............middle\n");
589*53ee8cc1Swenshuai.xi         JPEG_memcpy((void *)MsOS_PA2KSEG1(__u32CollectBufWptr[u8DrvId]), (void *)u32SrcAddrVA, u32Size);
590*53ee8cc1Swenshuai.xi         __u32CollectBufWptr[u8DrvId] = __u32CollectBufWptr[u8DrvId] + u32Size;
591*53ee8cc1Swenshuai.xi     }
592*53ee8cc1Swenshuai.xi 
593*53ee8cc1Swenshuai.xi }
594*53ee8cc1Swenshuai.xi 
_MApi_MJPEG_ASFBufferManagement(MS_U32 u32Id,MJPEG_Packet_Info * pInfo)595*53ee8cc1Swenshuai.xi static MS_BOOL _MApi_MJPEG_ASFBufferManagement(MS_U32 u32Id, MJPEG_Packet_Info *pInfo)
596*53ee8cc1Swenshuai.xi {
597*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
598*53ee8cc1Swenshuai.xi     MS_BOOL _bDecodeInThisPush = FALSE;
599*53ee8cc1Swenshuai.xi     MS_U32 u32SrcAddrVA = MsOS_PA2KSEG1(pInfo->u32StAddr + __u32MRCBufAddr[u8DrvId]);
600*53ee8cc1Swenshuai.xi 
601*53ee8cc1Swenshuai.xi     if(__bAsfFirstPacketInFrame[u8DrvId])
602*53ee8cc1Swenshuai.xi     {
603*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("[ASF_MJPEG]detected first packet in frame!!!!!!!!!!!!!!!!\n");
604*53ee8cc1Swenshuai.xi         if(__bAsfFirstFrame[u8DrvId]==FALSE)
605*53ee8cc1Swenshuai.xi         {
606*53ee8cc1Swenshuai.xi             if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId)
607*53ee8cc1Swenshuai.xi                 && __eColBufStatus[u8DrvId][0]==E_MJPEG_BUF_USING)
608*53ee8cc1Swenshuai.xi             {
609*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("[ASF_MJPEG]Push previous frame(L) to JPD!!!!!!!!!!!!!!!!\n");
610*53ee8cc1Swenshuai.xi                 __eColBufStatus[u8DrvId][0] = E_MJPEG_BUF_BUSY;
611*53ee8cc1Swenshuai.xi                 MsOS_FlushMemory();
612*53ee8cc1Swenshuai.xi                 _bDecodeInThisPush = TRUE;
613*53ee8cc1Swenshuai.xi             }
614*53ee8cc1Swenshuai.xi             else if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId)==FALSE
615*53ee8cc1Swenshuai.xi                 && __eColBufStatus[u8DrvId][1]==E_MJPEG_BUF_USING)
616*53ee8cc1Swenshuai.xi             {
617*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("[ASF_MJPEG]Push previous frame(H) to JPD!!!!!!!!!!!!!!!!\n");
618*53ee8cc1Swenshuai.xi                 __eColBufStatus[u8DrvId][1] = E_MJPEG_BUF_BUSY;
619*53ee8cc1Swenshuai.xi                 MsOS_FlushMemory();
620*53ee8cc1Swenshuai.xi                 _bDecodeInThisPush = TRUE;
621*53ee8cc1Swenshuai.xi             }
622*53ee8cc1Swenshuai.xi         }
623*53ee8cc1Swenshuai.xi 
624*53ee8cc1Swenshuai.xi         if(_MApi_MJPEG_IsAbleToPushNextFrame(u32Id))
625*53ee8cc1Swenshuai.xi         {
626*53ee8cc1Swenshuai.xi             if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId)
627*53ee8cc1Swenshuai.xi                 && __eColBufStatus[u8DrvId][1] == E_MJPEG_BUF_AVAILABLE)
628*53ee8cc1Swenshuai.xi             {
629*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("[ASF_MJPEG]First packet in frame(H)!!!!!!!!!!!!!!!!\n");
630*53ee8cc1Swenshuai.xi                 _MApi_MJPEG_PushToHighBuffer(u32Id, u32SrcAddrVA, pInfo->u32Size);
631*53ee8cc1Swenshuai.xi                 __eColBufStatus[u8DrvId][1] = E_MJPEG_BUF_USING;
632*53ee8cc1Swenshuai.xi             }
633*53ee8cc1Swenshuai.xi             else if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId)==FALSE
634*53ee8cc1Swenshuai.xi                 && __eColBufStatus[u8DrvId][0]==E_MJPEG_BUF_AVAILABLE)
635*53ee8cc1Swenshuai.xi             {
636*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("[ASF_MJPEG]First packet in frame(L)!!!!!!!!!!!!!!!!\n");
637*53ee8cc1Swenshuai.xi                 _MApi_MJPEG_PushToLowBuffer(u32Id, u32SrcAddrVA, pInfo->u32Size);
638*53ee8cc1Swenshuai.xi                 __eColBufStatus[u8DrvId][0] = E_MJPEG_BUF_USING;
639*53ee8cc1Swenshuai.xi             }
640*53ee8cc1Swenshuai.xi         }
641*53ee8cc1Swenshuai.xi     }
642*53ee8cc1Swenshuai.xi     else
643*53ee8cc1Swenshuai.xi     {
644*53ee8cc1Swenshuai.xi         if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId)
645*53ee8cc1Swenshuai.xi             && __eColBufStatus[u8DrvId][0] == E_MJPEG_BUF_USING)
646*53ee8cc1Swenshuai.xi         {
647*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("[ASF_MJPEG]middle packet in frame(L)!!!!!!!!!!!!!!!!\n");
648*53ee8cc1Swenshuai.xi             _MApi_MJPEG_PushToLowBuffer(u32Id, u32SrcAddrVA, pInfo->u32Size);
649*53ee8cc1Swenshuai.xi         }
650*53ee8cc1Swenshuai.xi         else if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId)==FALSE
651*53ee8cc1Swenshuai.xi             && __eColBufStatus[u8DrvId][1] == E_MJPEG_BUF_USING)
652*53ee8cc1Swenshuai.xi         {
653*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("[ASF_MJPEG]middle packet in frame(H)!!!!!!!!!!!!!!!!\n");
654*53ee8cc1Swenshuai.xi             _MApi_MJPEG_PushToHighBuffer(u32Id, u32SrcAddrVA, pInfo->u32Size);
655*53ee8cc1Swenshuai.xi         }
656*53ee8cc1Swenshuai.xi     }
657*53ee8cc1Swenshuai.xi     return _bDecodeInThisPush;
658*53ee8cc1Swenshuai.xi }
659*53ee8cc1Swenshuai.xi #endif
660*53ee8cc1Swenshuai.xi 
661*53ee8cc1Swenshuai.xi 
662*53ee8cc1Swenshuai.xi #if 0//SUPPORT_SKIP_ERROR_FRAME
663*53ee8cc1Swenshuai.xi static MS_BOOL _MApi_MJPEG_IsDecodeTimeout(MS_U32 u32Id)
664*53ee8cc1Swenshuai.xi {
665*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
666*53ee8cc1Swenshuai.xi     if(_u32StartDecodeTime[u8DrvId] ==0)
667*53ee8cc1Swenshuai.xi     {
668*53ee8cc1Swenshuai.xi         return FALSE;
669*53ee8cc1Swenshuai.xi     }
670*53ee8cc1Swenshuai.xi     if(MsOS_GetSystemTime() - _u32StartDecodeTime[u8DrvId] > SKIP_ERROR_FRAME_THRESHOLD)
671*53ee8cc1Swenshuai.xi     {
672*53ee8cc1Swenshuai.xi         if(E_MJPEG_RET_DECODING == __MApi_MJPEG_CheckDecodeDone(u32Id))
673*53ee8cc1Swenshuai.xi         {
674*53ee8cc1Swenshuai.xi             return TRUE;
675*53ee8cc1Swenshuai.xi         }
676*53ee8cc1Swenshuai.xi         else
677*53ee8cc1Swenshuai.xi         {
678*53ee8cc1Swenshuai.xi             return FALSE;
679*53ee8cc1Swenshuai.xi         }
680*53ee8cc1Swenshuai.xi     }
681*53ee8cc1Swenshuai.xi     return FALSE;
682*53ee8cc1Swenshuai.xi }
683*53ee8cc1Swenshuai.xi #endif
684*53ee8cc1Swenshuai.xi 
_MApi_MJPEG_DropFrameWhenFF(MS_U8 u32Id)685*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MJPEG_DropFrameWhenFF(MS_U8 u32Id)
686*53ee8cc1Swenshuai.xi {
687*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
688*53ee8cc1Swenshuai.xi     {
689*53ee8cc1Swenshuai.xi         MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
690*53ee8cc1Swenshuai.xi 
691*53ee8cc1Swenshuai.xi         if(MApi_JPEG_GetWidth()<=MJPEG_SD_WIDTH && MApi_JPEG_GetHeight()<=MJPEG_SD_HEIGHT)
692*53ee8cc1Swenshuai.xi         {
693*53ee8cc1Swenshuai.xi             return FALSE;
694*53ee8cc1Swenshuai.xi         }
695*53ee8cc1Swenshuai.xi         else if(MApi_JPEG_GetWidth()<=MJPEG_HD_800x600_WIDTH && MApi_JPEG_GetHeight()<=MJPEG_HD_800x600_HEIGHT
696*53ee8cc1Swenshuai.xi             && __u32FrameRate[u8DrvId] <= MAX_SUPPORTED_FRAME_RATE_720P)
697*53ee8cc1Swenshuai.xi         {
698*53ee8cc1Swenshuai.xi             return FALSE;
699*53ee8cc1Swenshuai.xi         }
700*53ee8cc1Swenshuai.xi         else if(MApi_JPEG_GetWidth()<=MJPEG_MAX_SUPPORT_WIDTH && MApi_JPEG_GetHeight()<=MJPEG_MAX_SUPPORT_HEIGHT
701*53ee8cc1Swenshuai.xi             && __u32FrameRate[u8DrvId] <= (MAX_SUPPORTED_FRAME_RATE_720P/2))
702*53ee8cc1Swenshuai.xi         {
703*53ee8cc1Swenshuai.xi             return FALSE;
704*53ee8cc1Swenshuai.xi         }
705*53ee8cc1Swenshuai.xi         return TRUE;
706*53ee8cc1Swenshuai.xi     }
707*53ee8cc1Swenshuai.xi     else
708*53ee8cc1Swenshuai.xi     {
709*53ee8cc1Swenshuai.xi         return FALSE;
710*53ee8cc1Swenshuai.xi     }
711*53ee8cc1Swenshuai.xi }
712*53ee8cc1Swenshuai.xi 
713*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
714*53ee8cc1Swenshuai.xi //  Global Functions
715*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
716*53ee8cc1Swenshuai.xi 
717*53ee8cc1Swenshuai.xi /******************************************************************************/
718*53ee8cc1Swenshuai.xi ///Called only when video start
719*53ee8cc1Swenshuai.xi ///@param pInitParam \b IN initial paramters
720*53ee8cc1Swenshuai.xi ///@param pStream \b IN file system realted function pointers
721*53ee8cc1Swenshuai.xi ///@return true or false
722*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_Init(MS_U32 u32Id,MJPEG_INIT_PARAM * pInitParam)723*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Init(MS_U32 u32Id, MJPEG_INIT_PARAM *pInitParam)//, PJPEG_FILE_FileSystem_t pStream)
724*53ee8cc1Swenshuai.xi {
725*53ee8cc1Swenshuai.xi     JPEG_InitParam jpegInitParam;
726*53ee8cc1Swenshuai.xi 
727*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
728*53ee8cc1Swenshuai.xi 
729*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
730*53ee8cc1Swenshuai.xi     {
731*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
732*53ee8cc1Swenshuai.xi     }
733*53ee8cc1Swenshuai.xi     _MApi_MJPEG_InitPara(u32Id);
734*53ee8cc1Swenshuai.xi #if 0
735*53ee8cc1Swenshuai.xi     // For register read/write
736*53ee8cc1Swenshuai.xi     extern MS_U32 u32MJPEGRiuBaseAdd;
737*53ee8cc1Swenshuai.xi     MS_U32 u32NonPMBankSize = 0;
738*53ee8cc1Swenshuai.xi     if(FALSE == MDrv_MMIO_GetBASE( &u32MJPEGRiuBaseAdd, &u32NonPMBankSize, MS_MODULE_JPD))
739*53ee8cc1Swenshuai.xi     {
740*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_ERR("MDrv_MMIO_GetBASE FAILED !! \n");
741*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
742*53ee8cc1Swenshuai.xi     }
743*53ee8cc1Swenshuai.xi     else
744*53ee8cc1Swenshuai.xi     {
745*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("DRVreg base = 0x%lX, length = %lu\n", u32MJPEGRiuBaseAdd, u32NonPMBankSize);
746*53ee8cc1Swenshuai.xi         MDrv_MJPEG_InitRegBase(u32MJPEGRiuBaseAdd);
747*53ee8cc1Swenshuai.xi     }
748*53ee8cc1Swenshuai.xi #endif
749*53ee8cc1Swenshuai.xi 
750*53ee8cc1Swenshuai.xi #if ENABLE_MJPEG_FIRMWARE
751*53ee8cc1Swenshuai.xi     // Init Firmware
752*53ee8cc1Swenshuai.xi     if(E_MJPEG_OK != MDrv_MJPEG_InitFw(u32Id, pInitParam->u32FwSize, pInitParam->u32FwAddr, pInitParam->u32FwBinSize, pInitParam->u32FwBinAddr, pInitParam->eFwSrcType))
753*53ee8cc1Swenshuai.xi     {
754*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_ERR("MDrv_MJPEG_InitFw Failed~~~~\n");
755*53ee8cc1Swenshuai.xi     }
756*53ee8cc1Swenshuai.xi     //__u32FwAddr = pInitParam->u32FwAddr;
757*53ee8cc1Swenshuai.xi     isDecFrameInfoValid[u8DrvId] = FALSE;
758*53ee8cc1Swenshuai.xi     bStepDec[u8DrvId] = FALSE;
759*53ee8cc1Swenshuai.xi 
760*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("clear error code due to call MApi_MJPEG_Init()\n");
761*53ee8cc1Swenshuai.xi     _MApi_MJPEG_SetErrCode(u32Id, E_MJPEG_ERROR_CODE_NONE);
762*53ee8cc1Swenshuai.xi     // Check if firmware is ready or not
763*53ee8cc1Swenshuai.xi     if (MDrv_MJPEG_IsFirmwareReady() == FALSE)
764*53ee8cc1Swenshuai.xi     {
765*53ee8cc1Swenshuai.xi         MDrv_MJPEG_DeInit(u32Id);
766*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
767*53ee8cc1Swenshuai.xi     }
768*53ee8cc1Swenshuai.xi     if((pInitParam->u32MWCBufAddr)%8)
769*53ee8cc1Swenshuai.xi     {
770*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("u32MWCBufAddr need 8 byte alignment~~~~0x%lx\n", pInitParam->u32MWCBufAddr);
771*53ee8cc1Swenshuai.xi     }
772*53ee8cc1Swenshuai.xi     else
773*53ee8cc1Swenshuai.xi     {
774*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("u32MWCBufAddr don't need 8 byte alignment~~~~0x%lx\n", pInitParam->u32MWCBufAddr);
775*53ee8cc1Swenshuai.xi     }
776*53ee8cc1Swenshuai.xi 
777*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_BUFF_START_ADDR, pInitParam->u32MWCBufAddr);
778*53ee8cc1Swenshuai.xi 
779*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
780*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
781*53ee8cc1Swenshuai.xi     {
782*53ee8cc1Swenshuai.xi         if((pInitParam->u32MWCBufSize-MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE)
783*53ee8cc1Swenshuai.xi             >= MJPEG_MAX_SUPPORT_WIDTH*MJPEG_MAX_SUPPORT_HEIGHT*DISPLAY_QUEUE_NUM)
784*53ee8cc1Swenshuai.xi         {
785*53ee8cc1Swenshuai.xi             __u8FrameBuffTotalNum[u8DrvId] = DISPLAY_QUEUE_NUM;
786*53ee8cc1Swenshuai.xi         }
787*53ee8cc1Swenshuai.xi         else if((pInitParam->u32MWCBufSize-MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE)
788*53ee8cc1Swenshuai.xi             >= MJPEG_MAX_SUPPORT_WIDTH*MJPEG_MAX_SUPPORT_HEIGHT*DISPLAY_QUEUE_NUM/2)
789*53ee8cc1Swenshuai.xi         {
790*53ee8cc1Swenshuai.xi             __u8FrameBuffTotalNum[u8DrvId] = DISPLAY_QUEUE_NUM/2;
791*53ee8cc1Swenshuai.xi         }
792*53ee8cc1Swenshuai.xi         else
793*53ee8cc1Swenshuai.xi         {
794*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("Not enough framebuffer for 720p asf-mjpeg mode support!!\n");
795*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_FAIL;
796*53ee8cc1Swenshuai.xi         }
797*53ee8cc1Swenshuai.xi     }
798*53ee8cc1Swenshuai.xi     else
799*53ee8cc1Swenshuai.xi     {
800*53ee8cc1Swenshuai.xi         if((pInitParam->u32MWCBufSize-MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE)
801*53ee8cc1Swenshuai.xi             >= MJPEG_SD_WIDTH*MJPEG_SD_HEIGHT*DISPLAY_QUEUE_NUM)
802*53ee8cc1Swenshuai.xi         {
803*53ee8cc1Swenshuai.xi             __u8FrameBuffTotalNum[u8DrvId] = DISPLAY_QUEUE_NUM;
804*53ee8cc1Swenshuai.xi         }
805*53ee8cc1Swenshuai.xi         else if((pInitParam->u32MWCBufSize-MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE)
806*53ee8cc1Swenshuai.xi             >= MJPEG_SD_WIDTH*MJPEG_SD_HEIGHT*DISPLAY_QUEUE_NUM/2)
807*53ee8cc1Swenshuai.xi         {
808*53ee8cc1Swenshuai.xi             __u8FrameBuffTotalNum[u8DrvId] = DISPLAY_QUEUE_NUM/2;
809*53ee8cc1Swenshuai.xi         }
810*53ee8cc1Swenshuai.xi         else
811*53ee8cc1Swenshuai.xi         {
812*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("Not enough framebuffer for asf-mjpeg mode support!!\n");
813*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_FAIL;
814*53ee8cc1Swenshuai.xi         }
815*53ee8cc1Swenshuai.xi     }
816*53ee8cc1Swenshuai.xi     __u32FrameBuffUnitSize[u8DrvId] = (pInitParam->u32MWCBufSize-MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE)/__u8FrameBuffTotalNum[u8DrvId];
817*53ee8cc1Swenshuai.xi #else
818*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
819*53ee8cc1Swenshuai.xi     {
820*53ee8cc1Swenshuai.xi         if(pInitParam->u32MWCBufSize >= MJPEG_MAX_SUPPORT_WIDTH*MJPEG_MAX_SUPPORT_HEIGHT*DISPLAY_QUEUE_NUM)
821*53ee8cc1Swenshuai.xi         {
822*53ee8cc1Swenshuai.xi             __u8FrameBuffTotalNum[u8DrvId] = DISPLAY_QUEUE_NUM;
823*53ee8cc1Swenshuai.xi         }
824*53ee8cc1Swenshuai.xi         else if(pInitParam->u32MWCBufSize >= MJPEG_MAX_SUPPORT_WIDTH*MJPEG_MAX_SUPPORT_HEIGHT*DISPLAY_QUEUE_NUM/2)
825*53ee8cc1Swenshuai.xi         {
826*53ee8cc1Swenshuai.xi             __u8FrameBuffTotalNum[u8DrvId] = DISPLAY_QUEUE_NUM/2;
827*53ee8cc1Swenshuai.xi         }
828*53ee8cc1Swenshuai.xi         else
829*53ee8cc1Swenshuai.xi         {
830*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("Not enough framebuffer for 720p mjpeg!!\n");
831*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_FAIL;
832*53ee8cc1Swenshuai.xi         }
833*53ee8cc1Swenshuai.xi     }
834*53ee8cc1Swenshuai.xi     else
835*53ee8cc1Swenshuai.xi     {
836*53ee8cc1Swenshuai.xi         if(pInitParam->u32MWCBufSize >= MJPEG_SD_WIDTH*MJPEG_SD_HEIGHT*DISPLAY_QUEUE_NUM)
837*53ee8cc1Swenshuai.xi         {
838*53ee8cc1Swenshuai.xi             __u8FrameBuffTotalNum[u8DrvId] = DISPLAY_QUEUE_NUM;
839*53ee8cc1Swenshuai.xi         }
840*53ee8cc1Swenshuai.xi         else if(pInitParam->u32MWCBufSize >= MJPEG_SD_WIDTH*MJPEG_SD_HEIGHT*DISPLAY_QUEUE_NUM/2)
841*53ee8cc1Swenshuai.xi         {
842*53ee8cc1Swenshuai.xi             __u8FrameBuffTotalNum[u8DrvId] = DISPLAY_QUEUE_NUM/2;
843*53ee8cc1Swenshuai.xi         }
844*53ee8cc1Swenshuai.xi         else
845*53ee8cc1Swenshuai.xi         {
846*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("Not enough framebuffer for mjpeg!!\n");
847*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_FAIL;
848*53ee8cc1Swenshuai.xi         }
849*53ee8cc1Swenshuai.xi     }
850*53ee8cc1Swenshuai.xi     __u32FrameBuffUnitSize[u8DrvId] = pInitParam->u32MWCBufSize/__u8FrameBuffTotalNum[u8DrvId];
851*53ee8cc1Swenshuai.xi #endif
852*53ee8cc1Swenshuai.xi     __u32FrameBuffUnitSize[u8DrvId] = (__u32FrameBuffUnitSize[u8DrvId] >> 3) << 3;//8 byte alignment
853*53ee8cc1Swenshuai.xi 
854*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_BUFF_UNIT_SIZE, __u32FrameBuffUnitSize[u8DrvId]);
855*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_BUFF_TOTAL_NUM, __u8FrameBuffTotalNum[u8DrvId]);
856*53ee8cc1Swenshuai.xi     #if ENABLE_DOUBLE_FRAMERATE
857*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG ("   frame rate base %ld\n", pInitParam->u32FrameRate);
858*53ee8cc1Swenshuai.xi     pInitParam->u32FrameRate /= 2;
859*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG ("   1/2 frame rate base %ld\n", pInitParam->u32FrameRate);
860*53ee8cc1Swenshuai.xi     #endif
861*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAMERATE, pInitParam->u32FrameRate);
862*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAMERATE_BASE, pInitParam->u32FrameRateBase);
863*53ee8cc1Swenshuai.xi //    MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_CHIP_ID, MDrv_MJPEG_Get_Chip_ID());
864*53ee8cc1Swenshuai.xi 
865*53ee8cc1Swenshuai.xi     if(pInitParam->u32FrameRate ==0)
866*53ee8cc1Swenshuai.xi     {
867*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_ERR("Error!!! MJPEG Frame rate is 0\n");
868*53ee8cc1Swenshuai.xi         pInitParam->u32FrameRate =30000;
869*53ee8cc1Swenshuai.xi     }
870*53ee8cc1Swenshuai.xi     __u32FrameRate[u8DrvId] = pInitParam->u32FrameRate;
871*53ee8cc1Swenshuai.xi     __u32FrameRateBase[u8DrvId] = pInitParam->u32FrameRateBase;
872*53ee8cc1Swenshuai.xi     __u32FrameTime[u8DrvId] = __u32FrameRateBase[u8DrvId] * 1000 / __u32FrameRate[u8DrvId];
873*53ee8cc1Swenshuai.xi #endif // ENABLE_MJPEG_FIRMWARE
874*53ee8cc1Swenshuai.xi 
875*53ee8cc1Swenshuai.xi     __u32FrameCnt[u8DrvId] = 0;
876*53ee8cc1Swenshuai.xi     __u32DropFrameCnt[u8DrvId] = 0;
877*53ee8cc1Swenshuai.xi 
878*53ee8cc1Swenshuai.xi     __u32MRCBufAddr[u8DrvId] = pInitParam->u32MRCBufAddr;
879*53ee8cc1Swenshuai.xi     __u32MWCBufAddr[u8DrvId] = pInitParam->u32MWCBufAddr;
880*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
881*53ee8cc1Swenshuai.xi     __u32CollectBufAddr[u8DrvId] = pInitParam->u32MWCBufAddr+pInitParam->u32MWCBufSize - MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE;
882*53ee8cc1Swenshuai.xi     __u32CollectBufWptr[u8DrvId] = __u32CollectBufAddr[u8DrvId];
883*53ee8cc1Swenshuai.xi #endif
884*53ee8cc1Swenshuai.xi 
885*53ee8cc1Swenshuai.xi     __u32InternalBufAddr[u8DrvId] = pInitParam->u32InternalBufAddr;
886*53ee8cc1Swenshuai.xi     __u32InternalBufSize[u8DrvId] = pInitParam->u32InternalBufSize;
887*53ee8cc1Swenshuai.xi 
888*53ee8cc1Swenshuai.xi     jpegInitParam.u32MRCBufAddr = pInitParam->u32MRCBufAddr;
889*53ee8cc1Swenshuai.xi     jpegInitParam.u32MRCBufSize = pInitParam->u32MRCBufSize;
890*53ee8cc1Swenshuai.xi     jpegInitParam.u32MWCBufAddr = pInitParam->u32MWCBufAddr;
891*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
892*53ee8cc1Swenshuai.xi     jpegInitParam.u32MWCBufSize = pInitParam->u32MWCBufSize - MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE;
893*53ee8cc1Swenshuai.xi #else
894*53ee8cc1Swenshuai.xi     jpegInitParam.u32MWCBufSize = pInitParam->u32MWCBufSize;
895*53ee8cc1Swenshuai.xi #endif
896*53ee8cc1Swenshuai.xi 
897*53ee8cc1Swenshuai.xi     jpegInitParam.u32InternalBufAddr = pInitParam->u32InternalBufAddr;
898*53ee8cc1Swenshuai.xi     jpegInitParam.u32InternalBufSize = pInitParam->u32InternalBufSize;
899*53ee8cc1Swenshuai.xi     jpegInitParam.u32DecByteRead = 0;
900*53ee8cc1Swenshuai.xi     jpegInitParam.bEOF = TRUE;
901*53ee8cc1Swenshuai.xi     jpegInitParam.u8DecodeType = E_JPEG_TYPE_MJPEG;
902*53ee8cc1Swenshuai.xi     jpegInitParam.bInitMem = TRUE;
903*53ee8cc1Swenshuai.xi     jpegInitParam.pFillHdrFunc = NULL;
904*53ee8cc1Swenshuai.xi 
905*53ee8cc1Swenshuai.xi #if 0
906*53ee8cc1Swenshuai.xi     printf("MJPEG init================================\n");
907*53ee8cc1Swenshuai.xi     printf("[MRC]addr=0x%lx, size=0x%lx\n", __u32MRCBufAddr[u8DrvId], jpegInitParam.u32MRCBufSize);
908*53ee8cc1Swenshuai.xi     printf("[MWC]addr=0x%lx, size=0x%lx\n", __u32MWCBufAddr[u8DrvId], jpegInitParam.u32MWCBufSize);
909*53ee8cc1Swenshuai.xi     printf("[INTER]addr=0x%lx, size=0x%lx\n", __u32InternalBufAddr[u8DrvId], __u32InternalBufSize[u8DrvId]);
910*53ee8cc1Swenshuai.xi     printf("[MRC VA]addr=0x%lx, size=0x%lx\n", MS_PA2KSEG1(__u32MRCBufAddr[u8DrvId]), jpegInitParam.u32MRCBufSize);
911*53ee8cc1Swenshuai.xi     printf("[MWC VA]addr=0x%lx, size=0x%lx\n", MS_PA2KSEG1(__u32MWCBufAddr[u8DrvId]), jpegInitParam.u32MWCBufSize);
912*53ee8cc1Swenshuai.xi     printf("[INTER VA]addr=0x%lx, size=0x%lx\n", MS_PA2KSEG1(__u32InternalBufAddr[u8DrvId]), __u32InternalBufSize[u8DrvId]);
913*53ee8cc1Swenshuai.xi     printf("===========================================\n");
914*53ee8cc1Swenshuai.xi #endif
915*53ee8cc1Swenshuai.xi 
916*53ee8cc1Swenshuai.xi     // This is used to init memory
917*53ee8cc1Swenshuai.xi     if (MApi_JPEG_Init(&jpegInitParam) == E_JPEG_FAILED)
918*53ee8cc1Swenshuai.xi     {
919*53ee8cc1Swenshuai.xi #if ENABLE_MJPEG_FIRMWARE
920*53ee8cc1Swenshuai.xi         MDrv_MJPEG_DeInit(u32Id);
921*53ee8cc1Swenshuai.xi #endif
922*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
923*53ee8cc1Swenshuai.xi     }
924*53ee8cc1Swenshuai.xi 
925*53ee8cc1Swenshuai.xi     // Make sure it's exited correctly
926*53ee8cc1Swenshuai.xi     MApi_JPEG_Exit();
927*53ee8cc1Swenshuai.xi 
928*53ee8cc1Swenshuai.xi     // Init Local Variables
929*53ee8cc1Swenshuai.xi     PreVIdx[u8DrvId] = 0;
930*53ee8cc1Swenshuai.xi     ReCheckTime[u8DrvId] = 0;
931*53ee8cc1Swenshuai.xi     bLstFrame[u8DrvId] = FALSE;
932*53ee8cc1Swenshuai.xi 
933*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
934*53ee8cc1Swenshuai.xi }
935*53ee8cc1Swenshuai.xi 
936*53ee8cc1Swenshuai.xi /******************************************************************************/
937*53ee8cc1Swenshuai.xi ///Reset JPD
938*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_Rst(MS_U32 u32Id)939*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Rst(MS_U32 u32Id)
940*53ee8cc1Swenshuai.xi {
941*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
942*53ee8cc1Swenshuai.xi     //__u32FrameCnt = 0;
943*53ee8cc1Swenshuai.xi     __bIsFirstFrameRdy[u8DrvId] = FALSE;
944*53ee8cc1Swenshuai.xi 
945*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
946*53ee8cc1Swenshuai.xi     {
947*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
948*53ee8cc1Swenshuai.xi     }
949*53ee8cc1Swenshuai.xi     MApi_JPEG_Rst();
950*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("clear error code due to call MApi_MJPEG_Rst()\n");
951*53ee8cc1Swenshuai.xi     _MApi_MJPEG_SetErrCode(u32Id, E_MJPEG_ERROR_CODE_NONE);
952*53ee8cc1Swenshuai.xi 
953*53ee8cc1Swenshuai.xi     // CHECK : reset firmware???
954*53ee8cc1Swenshuai.xi 
955*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
956*53ee8cc1Swenshuai.xi }
957*53ee8cc1Swenshuai.xi 
958*53ee8cc1Swenshuai.xi /******************************************************************************/
959*53ee8cc1Swenshuai.xi ///Turn off JPD clock
960*53ee8cc1Swenshuai.xi /******************************************************************************/
961*53ee8cc1Swenshuai.xi //extern void MApi_JPEG_DisableAddressConvert(void); // defined in apiJPEG.c
MApi_MJPEG_Stop(MS_U32 u32Id)962*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Stop(MS_U32 u32Id)
963*53ee8cc1Swenshuai.xi {
964*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
965*53ee8cc1Swenshuai.xi 
966*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
967*53ee8cc1Swenshuai.xi     {
968*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
969*53ee8cc1Swenshuai.xi     }
970*53ee8cc1Swenshuai.xi     //__u32FrameCnt = 0;
971*53ee8cc1Swenshuai.xi     __bIsFirstFrameRdy[u8DrvId] = FALSE;
972*53ee8cc1Swenshuai.xi     isDecFrameInfoValid[u8DrvId] = FALSE;
973*53ee8cc1Swenshuai.xi     bStepDec[u8DrvId] = FALSE;
974*53ee8cc1Swenshuai.xi 
975*53ee8cc1Swenshuai.xi     MDrv_MJPEG_StopVPU();
976*53ee8cc1Swenshuai.xi 
977*53ee8cc1Swenshuai.xi     MDrv_MJPEG_DeInit(u32Id);
978*53ee8cc1Swenshuai.xi 
979*53ee8cc1Swenshuai.xi     //MApi_JPEG_PowerOff() is called in MApi_JPEG_Exit()
980*53ee8cc1Swenshuai.xi     MApi_JPEG_Exit();
981*53ee8cc1Swenshuai.xi 
982*53ee8cc1Swenshuai.xi     MApi_JPEG_DisableAddressConvert();
983*53ee8cc1Swenshuai.xi 
984*53ee8cc1Swenshuai.xi     // CHECK : stop firmware???
985*53ee8cc1Swenshuai.xi 
986*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
987*53ee8cc1Swenshuai.xi }
988*53ee8cc1Swenshuai.xi 
989*53ee8cc1Swenshuai.xi /******************************************************************************/
990*53ee8cc1Swenshuai.xi ///Check if first frame has been decoded
991*53ee8cc1Swenshuai.xi ///@return TRUE if first picture is decoded, else return FALSE
992*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_CheckDispInfoRdy(MS_U32 u32Id)993*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_CheckDispInfoRdy(MS_U32 u32Id)
994*53ee8cc1Swenshuai.xi {
995*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
996*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
997*53ee8cc1Swenshuai.xi     {
998*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
999*53ee8cc1Swenshuai.xi     }
1000*53ee8cc1Swenshuai.xi     if ((TRUE == __bIsFirstFrameRdy[u8DrvId])
1001*53ee8cc1Swenshuai.xi     && (E_JPEG_EVENT_DEC_DONE & MApi_JPEG_GetJPDEventFlag()))
1002*53ee8cc1Swenshuai.xi     {
1003*53ee8cc1Swenshuai.xi         // Should use the width & height of 1st frame
1004*53ee8cc1Swenshuai.xi         //__u16Width = MApi_JPEG_GetWidth();
1005*53ee8cc1Swenshuai.xi         //__u16Height = MApi_JPEG_GetHeight();
1006*53ee8cc1Swenshuai.xi 
1007*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_CheckDispInfoRdy : E_MJPEG_RET_SUCCESS\n");
1008*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_SUCCESS;
1009*53ee8cc1Swenshuai.xi     }
1010*53ee8cc1Swenshuai.xi 
1011*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_CheckDispInfoRdy : E_MJPEG_RET_FAIL\n");
1012*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
1013*53ee8cc1Swenshuai.xi }
1014*53ee8cc1Swenshuai.xi 
1015*53ee8cc1Swenshuai.xi /******************************************************************************/
1016*53ee8cc1Swenshuai.xi ///Play
1017*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1018*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1019*53ee8cc1Swenshuai.xi ///@return status
1020*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_Play(MS_U32 u32Id)1021*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Play(MS_U32 u32Id)
1022*53ee8cc1Swenshuai.xi {
1023*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1024*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1025*53ee8cc1Swenshuai.xi     {
1026*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1027*53ee8cc1Swenshuai.xi     }
1028*53ee8cc1Swenshuai.xi     if (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_PLAY, 0xFFFFFFFF) == 0)
1029*53ee8cc1Swenshuai.xi     {
1030*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Play : E_MJPEG_RET_FAIL\n");
1031*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
1032*53ee8cc1Swenshuai.xi     }
1033*53ee8cc1Swenshuai.xi 
1034*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Play : E_MJPEG_RET_SUCCESS\n");
1035*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1036*53ee8cc1Swenshuai.xi }
1037*53ee8cc1Swenshuai.xi 
1038*53ee8cc1Swenshuai.xi /******************************************************************************/
1039*53ee8cc1Swenshuai.xi ///Pause
1040*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1041*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1042*53ee8cc1Swenshuai.xi ///@return status
1043*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_Pause(MS_U32 u32Id)1044*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Pause(MS_U32 u32Id)
1045*53ee8cc1Swenshuai.xi {
1046*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1047*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1048*53ee8cc1Swenshuai.xi     {
1049*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1050*53ee8cc1Swenshuai.xi     }
1051*53ee8cc1Swenshuai.xi     if (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_PAUSE, 0xFFFFFFFF) == 0)
1052*53ee8cc1Swenshuai.xi     {
1053*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Pause : E_MJPEG_RET_FAIL\n");
1054*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
1055*53ee8cc1Swenshuai.xi     }
1056*53ee8cc1Swenshuai.xi 
1057*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Pause : E_MJPEG_RET_SUCCESS\n");
1058*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1059*53ee8cc1Swenshuai.xi }
1060*53ee8cc1Swenshuai.xi 
1061*53ee8cc1Swenshuai.xi /******************************************************************************/
1062*53ee8cc1Swenshuai.xi ///Resume
1063*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1064*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1065*53ee8cc1Swenshuai.xi ///@return status
1066*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_Resume(MS_U32 u32Id)1067*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Resume(MS_U32 u32Id)
1068*53ee8cc1Swenshuai.xi {
1069*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1070*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1071*53ee8cc1Swenshuai.xi     {
1072*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1073*53ee8cc1Swenshuai.xi     }
1074*53ee8cc1Swenshuai.xi     if (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_RESUME, 0xFFFFFFFF) == 0)
1075*53ee8cc1Swenshuai.xi     {
1076*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Resume : E_MJPEG_RET_FAIL\n");
1077*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
1078*53ee8cc1Swenshuai.xi     }
1079*53ee8cc1Swenshuai.xi 
1080*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Resume : E_MJPEG_RET_SUCCESS\n");
1081*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1082*53ee8cc1Swenshuai.xi }
1083*53ee8cc1Swenshuai.xi 
1084*53ee8cc1Swenshuai.xi /******************************************************************************/
1085*53ee8cc1Swenshuai.xi ///Step Play
1086*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1087*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1088*53ee8cc1Swenshuai.xi ///@return status
1089*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_StepPlay(MS_U32 u32Id)1090*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_StepPlay(MS_U32 u32Id)
1091*53ee8cc1Swenshuai.xi {
1092*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1093*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1094*53ee8cc1Swenshuai.xi     {
1095*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1096*53ee8cc1Swenshuai.xi     }
1097*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SetStepDispPara(u32Id);
1098*53ee8cc1Swenshuai.xi     if (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_STEP_PLAY, 0xFFFFFFFF) == 0)
1099*53ee8cc1Swenshuai.xi     {
1100*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_StepPlay : E_MJPEG_RET_FAIL\n");
1101*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
1102*53ee8cc1Swenshuai.xi     }
1103*53ee8cc1Swenshuai.xi 
1104*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_StepPlay : E_MJPEG_RET_SUCCESS\n");
1105*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1106*53ee8cc1Swenshuai.xi }
1107*53ee8cc1Swenshuai.xi 
1108*53ee8cc1Swenshuai.xi /******************************************************************************/
1109*53ee8cc1Swenshuai.xi ///Check if step play is done or not
1110*53ee8cc1Swenshuai.xi ///@return true or false
1111*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsStepPlayDone(MS_U32 u32Id)1112*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsStepPlayDone(MS_U32 u32Id)
1113*53ee8cc1Swenshuai.xi {
1114*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1115*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1116*53ee8cc1Swenshuai.xi     {
1117*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1118*53ee8cc1Swenshuai.xi     }
1119*53ee8cc1Swenshuai.xi 
1120*53ee8cc1Swenshuai.xi #if USE_MJPEG_SHAREMEMORY
1121*53ee8cc1Swenshuai.xi     return (!MDrv_MJPEG_IsStepPlayDone(u32Id));
1122*53ee8cc1Swenshuai.xi #else
1123*53ee8cc1Swenshuai.xi     if (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_IS_STEP_PLAY_DONE, 0xFFFFFFFF) == 0)
1124*53ee8cc1Swenshuai.xi     {
1125*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsStepPlayDone : TRUE\n");
1126*53ee8cc1Swenshuai.xi         return TRUE;
1127*53ee8cc1Swenshuai.xi     }
1128*53ee8cc1Swenshuai.xi 
1129*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsStepPlayDone : FALSE\n");
1130*53ee8cc1Swenshuai.xi     return FALSE;
1131*53ee8cc1Swenshuai.xi #endif
1132*53ee8cc1Swenshuai.xi }
1133*53ee8cc1Swenshuai.xi 
1134*53ee8cc1Swenshuai.xi /******************************************************************************/
1135*53ee8cc1Swenshuai.xi ///Description
1136*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1137*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1138*53ee8cc1Swenshuai.xi ///@return status
1139*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_StepDecode(MS_U32 u32Id)1140*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_StepDecode(MS_U32 u32Id)
1141*53ee8cc1Swenshuai.xi {
1142*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1143*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1144*53ee8cc1Swenshuai.xi     {
1145*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1146*53ee8cc1Swenshuai.xi     }
1147*53ee8cc1Swenshuai.xi     bStepDec[u8DrvId] = FALSE;
1148*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1149*53ee8cc1Swenshuai.xi }
1150*53ee8cc1Swenshuai.xi 
1151*53ee8cc1Swenshuai.xi /******************************************************************************/
1152*53ee8cc1Swenshuai.xi ///Description
1153*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1154*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1155*53ee8cc1Swenshuai.xi ///@return status
1156*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsStepDecodeDone(MS_U32 u32Id)1157*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsStepDecodeDone(MS_U32 u32Id)
1158*53ee8cc1Swenshuai.xi {
1159*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1160*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1161*53ee8cc1Swenshuai.xi     {
1162*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1163*53ee8cc1Swenshuai.xi     }
1164*53ee8cc1Swenshuai.xi     if(FALSE == bStepDec[u8DrvId])
1165*53ee8cc1Swenshuai.xi         return FALSE;
1166*53ee8cc1Swenshuai.xi 
1167*53ee8cc1Swenshuai.xi     if (E_MJPEG_RET_SUCCESS == __MApi_MJPEG_CheckDecodeDone(u32Id))
1168*53ee8cc1Swenshuai.xi         return TRUE;
1169*53ee8cc1Swenshuai.xi 
1170*53ee8cc1Swenshuai.xi     return FALSE;
1171*53ee8cc1Swenshuai.xi }
1172*53ee8cc1Swenshuai.xi 
1173*53ee8cc1Swenshuai.xi /******************************************************************************/
1174*53ee8cc1Swenshuai.xi ///Issue full JPEG decode process
1175*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1176*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1177*53ee8cc1Swenshuai.xi ///@return status
1178*53ee8cc1Swenshuai.xi /******************************************************************************/
1179*53ee8cc1Swenshuai.xi //MJPEG_Result MApi_MJPEG_PushQueue(MS_PHY u32StAddr, MS_U32 u32Size, MS_U32 u32TimeStamp)
MApi_MJPEG_PushQueue(MS_U32 u32Id,MJPEG_Packet_Info * pInfo)1180*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_PushQueue(MS_U32 u32Id, MJPEG_Packet_Info *pInfo)
1181*53ee8cc1Swenshuai.xi {
1182*53ee8cc1Swenshuai.xi     //
1183*53ee8cc1Swenshuai.xi     // There's no queue
1184*53ee8cc1Swenshuai.xi     //
1185*53ee8cc1Swenshuai.xi     JPEG_InitParam jpegInitParam;
1186*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1187*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1188*53ee8cc1Swenshuai.xi     {
1189*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1190*53ee8cc1Swenshuai.xi     }
1191*53ee8cc1Swenshuai.xi 
1192*53ee8cc1Swenshuai.xi     MJPEG_DEBUG("[MJPEG]MApi_MJPEG_PushQueue() pts=%ld\n", pInfo->u32TimeStamp);
1193*53ee8cc1Swenshuai.xi #if 0   // force to asf mjpeg mode (move to another internal buffer)
1194*53ee8cc1Swenshuai.xi     pInfo->u32StAddr |= VDEC_EX_MVD_PIC_START_FLAG;
1195*53ee8cc1Swenshuai.xi #endif
1196*53ee8cc1Swenshuai.xi 
1197*53ee8cc1Swenshuai.xi     if(pInfo->u32Size == 0)
1198*53ee8cc1Swenshuai.xi     {
1199*53ee8cc1Swenshuai.xi         u16NullCnt[u8DrvId]++;
1200*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("%s: MJPEG NULL PACKET!!!!!!!!!!\n", __FUNCTION__);
1201*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_SUCCESS;
1202*53ee8cc1Swenshuai.xi     }
1203*53ee8cc1Swenshuai.xi #if 0//SUPPORT_SKIP_ERROR_FRAME
1204*53ee8cc1Swenshuai.xi     if(_MApi_MJPEG_IsDecodeTimeout(u32Id))
1205*53ee8cc1Swenshuai.xi     {
1206*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_ERR("%s: JPEG decode frame timeout!!!!!!!!!!\n", __FUNCTION__);
1207*53ee8cc1Swenshuai.xi         _u32SkipCnt[u8DrvId]++;
1208*53ee8cc1Swenshuai.xi         _u32ErrCnt[u8DrvId]++;
1209*53ee8cc1Swenshuai.xi         // Repeat next frame because previous frame decode timeout
1210*53ee8cc1Swenshuai.xi         u16NullCnt[u8DrvId]++;
1211*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_ERR("%s: Reset JPD!!!!!!!!!!\n", __FUNCTION__);
1212*53ee8cc1Swenshuai.xi         MApi_JPEG_Rst();
1213*53ee8cc1Swenshuai.xi         MApi_JPEG_Exit();
1214*53ee8cc1Swenshuai.xi     }
1215*53ee8cc1Swenshuai.xi #endif
1216*53ee8cc1Swenshuai.xi 
1217*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
1218*53ee8cc1Swenshuai.xi     if(__bAsfMjpegMode[u8DrvId]==TRUE)
1219*53ee8cc1Swenshuai.xi     {
1220*53ee8cc1Swenshuai.xi         if(_MApi_MJPEG_IsAbleToPushNextFrame(u32Id) ==FALSE
1221*53ee8cc1Swenshuai.xi             && pInfo->u32StAddr & VDEC_EX_MVD_PIC_START_FLAG)
1222*53ee8cc1Swenshuai.xi         {
1223*53ee8cc1Swenshuai.xi             // At least one packet is available for pushing next frame
1224*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODING;
1225*53ee8cc1Swenshuai.xi         }
1226*53ee8cc1Swenshuai.xi     }
1227*53ee8cc1Swenshuai.xi 
1228*53ee8cc1Swenshuai.xi     _MApi_MJPEG_ASFParameterSetting(u32Id, pInfo);
1229*53ee8cc1Swenshuai.xi     pInfo->u32StAddr &= ~VDEC_EX_MVD_PIC_START_FLAG;
1230*53ee8cc1Swenshuai.xi 
1231*53ee8cc1Swenshuai.xi     if(__bAsfMjpegMode[u8DrvId]==TRUE)
1232*53ee8cc1Swenshuai.xi     {
1233*53ee8cc1Swenshuai.xi         if(_MApi_MJPEG_ASFBufferManagement(u32Id, pInfo)==FALSE)
1234*53ee8cc1Swenshuai.xi         {
1235*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_SUCCESS;
1236*53ee8cc1Swenshuai.xi         }
1237*53ee8cc1Swenshuai.xi     }
1238*53ee8cc1Swenshuai.xi #endif
1239*53ee8cc1Swenshuai.xi 
1240*53ee8cc1Swenshuai.xi     MS_U16 u16DecodeCnt;
1241*53ee8cc1Swenshuai.xi     for(u16DecodeCnt=0; u16DecodeCnt<=u16NullCnt[u8DrvId]; u16DecodeCnt++)
1242*53ee8cc1Swenshuai.xi     {
1243*53ee8cc1Swenshuai.xi         if (E_MJPEG_RET_DECODING == __MApi_MJPEG_CheckDecodeDone(u32Id))
1244*53ee8cc1Swenshuai.xi         {
1245*53ee8cc1Swenshuai.xi             u16NullCnt[u8DrvId] -=u16DecodeCnt;
1246*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("%s: E_MJPEG_RET_DECODING with u16DecodeCnt=%d\n", __FUNCTION__, u16DecodeCnt);
1247*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODING;
1248*53ee8cc1Swenshuai.xi         }
1249*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
1250*53ee8cc1Swenshuai.xi         if(__bAsfMjpegMode[u8DrvId]==TRUE)
1251*53ee8cc1Swenshuai.xi         {
1252*53ee8cc1Swenshuai.xi             if(u16DecodeCnt == u16NullCnt[u8DrvId])
1253*53ee8cc1Swenshuai.xi             {
1254*53ee8cc1Swenshuai.xi                 if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId) ==TRUE
1255*53ee8cc1Swenshuai.xi                     && __eColBufStatus[u8DrvId][1]==E_MJPEG_BUF_BUSY)
1256*53ee8cc1Swenshuai.xi                 {
1257*53ee8cc1Swenshuai.xi                     __eColBufStatus[u8DrvId][1] = E_MJPEG_BUF_AVAILABLE;
1258*53ee8cc1Swenshuai.xi                 }
1259*53ee8cc1Swenshuai.xi                 else if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId)==FALSE
1260*53ee8cc1Swenshuai.xi                     && __eColBufStatus[u8DrvId][0]==E_MJPEG_BUF_BUSY)
1261*53ee8cc1Swenshuai.xi                 {
1262*53ee8cc1Swenshuai.xi                     __eColBufStatus[u8DrvId][0] = E_MJPEG_BUF_AVAILABLE;
1263*53ee8cc1Swenshuai.xi                 }
1264*53ee8cc1Swenshuai.xi             }
1265*53ee8cc1Swenshuai.xi         }
1266*53ee8cc1Swenshuai.xi #endif
1267*53ee8cc1Swenshuai.xi 
1268*53ee8cc1Swenshuai.xi #if 1
1269*53ee8cc1Swenshuai.xi         if(__u32ReadPtr[u8DrvId] > __u32WritePtr[u8DrvId])
1270*53ee8cc1Swenshuai.xi         {
1271*53ee8cc1Swenshuai.xi             MJPEG_DEBUG("\033[1;31m[MWC][%dx%d.yuyv]addr=0x%lx, size=0x%x, [r:0x%lx, w:0x%lx]\033[m\n",
1272*53ee8cc1Swenshuai.xi                 MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), infoDecFrame[u8DrvId].u32LumaAddr,
1273*53ee8cc1Swenshuai.xi                 MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2,
1274*53ee8cc1Swenshuai.xi                 __u32ReadPtr[u8DrvId], __u32WritePtr[u8DrvId]);
1275*53ee8cc1Swenshuai.xi         }
1276*53ee8cc1Swenshuai.xi         else
1277*53ee8cc1Swenshuai.xi         {
1278*53ee8cc1Swenshuai.xi             MJPEG_DEBUG("[MWC][%dx%d.yuyv]addr=0x%lx, size=0x%x, [r:0x%lx, w:0x%lx]\n",
1279*53ee8cc1Swenshuai.xi                 MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), infoDecFrame[u8DrvId].u32LumaAddr,
1280*53ee8cc1Swenshuai.xi                 MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2,
1281*53ee8cc1Swenshuai.xi                 __u32ReadPtr[u8DrvId], __u32WritePtr[u8DrvId]);
1282*53ee8cc1Swenshuai.xi         }
1283*53ee8cc1Swenshuai.xi         if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_MJPEG)
1284*53ee8cc1Swenshuai.xi         {
1285*53ee8cc1Swenshuai.xi             MDrv_MJPEG_PrintShareInfo(u32Id);
1286*53ee8cc1Swenshuai.xi         }
1287*53ee8cc1Swenshuai.xi #endif
1288*53ee8cc1Swenshuai.xi        __u32FrameCnt[u8DrvId]++;
1289*53ee8cc1Swenshuai.xi         __u32ReadPtr[u8DrvId] = u32EndAddr[u8DrvId];
1290*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("%s: Count %ld, __bSkipToPts=%d, __bSeekToPts=%d, __u32Skip2PtsBase=%ld, __u32TargetPts=%ld\n",
1291*53ee8cc1Swenshuai.xi             __FUNCTION__, __u32FrameCnt[u8DrvId], __bSkipToPts[u8DrvId], __bSeekToPts[u8DrvId], __u32Skip2PtsBase[u8DrvId], __u32TargetPts[u8DrvId]);
1292*53ee8cc1Swenshuai.xi 
1293*53ee8cc1Swenshuai.xi 
1294*53ee8cc1Swenshuai.xi         __u32WritePtr[u8DrvId] = pInfo->u32StAddr + pInfo->u32Size - 1;
1295*53ee8cc1Swenshuai.xi 
1296*53ee8cc1Swenshuai.xi 
1297*53ee8cc1Swenshuai.xi         MJPEG_DEBUG("[MJPEG]Pushed done, [r:0x%lx, w:0x%lx, u8DrvId=%d]\n", __u32ReadPtr[u8DrvId], __u32WritePtr[u8DrvId], u8DrvId);
1298*53ee8cc1Swenshuai.xi 
1299*53ee8cc1Swenshuai.xi         // Skip/Seek to PTS
1300*53ee8cc1Swenshuai.xi         if (__bSkipToPts[u8DrvId] || __bSeekToPts[u8DrvId])
1301*53ee8cc1Swenshuai.xi         {
1302*53ee8cc1Swenshuai.xi             if (__u32Skip2PtsBase[u8DrvId] >= __u32TargetPts[u8DrvId])
1303*53ee8cc1Swenshuai.xi             {
1304*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("Skip/Seek to PTS done -- current PTS %ld\n", __u32Skip2PtsBase[u8DrvId]);
1305*53ee8cc1Swenshuai.xi                 __bSkipToPts[u8DrvId] = FALSE;
1306*53ee8cc1Swenshuai.xi                 __bSeekToPts[u8DrvId] = FALSE;
1307*53ee8cc1Swenshuai.xi                 // Need to update firmware PTS base
1308*53ee8cc1Swenshuai.xi                 MDrv_MJPEG_ResetPTS(u32Id, __u32Skip2PtsBase[u8DrvId]);
1309*53ee8cc1Swenshuai.xi             }
1310*53ee8cc1Swenshuai.xi             else
1311*53ee8cc1Swenshuai.xi             {
1312*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("Skip Frame -- PTS %ld\n", __u32Skip2PtsBase[u8DrvId]);
1313*53ee8cc1Swenshuai.xi                 __u32Skip2PtsBase[u8DrvId] += __u32FrameTime[u8DrvId];
1314*53ee8cc1Swenshuai.xi                 __bIsDecodeDone[u8DrvId] = TRUE;
1315*53ee8cc1Swenshuai.xi                 u32EndAddr[u8DrvId] = pInfo->u32StAddr + pInfo->u32Size - 1;
1316*53ee8cc1Swenshuai.xi                 return E_MJPEG_RET_SUCCESS;
1317*53ee8cc1Swenshuai.xi             }
1318*53ee8cc1Swenshuai.xi         }
1319*53ee8cc1Swenshuai.xi 
1320*53ee8cc1Swenshuai.xi         // Speed Control
1321*53ee8cc1Swenshuai.xi         if (__bIsFirstFrameRdy[u8DrvId])
1322*53ee8cc1Swenshuai.xi         {
1323*53ee8cc1Swenshuai.xi             if (eCurSpeedType[u8DrvId] == E_MJPEG_SPEED_FAST)
1324*53ee8cc1Swenshuai.xi             {
1325*53ee8cc1Swenshuai.xi                 if ((__u32FrameCnt[u8DrvId] - __u32SpeedCtrlFrameCntBase[u8DrvId]) % eCurDispSpeed[u8DrvId])
1326*53ee8cc1Swenshuai.xi                 {
1327*53ee8cc1Swenshuai.xi                     MJPEG_DEBUG_API_MSG("       Skip frame %ld\n", (__u32FrameCnt[u8DrvId] - __u32SpeedCtrlFrameCntBase[u8DrvId]));
1328*53ee8cc1Swenshuai.xi                     //__u32FrameCnt++;
1329*53ee8cc1Swenshuai.xi                     u16NullCnt[u8DrvId]=0;
1330*53ee8cc1Swenshuai.xi                     if(_MApi_MJPEG_DropFrameWhenFF(u32Id)==TRUE)
1331*53ee8cc1Swenshuai.xi                     {
1332*53ee8cc1Swenshuai.xi                         __bIsDecodeDone[u8DrvId] = TRUE;
1333*53ee8cc1Swenshuai.xi                         return E_MJPEG_RET_SUCCESS;
1334*53ee8cc1Swenshuai.xi                     }
1335*53ee8cc1Swenshuai.xi                 }
1336*53ee8cc1Swenshuai.xi             }
1337*53ee8cc1Swenshuai.xi             else if (eCurSpeedType[u8DrvId] == E_MJPEG_SPEED_SLOW)
1338*53ee8cc1Swenshuai.xi             {
1339*53ee8cc1Swenshuai.xi             }
1340*53ee8cc1Swenshuai.xi             else // if (eCurSpeedType == E_MJPEG_SPEED_DEFAULT)
1341*53ee8cc1Swenshuai.xi             {
1342*53ee8cc1Swenshuai.xi                 __u32SpeedCtrlFrameCntBase[u8DrvId] = __u32FrameCnt[u8DrvId];
1343*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("   Update Frame Count Base %ld\n", __u32SpeedCtrlFrameCntBase[u8DrvId]);
1344*53ee8cc1Swenshuai.xi             }
1345*53ee8cc1Swenshuai.xi         }
1346*53ee8cc1Swenshuai.xi 
1347*53ee8cc1Swenshuai.xi 
1348*53ee8cc1Swenshuai.xi         MApi_JPEG_SetMaxDecodeResolution(JPEGBASEWIDTHMAX, JPEGBASEHEIGHTMAX);
1349*53ee8cc1Swenshuai.xi 
1350*53ee8cc1Swenshuai.xi 
1351*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("pInfo->u32StAddr=0x%lx, __u32MRCBufAddr=0x%lx\n", pInfo->u32StAddr, __u32MRCBufAddr[u8DrvId]);
1352*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("pInfo->u32Size=0x%lx\n", pInfo->u32Size);
1353*53ee8cc1Swenshuai.xi         // Init
1354*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
1355*53ee8cc1Swenshuai.xi         if(__bAsfMjpegMode[u8DrvId]==TRUE)
1356*53ee8cc1Swenshuai.xi         {
1357*53ee8cc1Swenshuai.xi             if(_MApi_MJPEG_IsColWPtrInLow(u8DrvId))
1358*53ee8cc1Swenshuai.xi             {
1359*53ee8cc1Swenshuai.xi                 jpegInitParam.u32MRCBufAddr = __u32CollectBufAddr[u8DrvId]+MJPEG_RESERVED_MJPEG_COLLECT_BUF_SIZE/2;
1360*53ee8cc1Swenshuai.xi             }
1361*53ee8cc1Swenshuai.xi             else
1362*53ee8cc1Swenshuai.xi             {
1363*53ee8cc1Swenshuai.xi                 jpegInitParam.u32MRCBufAddr = __u32CollectBufAddr[u8DrvId];
1364*53ee8cc1Swenshuai.xi             }
1365*53ee8cc1Swenshuai.xi             jpegInitParam.u32MRCBufSize = 2*(__u32PrevBufAddr[u8DrvId] - jpegInitParam.u32MRCBufAddr);
1366*53ee8cc1Swenshuai.xi             //printf("[addr=0x%lx, size=0x%lx]\n", jpegInitParam.u32MRCBufAddr, jpegInitParam.u32MRCBufSize);
1367*53ee8cc1Swenshuai.xi         }
1368*53ee8cc1Swenshuai.xi         else
1369*53ee8cc1Swenshuai.xi         {
1370*53ee8cc1Swenshuai.xi             jpegInitParam.u32MRCBufAddr = (pInfo->u32StAddr + __u32MRCBufAddr[u8DrvId]) & ~0x0f;
1371*53ee8cc1Swenshuai.xi             // Tricky code: let JPD decode only L buffer, then decode dne
1372*53ee8cc1Swenshuai.xi             memset((void *)MS_PA2KSEG1(jpegInitParam.u32MRCBufAddr), 0, (pInfo->u32StAddr + __u32MRCBufAddr[u8DrvId]-jpegInitParam.u32MRCBufAddr));
1373*53ee8cc1Swenshuai.xi             jpegInitParam.u32MRCBufSize = ((pInfo->u32Size+(pInfo->u32StAddr + __u32MRCBufAddr[u8DrvId]-jpegInitParam.u32MRCBufAddr)+0xf) & ~0x0f)*2;
1374*53ee8cc1Swenshuai.xi         }
1375*53ee8cc1Swenshuai.xi #else
1376*53ee8cc1Swenshuai.xi         jpegInitParam.u32MRCBufAddr = (pInfo->u32StAddr + __u32MRCBufAddr[u8DrvId]) & ~0x0f;
1377*53ee8cc1Swenshuai.xi         // Tricky code: let JPD decode only L buffer, then decode dne
1378*53ee8cc1Swenshuai.xi         memset((void *)MS_PA2KSEG1(jpegInitParam.u32MRCBufAddr), 0, (pInfo->u32StAddr + __u32MRCBufAddr[u8DrvId]-jpegInitParam.u32MRCBufAddr));
1379*53ee8cc1Swenshuai.xi         jpegInitParam.u32MRCBufSize = ((pInfo->u32Size+(pInfo->u32StAddr + __u32MRCBufAddr[u8DrvId]-jpegInitParam.u32MRCBufAddr)+0xf) & ~0x0f)*2;
1380*53ee8cc1Swenshuai.xi #endif
1381*53ee8cc1Swenshuai.xi         if (jpegInitParam.u32MRCBufSize < JPEG_DEFAULT_EXIF_SIZE)
1382*53ee8cc1Swenshuai.xi         {   // Meet size check in MApi_JPEG_Init()
1383*53ee8cc1Swenshuai.xi             jpegInitParam.u32MRCBufSize = JPEG_DEFAULT_EXIF_SIZE;
1384*53ee8cc1Swenshuai.xi         }
1385*53ee8cc1Swenshuai.xi 
1386*53ee8cc1Swenshuai.xi         // Ask firmware if there is any frame buffer available
1387*53ee8cc1Swenshuai.xi #if USE_MJPEG_SHAREMEMORY
1388*53ee8cc1Swenshuai.xi         u32NextFrameBuffIdx[u8DrvId] = MDrv_MJPEG_GetNextFrameBufferIdx(u32Id);
1389*53ee8cc1Swenshuai.xi #else
1390*53ee8cc1Swenshuai.xi         u32NextFrameBuffIdx[u8DrvId] = MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_GET_NEXT_FREE_FRAME_BUFF_IDX, 0xFFFFFFFF);
1391*53ee8cc1Swenshuai.xi #endif
1392*53ee8cc1Swenshuai.xi 
1393*53ee8cc1Swenshuai.xi         MJPEG_DEBUG("[MJPEG]              E_MJPEG_CMD_GET_NEXT_FREE_FRAME_BUFF_IDX %ld\n", u32NextFrameBuffIdx[u8DrvId]);
1394*53ee8cc1Swenshuai.xi         if (u32NextFrameBuffIdx[u8DrvId] >= 0xFF)// It may be 0xFF, 0xFFFF, 0xFFFFFF, or 0xFFFFFFFF
1395*53ee8cc1Swenshuai.xi         {
1396*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("   !!! No frame buffer available !!!, u32NextFrameBuffIdx=0x%lx\n", u32NextFrameBuffIdx[u8DrvId]);
1397*53ee8cc1Swenshuai.xi             __bIsDecodeDone[u8DrvId] = TRUE;
1398*53ee8cc1Swenshuai.xi             __u32DropFrameCnt[u8DrvId]++;
1399*53ee8cc1Swenshuai.xi             u16NullCnt[u8DrvId]=0;
1400*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_FAIL;
1401*53ee8cc1Swenshuai.xi         }
1402*53ee8cc1Swenshuai.xi 
1403*53ee8cc1Swenshuai.xi         if (__bIsFirstFrameRdy[u8DrvId] == FALSE)
1404*53ee8cc1Swenshuai.xi         {
1405*53ee8cc1Swenshuai.xi             u32NextFrameBuffIdx[u8DrvId] = 0;
1406*53ee8cc1Swenshuai.xi         }
1407*53ee8cc1Swenshuai.xi         __bIsDecodeDone[u8DrvId] = FALSE;
1408*53ee8cc1Swenshuai.xi #if USE_MJPEG_SHAREMEMORY
1409*53ee8cc1Swenshuai.xi         MDrv_MJPEG_SetPushQPara(u32Id, pInfo->u32TimeStamp, pInfo->u32ID_L, pInfo->u32ID_H, u32NextFrameBuffIdx[u8DrvId]);
1410*53ee8cc1Swenshuai.xi         MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_PUSH_QUEUE_PARA_SETTING, (MS_U32)NULL);
1411*53ee8cc1Swenshuai.xi #else
1412*53ee8cc1Swenshuai.xi         MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_BUFF_IDX, u32NextFrameBuffIdx[u8DrvId]);
1413*53ee8cc1Swenshuai.xi         MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_TIMESTAMP, pInfo->u32TimeStamp);
1414*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("   u32TimeStamp %ld", pInfo->u32TimeStamp);
1415*53ee8cc1Swenshuai.xi         MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_ID_L, pInfo->u32ID_L);
1416*53ee8cc1Swenshuai.xi         MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_ID_H, pInfo->u32ID_H);
1417*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("Frame ID 0x%lx%lx", pInfo->u32ID_H, pInfo->u32ID_L);
1418*53ee8cc1Swenshuai.xi #endif
1419*53ee8cc1Swenshuai.xi 
1420*53ee8cc1Swenshuai.xi         jpegInitParam.u32MWCBufAddr = __u32MWCBufAddr[u8DrvId] + __u32FrameBuffUnitSize[u8DrvId]*u32NextFrameBuffIdx[u8DrvId];
1421*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("   Set Frame buffer addr 0x%lx\n", jpegInitParam.u32MWCBufAddr);
1422*53ee8cc1Swenshuai.xi         jpegInitParam.u32MWCBufSize = __u32FrameBuffUnitSize[u8DrvId];
1423*53ee8cc1Swenshuai.xi 
1424*53ee8cc1Swenshuai.xi         jpegInitParam.u32InternalBufAddr = __u32InternalBufAddr[u8DrvId];
1425*53ee8cc1Swenshuai.xi         jpegInitParam.u32InternalBufSize = __u32InternalBufSize[u8DrvId];
1426*53ee8cc1Swenshuai.xi #if SUPPORT_ASF_MJPEG_MODE
1427*53ee8cc1Swenshuai.xi         if(__bAsfMjpegMode[u8DrvId]==TRUE)
1428*53ee8cc1Swenshuai.xi         {
1429*53ee8cc1Swenshuai.xi             jpegInitParam.u32DecByteRead = jpegInitParam.u32MRCBufSize;
1430*53ee8cc1Swenshuai.xi         }
1431*53ee8cc1Swenshuai.xi         else
1432*53ee8cc1Swenshuai.xi         {
1433*53ee8cc1Swenshuai.xi             jpegInitParam.u32DecByteRead = pInfo->u32Size;
1434*53ee8cc1Swenshuai.xi         }
1435*53ee8cc1Swenshuai.xi #else
1436*53ee8cc1Swenshuai.xi         jpegInitParam.u32DecByteRead = pInfo->u32Size;
1437*53ee8cc1Swenshuai.xi #endif
1438*53ee8cc1Swenshuai.xi         jpegInitParam.bEOF = TRUE; // Set to TRUE to disable read function
1439*53ee8cc1Swenshuai.xi         jpegInitParam.u8DecodeType = E_JPEG_TYPE_MAIN; // only set to E_JPEG_TYPE_MJPEG when 1st time
1440*53ee8cc1Swenshuai.xi         jpegInitParam.bInitMem = TRUE;
1441*53ee8cc1Swenshuai.xi         jpegInitParam.pFillHdrFunc = NULL;
1442*53ee8cc1Swenshuai.xi 
1443*53ee8cc1Swenshuai.xi         #if ENABLE_AVSYNC_ID_CHECK
1444*53ee8cc1Swenshuai.xi         printf ("ID 0x%08lx%08lx    PTS %ld\n", pInfo->u32ID_H, pInfo->u32ID_L, pInfo->u32TimeStamp);
1445*53ee8cc1Swenshuai.xi         #endif
1446*53ee8cc1Swenshuai.xi 
1447*53ee8cc1Swenshuai.xi         // Make sure it's exited correctly
1448*53ee8cc1Swenshuai.xi         MApi_JPEG_Exit();
1449*53ee8cc1Swenshuai.xi 
1450*53ee8cc1Swenshuai.xi 
1451*53ee8cc1Swenshuai.xi         u32EndAddr[u8DrvId] = pInfo->u32StAddr + pInfo->u32Size - 1;
1452*53ee8cc1Swenshuai.xi #if 0
1453*53ee8cc1Swenshuai.xi         printf("[MWC]: addr=0x%lx, size=0x%lx\n", jpegInitParam.u32MWCBufAddr, jpegInitParam.u32MWCBufSize);
1454*53ee8cc1Swenshuai.xi         printf("[MRC]: addr=0x%lx, size=0x%lx\n", jpegInitParam.u32MRCBufAddr, jpegInitParam.u32MRCBufSize);
1455*53ee8cc1Swenshuai.xi         printf("[INTER]: addr=0x%lx, size=0x%lx\n", jpegInitParam.u32InternalBufAddr, jpegInitParam.u32InternalBufSize);
1456*53ee8cc1Swenshuai.xi #endif
1457*53ee8cc1Swenshuai.xi #if 0
1458*53ee8cc1Swenshuai.xi         printf("bitstream addr[PA]: 0x%lx, size=0x%lx\n", jpegInitParam.u32MRCBufAddr, pInfo->u32Size);
1459*53ee8cc1Swenshuai.xi         MS_U32 u32VA = MS_PA2KSEG1(jpegInitParam.u32MRCBufAddr);
1460*53ee8cc1Swenshuai.xi         MS_U16 u8i;
1461*53ee8cc1Swenshuai.xi         for(u8i=0;  u8i<0x100; u8i++)
1462*53ee8cc1Swenshuai.xi         {
1463*53ee8cc1Swenshuai.xi             printf("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x \n",
1464*53ee8cc1Swenshuai.xi                 *((MS_U8*)(u32VA+u8i*16)), *((MS_U8*)(u32VA+u8i*16+1)), *((MS_U8*)(u32VA+u8i*16+2)), *((MS_U8*)(u32VA+u8i*16+3)),
1465*53ee8cc1Swenshuai.xi                 *((MS_U8*)(u32VA+u8i*16+4)), *((MS_U8*)(u32VA+u8i*16+5)), *((MS_U8*)(u32VA+u8i*16+6)), *((MS_U8*)(u32VA+u8i*16+7)),
1466*53ee8cc1Swenshuai.xi                 *((MS_U8*)(u32VA+u8i*16+8)), *((MS_U8*)(u32VA+u8i*16+9)), *((MS_U8*)(u32VA+u8i*16+10)), *((MS_U8*)(u32VA+u8i*16+11)),
1467*53ee8cc1Swenshuai.xi                 *((MS_U8*)(u32VA+u8i*16+12)), *((MS_U8*)(u32VA+u8i*16+13)), *((MS_U8*)(u32VA+u8i*16+14)), *((MS_U8*)(u32VA+u8i*16+15))
1468*53ee8cc1Swenshuai.xi                 );
1469*53ee8cc1Swenshuai.xi         }
1470*53ee8cc1Swenshuai.xi #endif
1471*53ee8cc1Swenshuai.xi 
1472*53ee8cc1Swenshuai.xi         if (MApi_JPEG_Init(&jpegInitParam) == E_JPEG_FAILED)
1473*53ee8cc1Swenshuai.xi         {
1474*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("MApi_JPEG_Init() FAIL\n");
1475*53ee8cc1Swenshuai.xi             MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID, u32NextFrameBuffIdx[u8DrvId]);
1476*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Set frame buffer index %ld as Valid", u32NextFrameBuffIdx[u8DrvId]);
1477*53ee8cc1Swenshuai.xi             __bIsDecodeDone[u8DrvId] = TRUE;
1478*53ee8cc1Swenshuai.xi             __u32DropFrameCnt[u8DrvId]++;
1479*53ee8cc1Swenshuai.xi             u16NullCnt[u8DrvId]=0;
1480*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_FAIL;
1481*53ee8cc1Swenshuai.xi         }
1482*53ee8cc1Swenshuai.xi 
1483*53ee8cc1Swenshuai.xi         // Get width, height, & pitch of 1st frame
1484*53ee8cc1Swenshuai.xi         if (__bIsFirstFrameRdy[u8DrvId] == FALSE)
1485*53ee8cc1Swenshuai.xi         {
1486*53ee8cc1Swenshuai.xi             __u16Width[u8DrvId] = MApi_JPEG_GetWidth();
1487*53ee8cc1Swenshuai.xi             MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_WIDTH, __u16Width[u8DrvId]);
1488*53ee8cc1Swenshuai.xi             __u16Height[u8DrvId] = MApi_JPEG_GetHeight();
1489*53ee8cc1Swenshuai.xi             MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_HEIGHT, __u16Height[u8DrvId]);
1490*53ee8cc1Swenshuai.xi             __u16Pitch[u8DrvId] = MApi_JPEG_GetAlignedPitch();
1491*53ee8cc1Swenshuai.xi             MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_PITCH, __u16Pitch[u8DrvId]);
1492*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("       width %d, height %d, pitch %d\n", __u16Width[u8DrvId], __u16Height[u8DrvId], __u16Pitch[u8DrvId]);
1493*53ee8cc1Swenshuai.xi 
1494*53ee8cc1Swenshuai.xi             if(MApi_JPEG_IsNJPD()==TRUE)
1495*53ee8cc1Swenshuai.xi             {
1496*53ee8cc1Swenshuai.xi                 if((__u16Width[u8DrvId] > MJPEG_MAX_SUPPORT_WIDTH) ||
1497*53ee8cc1Swenshuai.xi                     (__u16Height[u8DrvId]>MJPEG_MAX_SUPPORT_HEIGHT))
1498*53ee8cc1Swenshuai.xi                 {
1499*53ee8cc1Swenshuai.xi                     MJPEG_DEBUG_API_MSG("Set MJPEG error code=E_MJPEG_ERR_CODE_RES \n");
1500*53ee8cc1Swenshuai.xi                     _MApi_MJPEG_SetErrCode(u32Id, E_MJPEG_ERR_CODE_RES);
1501*53ee8cc1Swenshuai.xi                 }
1502*53ee8cc1Swenshuai.xi             }
1503*53ee8cc1Swenshuai.xi             else
1504*53ee8cc1Swenshuai.xi             {
1505*53ee8cc1Swenshuai.xi                 if((__u16Width[u8DrvId] > MJPEG_SD_WIDTH) ||
1506*53ee8cc1Swenshuai.xi                     (__u16Height[u8DrvId]>MJPEG_SD_HEIGHT))
1507*53ee8cc1Swenshuai.xi                 {
1508*53ee8cc1Swenshuai.xi                     MJPEG_DEBUG_API_MSG("Set MJPEG error code=E_MJPEG_ERR_CODE_RES \n");
1509*53ee8cc1Swenshuai.xi                     _MApi_MJPEG_SetErrCode(u32Id, E_MJPEG_ERR_CODE_RES);
1510*53ee8cc1Swenshuai.xi                 }
1511*53ee8cc1Swenshuai.xi 
1512*53ee8cc1Swenshuai.xi             }
1513*53ee8cc1Swenshuai.xi         }
1514*53ee8cc1Swenshuai.xi 
1515*53ee8cc1Swenshuai.xi         // Fill decode frame info
1516*53ee8cc1Swenshuai.xi         infoDecFrame[u8DrvId].u32LumaAddr = jpegInitParam.u32MWCBufAddr;
1517*53ee8cc1Swenshuai.xi         infoDecFrame[u8DrvId].u32ChromaAddr = infoDecFrame[u8DrvId].u32LumaAddr;
1518*53ee8cc1Swenshuai.xi         infoDecFrame[u8DrvId].u32TimeStamp = pInfo->u32TimeStamp;
1519*53ee8cc1Swenshuai.xi         infoDecFrame[u8DrvId].u32ID_L = pInfo->u32ID_L;
1520*53ee8cc1Swenshuai.xi         infoDecFrame[u8DrvId].u32ID_H = pInfo->u32ID_H;
1521*53ee8cc1Swenshuai.xi         infoDecFrame[u8DrvId].u16Pitch = __u16Pitch[u8DrvId];
1522*53ee8cc1Swenshuai.xi         infoDecFrame[u8DrvId].u16Width = __u16Width[u8DrvId];
1523*53ee8cc1Swenshuai.xi         infoDecFrame[u8DrvId].u16Height = __u16Height[u8DrvId];
1524*53ee8cc1Swenshuai.xi         isDecFrameInfoValid[u8DrvId] = TRUE;
1525*53ee8cc1Swenshuai.xi 
1526*53ee8cc1Swenshuai.xi         // Decode header
1527*53ee8cc1Swenshuai.xi         if (MApi_JPEG_DecodeHdr() == E_JPEG_FAILED)
1528*53ee8cc1Swenshuai.xi         {
1529*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("MApi_JPEG_DecodeHdr() FAIL\n");
1530*53ee8cc1Swenshuai.xi             MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID, u32NextFrameBuffIdx[u8DrvId]);
1531*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Set frame buffer index %ld as Valid", u32NextFrameBuffIdx[u8DrvId]);
1532*53ee8cc1Swenshuai.xi             __bIsDecodeDone[u8DrvId] = TRUE;
1533*53ee8cc1Swenshuai.xi             __u32DropFrameCnt[u8DrvId]++;
1534*53ee8cc1Swenshuai.xi             u16NullCnt[u8DrvId]=0;
1535*53ee8cc1Swenshuai.xi 
1536*53ee8cc1Swenshuai.xi             JPEG_ErrCode jpeg_errcode = MApi_JPEG_GetErrorCode();
1537*53ee8cc1Swenshuai.xi             if((E_JPEG_UNSUPPORTED_COLORSPACE == jpeg_errcode)
1538*53ee8cc1Swenshuai.xi             || (E_JPEG_UNSUPPORTED_SAMP_FACTORS == jpeg_errcode)
1539*53ee8cc1Swenshuai.xi             || (E_JPEG_UNSUPPORTED_HUFF_DECODE == jpeg_errcode))
1540*53ee8cc1Swenshuai.xi             {
1541*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_ERR("Set MJPEG error code=E_MJPEG_ERR_CODE_RES for unsupport!!\n");
1542*53ee8cc1Swenshuai.xi                 _MApi_MJPEG_SetErrCode(u32Id, E_MJPEG_ERR_CODE_RES);
1543*53ee8cc1Swenshuai.xi             }
1544*53ee8cc1Swenshuai.xi 
1545*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODE_HDR_ERROR;
1546*53ee8cc1Swenshuai.xi         }
1547*53ee8cc1Swenshuai.xi 
1548*53ee8cc1Swenshuai.xi         bStepDec[u8DrvId] = TRUE;
1549*53ee8cc1Swenshuai.xi 
1550*53ee8cc1Swenshuai.xi         // Decode
1551*53ee8cc1Swenshuai.xi         if (MApi_JPEG_Decode() == E_JPEG_FAILED)
1552*53ee8cc1Swenshuai.xi         {
1553*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("MApi_JPEG_Decode() FAIL\n");
1554*53ee8cc1Swenshuai.xi             MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID, u32NextFrameBuffIdx[u8DrvId]);
1555*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Set frame buffer index %ld as Valid", u32NextFrameBuffIdx[u8DrvId]);
1556*53ee8cc1Swenshuai.xi             __bIsDecodeDone[u8DrvId] = TRUE;
1557*53ee8cc1Swenshuai.xi             __u32DropFrameCnt[u8DrvId]++;
1558*53ee8cc1Swenshuai.xi             u16NullCnt[u8DrvId]=0;
1559*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODE_ERROR;
1560*53ee8cc1Swenshuai.xi         }
1561*53ee8cc1Swenshuai.xi 
1562*53ee8cc1Swenshuai.xi #if SUPPORT_SKIP_ERROR_FRAME
1563*53ee8cc1Swenshuai.xi         _u32StartDecodeTime[u8DrvId] = MsOS_GetSystemTime();
1564*53ee8cc1Swenshuai.xi #endif
1565*53ee8cc1Swenshuai.xi 
1566*53ee8cc1Swenshuai.xi 
1567*53ee8cc1Swenshuai.xi         // Moved Up
1568*53ee8cc1Swenshuai.xi         //u32EndAddr = pInfo->u32StAddr + pInfo->u32Size - 1;
1569*53ee8cc1Swenshuai.xi         __bIsFirstFrameRdy[u8DrvId] = TRUE;
1570*53ee8cc1Swenshuai.xi 
1571*53ee8cc1Swenshuai.xi         // All done, wait for decoding finish
1572*53ee8cc1Swenshuai.xi         if(u16NullCnt[u8DrvId] ==u16DecodeCnt)
1573*53ee8cc1Swenshuai.xi         {
1574*53ee8cc1Swenshuai.xi             if(u16NullCnt[u8DrvId]!=0)
1575*53ee8cc1Swenshuai.xi             {
1576*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("%s: Handle MJPEG NULL PACKET with u16DecodeCnt=%d\n", __FUNCTION__, u16DecodeCnt);
1577*53ee8cc1Swenshuai.xi             }
1578*53ee8cc1Swenshuai.xi             u16NullCnt[u8DrvId]=0;
1579*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Wait for Fill decode frame info u32LumaAddr=0x%lx, u32ChromaAddr=0x%lx\n",
1580*53ee8cc1Swenshuai.xi                 infoDecFrame[u8DrvId].u32LumaAddr, infoDecFrame[u8DrvId].u32ChromaAddr);
1581*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_SUCCESS;
1582*53ee8cc1Swenshuai.xi         }
1583*53ee8cc1Swenshuai.xi         else
1584*53ee8cc1Swenshuai.xi         {
1585*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("%s: Duplicate PACKET with u16DecodeCnt=%d\n", __FUNCTION__, u16DecodeCnt);
1586*53ee8cc1Swenshuai.xi         }
1587*53ee8cc1Swenshuai.xi     }
1588*53ee8cc1Swenshuai.xi 
1589*53ee8cc1Swenshuai.xi     // Only for compile ok, the code should not run to this place.
1590*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("%s: Handle MJPEG NULL PACKET with u16DecodeCnt=%d\n", __FUNCTION__, u16DecodeCnt);
1591*53ee8cc1Swenshuai.xi     u16NullCnt[u8DrvId]=0;
1592*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1593*53ee8cc1Swenshuai.xi }
1594*53ee8cc1Swenshuai.xi 
1595*53ee8cc1Swenshuai.xi /******************************************************************************/
1596*53ee8cc1Swenshuai.xi ///Description
1597*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1598*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1599*53ee8cc1Swenshuai.xi ///@return status
1600*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetQueueVacancy(MS_U32 u32Id)1601*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetQueueVacancy(MS_U32 u32Id)
1602*53ee8cc1Swenshuai.xi {
1603*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1604*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1605*53ee8cc1Swenshuai.xi     {
1606*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1607*53ee8cc1Swenshuai.xi     }
1608*53ee8cc1Swenshuai.xi     #if ENABLE_AVSYNC_ID_CHECK
1609*53ee8cc1Swenshuai.xi     MJPEG_FrameInfo info;
1610*53ee8cc1Swenshuai.xi     MApi_MJPEG_GetDispFrameInfo(u32Id, &info);
1611*53ee8cc1Swenshuai.xi     #endif
1612*53ee8cc1Swenshuai.xi 
1613*53ee8cc1Swenshuai.xi 
1614*53ee8cc1Swenshuai.xi     if (__bIsFirstFrameRdy[u8DrvId] == FALSE)
1615*53ee8cc1Swenshuai.xi     {
1616*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_GetQueueVacancy : 1\n");
1617*53ee8cc1Swenshuai.xi         return 1;
1618*53ee8cc1Swenshuai.xi     }
1619*53ee8cc1Swenshuai.xi     else
1620*53ee8cc1Swenshuai.xi     {
1621*53ee8cc1Swenshuai.xi         if (__MApi_MJPEG_CheckDecodeDone(u32Id) != E_MJPEG_RET_DECODING)
1622*53ee8cc1Swenshuai.xi         {
1623*53ee8cc1Swenshuai.xi #if USE_MJPEG_SHAREMEMORY
1624*53ee8cc1Swenshuai.xi             if (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_IS_DISPLAY_QUEUE_FULL, 0xFFFFFFFF) == 1)
1625*53ee8cc1Swenshuai.xi             {
1626*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG("[MJPEG]            Display queue is full\n");
1627*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG("[MJPEG]           MApi_MJPEG_GetQueueVacancy : 0\n");
1628*53ee8cc1Swenshuai.xi                 return 0;
1629*53ee8cc1Swenshuai.xi             }
1630*53ee8cc1Swenshuai.xi 
1631*53ee8cc1Swenshuai.xi             if(MDrv_MJPEG_GetNextFrameBufferIdx(u32Id)>=0xff)
1632*53ee8cc1Swenshuai.xi             {
1633*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG("[MJPEG]           MApi_MJPEG_GetQueueVacancy : 0\n");
1634*53ee8cc1Swenshuai.xi                 return 0;
1635*53ee8cc1Swenshuai.xi             }
1636*53ee8cc1Swenshuai.xi             else
1637*53ee8cc1Swenshuai.xi             {
1638*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG("[MJPEG]           MApi_MJPEG_GetQueueVacancy : 1\n");
1639*53ee8cc1Swenshuai.xi                 return 1;
1640*53ee8cc1Swenshuai.xi             }
1641*53ee8cc1Swenshuai.xi #else
1642*53ee8cc1Swenshuai.xi             if (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_IS_DISPLAY_QUEUE_FULL, 0xFFFFFFFF) == 1)
1643*53ee8cc1Swenshuai.xi             {
1644*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("            Display queue is full\n");
1645*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("           MApi_MJPEG_GetQueueVacancy : 0\n");
1646*53ee8cc1Swenshuai.xi                 return 0;
1647*53ee8cc1Swenshuai.xi             }
1648*53ee8cc1Swenshuai.xi 
1649*53ee8cc1Swenshuai.xi             MS_U32 u32tmpcounter = MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_GET_NEXT_FREE_FRAME_BUFF_IDX, 0xFFFFFFFF);
1650*53ee8cc1Swenshuai.xi             if ( u32tmpcounter>= 0xFF)
1651*53ee8cc1Swenshuai.xi             {
1652*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("E_MJPEG_CMD_GET_NEXT_FREE_FRAME_BUFF_IDX %ld\n", u32tmpcounter);
1653*53ee8cc1Swenshuai.xi                 return 0;
1654*53ee8cc1Swenshuai.xi             }
1655*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("           MApi_MJPEG_GetQueueVacancy : 1\n");
1656*53ee8cc1Swenshuai.xi             return 1;
1657*53ee8cc1Swenshuai.xi #endif
1658*53ee8cc1Swenshuai.xi         }
1659*53ee8cc1Swenshuai.xi     }
1660*53ee8cc1Swenshuai.xi 
1661*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_GetQueueVacancy : 0\n");
1662*53ee8cc1Swenshuai.xi     return 0;
1663*53ee8cc1Swenshuai.xi }
1664*53ee8cc1Swenshuai.xi 
1665*53ee8cc1Swenshuai.xi /******************************************************************************/
1666*53ee8cc1Swenshuai.xi ///Description
1667*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1668*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1669*53ee8cc1Swenshuai.xi ///@return status
1670*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_FlushQueue(MS_U32 u32Id)1671*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_FlushQueue(MS_U32 u32Id)
1672*53ee8cc1Swenshuai.xi {
1673*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1674*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1675*53ee8cc1Swenshuai.xi     {
1676*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1677*53ee8cc1Swenshuai.xi     }
1678*53ee8cc1Swenshuai.xi     // Wait current frame decode done
1679*53ee8cc1Swenshuai.xi     while (E_MJPEG_RET_DECODING == __MApi_MJPEG_CheckDecodeDone(u32Id))
1680*53ee8cc1Swenshuai.xi         ;
1681*53ee8cc1Swenshuai.xi 
1682*53ee8cc1Swenshuai.xi     // Stop firmware display to avoid display queue status overwritten
1683*53ee8cc1Swenshuai.xi     MApi_MJPEG_Pause(u32Id);
1684*53ee8cc1Swenshuai.xi 
1685*53ee8cc1Swenshuai.xi     isDecFrameInfoValid[u8DrvId] = FALSE;
1686*53ee8cc1Swenshuai.xi     bStepDec[u8DrvId] = FALSE;
1687*53ee8cc1Swenshuai.xi 
1688*53ee8cc1Swenshuai.xi     MJPEG_DEBUG("MApi_MJPEG_FlushQueue()!!!!!!!!!\n");
1689*53ee8cc1Swenshuai.xi     __u32WritePtr[u8DrvId] = 0;
1690*53ee8cc1Swenshuai.xi     __u32ReadPtr[u8DrvId] = 0;
1691*53ee8cc1Swenshuai.xi     u32EndAddr[u8DrvId] = 0;
1692*53ee8cc1Swenshuai.xi 
1693*53ee8cc1Swenshuai.xi     MDrv_MJPEG_InitFlush(u32Id);
1694*53ee8cc1Swenshuai.xi     if (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_FLUSH_DISP_QUEUE, 0xFFFFFFFF) == 0)
1695*53ee8cc1Swenshuai.xi     {
1696*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_FlushQueue : E_MJPEG_RET_FAIL\n");
1697*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
1698*53ee8cc1Swenshuai.xi     }
1699*53ee8cc1Swenshuai.xi 
1700*53ee8cc1Swenshuai.xi 
1701*53ee8cc1Swenshuai.xi #if USE_MJPEG_SHAREMEMORY
1702*53ee8cc1Swenshuai.xi     while(MDrv_MJPEG_IsFlushDone(u32Id)==0);
1703*53ee8cc1Swenshuai.xi #else
1704*53ee8cc1Swenshuai.xi     while (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_IS_FLUSH_DONE, 0xFFFFFFFF) == 0)
1705*53ee8cc1Swenshuai.xi     {
1706*53ee8cc1Swenshuai.xi         printf ("Wait for flush done\n");
1707*53ee8cc1Swenshuai.xi     }
1708*53ee8cc1Swenshuai.xi #endif
1709*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_FlushQueue : E_MJPEG_RET_SUCCESS\n");
1710*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1711*53ee8cc1Swenshuai.xi }
1712*53ee8cc1Swenshuai.xi 
1713*53ee8cc1Swenshuai.xi /******************************************************************************/
1714*53ee8cc1Swenshuai.xi ///Description
1715*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1716*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1717*53ee8cc1Swenshuai.xi ///@return status
1718*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetESWritePtr(MS_U32 u32Id)1719*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetESWritePtr(MS_U32 u32Id)
1720*53ee8cc1Swenshuai.xi {
1721*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1722*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1723*53ee8cc1Swenshuai.xi     {
1724*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1725*53ee8cc1Swenshuai.xi     }
1726*53ee8cc1Swenshuai.xi     // return end of data
1727*53ee8cc1Swenshuai.xi     return __u32WritePtr[u8DrvId];
1728*53ee8cc1Swenshuai.xi }
1729*53ee8cc1Swenshuai.xi 
1730*53ee8cc1Swenshuai.xi /******************************************************************************/
1731*53ee8cc1Swenshuai.xi ///Description
1732*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1733*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1734*53ee8cc1Swenshuai.xi ///@return status
1735*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetESReadPtr(MS_U32 u32Id)1736*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetESReadPtr(MS_U32 u32Id)
1737*53ee8cc1Swenshuai.xi {
1738*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1739*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1740*53ee8cc1Swenshuai.xi     {
1741*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1742*53ee8cc1Swenshuai.xi     }
1743*53ee8cc1Swenshuai.xi     // return end of data
1744*53ee8cc1Swenshuai.xi     return __u32ReadPtr[u8DrvId];
1745*53ee8cc1Swenshuai.xi }
1746*53ee8cc1Swenshuai.xi 
1747*53ee8cc1Swenshuai.xi /******************************************************************************/
1748*53ee8cc1Swenshuai.xi ///Description
1749*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1750*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1751*53ee8cc1Swenshuai.xi ///@return status
1752*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_EnableLastFrameShow(MS_U32 u32Id,MS_BOOL bEnable)1753*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_EnableLastFrameShow(MS_U32 u32Id, MS_BOOL bEnable)
1754*53ee8cc1Swenshuai.xi {
1755*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1756*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1757*53ee8cc1Swenshuai.xi     {
1758*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1759*53ee8cc1Swenshuai.xi     }
1760*53ee8cc1Swenshuai.xi     bLstFrame[u8DrvId] = bEnable;
1761*53ee8cc1Swenshuai.xi     // This function always returns true.
1762*53ee8cc1Swenshuai.xi     // Because MJPEG firmware does not reserve any frame.
1763*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1764*53ee8cc1Swenshuai.xi }
1765*53ee8cc1Swenshuai.xi 
1766*53ee8cc1Swenshuai.xi /******************************************************************************/
1767*53ee8cc1Swenshuai.xi ///Description
1768*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1769*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1770*53ee8cc1Swenshuai.xi ///@return status
1771*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsDispFinish(MS_U32 u32Id)1772*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsDispFinish(MS_U32 u32Id)
1773*53ee8cc1Swenshuai.xi {
1774*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1775*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1776*53ee8cc1Swenshuai.xi     {
1777*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1778*53ee8cc1Swenshuai.xi     }
1779*53ee8cc1Swenshuai.xi     // Check if the last frame decode finish,
1780*53ee8cc1Swenshuai.xi     // Call this function to set E_MJPEG_CMD_SET_FRAME_BUFF_IDX_READY
1781*53ee8cc1Swenshuai.xi     // when decode done.
1782*53ee8cc1Swenshuai.xi //    MJPEG_Result ret;
1783*53ee8cc1Swenshuai.xi     if (bLstFrame[u8DrvId] == 0)
1784*53ee8cc1Swenshuai.xi     {
1785*53ee8cc1Swenshuai.xi         return FALSE;
1786*53ee8cc1Swenshuai.xi     }
1787*53ee8cc1Swenshuai.xi //    ret = __MApi_MJPEG_CheckDecodeDone(u32Id);
1788*53ee8cc1Swenshuai.xi 
1789*53ee8cc1Swenshuai.xi     if(E_MJPEG_RET_SUCCESS != __MApi_MJPEG_CheckDecodeDone(u32Id))
1790*53ee8cc1Swenshuai.xi     {
1791*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("MApi_MJPEG_IsDispFinish: MApi_MJPEG_CheckDecodeDone Fail!!\n");
1792*53ee8cc1Swenshuai.xi         return FALSE;
1793*53ee8cc1Swenshuai.xi     }
1794*53ee8cc1Swenshuai.xi 
1795*53ee8cc1Swenshuai.xi     if (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_IS_DISP_FINISH, 0xFFFFFFFF) == 0)
1796*53ee8cc1Swenshuai.xi     {
1797*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsDispFinish : FALSE\n");
1798*53ee8cc1Swenshuai.xi         return FALSE;
1799*53ee8cc1Swenshuai.xi     }
1800*53ee8cc1Swenshuai.xi 
1801*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsDispFinish : TRUE\n");
1802*53ee8cc1Swenshuai.xi     return TRUE;
1803*53ee8cc1Swenshuai.xi }
1804*53ee8cc1Swenshuai.xi 
1805*53ee8cc1Swenshuai.xi /******************************************************************************/
1806*53ee8cc1Swenshuai.xi ///Description
1807*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1808*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1809*53ee8cc1Swenshuai.xi ///@return status
1810*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_SetSpeed(MS_U32 u32Id,MJPEG_SpeedType eSpeedType,MJPEG_DispSpeed eDispSpeed)1811*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SetSpeed(MS_U32 u32Id, MJPEG_SpeedType eSpeedType, MJPEG_DispSpeed eDispSpeed)
1812*53ee8cc1Swenshuai.xi {
1813*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1814*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1815*53ee8cc1Swenshuai.xi     {
1816*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1817*53ee8cc1Swenshuai.xi     }
1818*53ee8cc1Swenshuai.xi     eCurSpeedType[u8DrvId] = eSpeedType;
1819*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_SPEED_TYPE, (MS_U32)eSpeedType);
1820*53ee8cc1Swenshuai.xi 
1821*53ee8cc1Swenshuai.xi     eCurDispSpeed[u8DrvId] = eDispSpeed;
1822*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_SPEED, (MS_U32)eDispSpeed);
1823*53ee8cc1Swenshuai.xi 
1824*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_STC_BASE, 0xFFFFFFFF);
1825*53ee8cc1Swenshuai.xi 
1826*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1827*53ee8cc1Swenshuai.xi }
1828*53ee8cc1Swenshuai.xi 
1829*53ee8cc1Swenshuai.xi /******************************************************************************/
1830*53ee8cc1Swenshuai.xi ///Description
1831*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1832*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1833*53ee8cc1Swenshuai.xi ///@return status
1834*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_SetFreezeDisp(MS_U32 u32Id,MS_BOOL bEnable)1835*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SetFreezeDisp(MS_U32 u32Id, MS_BOOL bEnable)
1836*53ee8cc1Swenshuai.xi {
1837*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1838*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1839*53ee8cc1Swenshuai.xi     {
1840*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1841*53ee8cc1Swenshuai.xi     }
1842*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_FREEZE_DISP, (MS_U32)bEnable);
1843*53ee8cc1Swenshuai.xi 
1844*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1845*53ee8cc1Swenshuai.xi }
1846*53ee8cc1Swenshuai.xi 
1847*53ee8cc1Swenshuai.xi /******************************************************************************/
1848*53ee8cc1Swenshuai.xi ///Description
1849*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1850*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1851*53ee8cc1Swenshuai.xi ///@return status
1852*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_SetBlueScreen(MS_U32 u32Id,MS_BOOL bOn)1853*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SetBlueScreen(MS_U32 u32Id, MS_BOOL bOn)
1854*53ee8cc1Swenshuai.xi {
1855*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1856*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1857*53ee8cc1Swenshuai.xi     {
1858*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1859*53ee8cc1Swenshuai.xi     }
1860*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_BLUE_SCREEN, (MS_U32)bOn);
1861*53ee8cc1Swenshuai.xi 
1862*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1863*53ee8cc1Swenshuai.xi }
1864*53ee8cc1Swenshuai.xi 
1865*53ee8cc1Swenshuai.xi /******************************************************************************/
1866*53ee8cc1Swenshuai.xi ///Reset PTS value
1867*53ee8cc1Swenshuai.xi ///@param u32Value \b IN new PTS value
1868*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_ResetPTS(MS_U32 u32Id,MS_U32 u32PtsBase)1869*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_ResetPTS(MS_U32 u32Id, MS_U32 u32PtsBase)
1870*53ee8cc1Swenshuai.xi {
1871*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1872*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1873*53ee8cc1Swenshuai.xi     {
1874*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1875*53ee8cc1Swenshuai.xi     }
1876*53ee8cc1Swenshuai.xi     if (MDrv_MJPEG_ResetPTS(u32Id, u32PtsBase))
1877*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_SUCCESS;
1878*53ee8cc1Swenshuai.xi 
1879*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
1880*53ee8cc1Swenshuai.xi }
1881*53ee8cc1Swenshuai.xi 
1882*53ee8cc1Swenshuai.xi /******************************************************************************/
1883*53ee8cc1Swenshuai.xi ///Return PTS of current displayed frame
1884*53ee8cc1Swenshuai.xi ///@return PTS
1885*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetPTS(MS_U32 u32Id)1886*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetPTS(MS_U32 u32Id)
1887*53ee8cc1Swenshuai.xi {
1888*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1889*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1890*53ee8cc1Swenshuai.xi     {
1891*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1892*53ee8cc1Swenshuai.xi     }
1893*53ee8cc1Swenshuai.xi     return MDrv_MJPEG_GetPTS(u32Id);
1894*53ee8cc1Swenshuai.xi }
1895*53ee8cc1Swenshuai.xi 
1896*53ee8cc1Swenshuai.xi /******************************************************************************/
1897*53ee8cc1Swenshuai.xi ///Description
1898*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1899*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1900*53ee8cc1Swenshuai.xi ///@return status
1901*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_AVSyncOn(MS_U32 u32Id,MS_BOOL bOn,MS_U32 u32SyncDelay,MS_U16 u16SyncTolerance)1902*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_AVSyncOn(MS_U32 u32Id, MS_BOOL bOn, MS_U32 u32SyncDelay, MS_U16 u16SyncTolerance)
1903*53ee8cc1Swenshuai.xi {
1904*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1905*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1906*53ee8cc1Swenshuai.xi     {
1907*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1908*53ee8cc1Swenshuai.xi     }
1909*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_ENABLE_AVSYNC, (MS_U32)bOn);
1910*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_AVSYNC_DELAY, (MS_U32)u32SyncDelay);
1911*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_AVSYNC_TOLERENCE, (MS_U32)u16SyncTolerance);
1912*53ee8cc1Swenshuai.xi 
1913*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1914*53ee8cc1Swenshuai.xi }
1915*53ee8cc1Swenshuai.xi 
1916*53ee8cc1Swenshuai.xi /******************************************************************************/
1917*53ee8cc1Swenshuai.xi ///Description
1918*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1919*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1920*53ee8cc1Swenshuai.xi ///@return status
1921*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsAVSyncOn(MS_U32 u32Id)1922*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsAVSyncOn(MS_U32 u32Id)
1923*53ee8cc1Swenshuai.xi {
1924*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1925*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1926*53ee8cc1Swenshuai.xi     {
1927*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1928*53ee8cc1Swenshuai.xi     }
1929*53ee8cc1Swenshuai.xi #if USE_MJPEG_SHAREMEMORY
1930*53ee8cc1Swenshuai.xi     return MDrv_MJPEG_IsAVSyncOn(u32Id);
1931*53ee8cc1Swenshuai.xi #else
1932*53ee8cc1Swenshuai.xi     return MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_IS_AVSYNC_ON, 0xFFFFFFFF);
1933*53ee8cc1Swenshuai.xi #endif
1934*53ee8cc1Swenshuai.xi }
1935*53ee8cc1Swenshuai.xi 
1936*53ee8cc1Swenshuai.xi /******************************************************************************/
1937*53ee8cc1Swenshuai.xi ///Description
1938*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1939*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1940*53ee8cc1Swenshuai.xi ///@return status
1941*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsReachSync(MS_U32 u32Id)1942*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsReachSync(MS_U32 u32Id)
1943*53ee8cc1Swenshuai.xi {
1944*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1945*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1946*53ee8cc1Swenshuai.xi     {
1947*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1948*53ee8cc1Swenshuai.xi     }
1949*53ee8cc1Swenshuai.xi #if USE_MJPEG_SHAREMEMORY
1950*53ee8cc1Swenshuai.xi     return MDrv_MJPEG_IsReachAVSync(u32Id);
1951*53ee8cc1Swenshuai.xi #else
1952*53ee8cc1Swenshuai.xi     return MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_IS_REACH_AVSYNC, 0xFFFFFFFF);
1953*53ee8cc1Swenshuai.xi #endif
1954*53ee8cc1Swenshuai.xi }
1955*53ee8cc1Swenshuai.xi 
1956*53ee8cc1Swenshuai.xi /******************************************************************************/
1957*53ee8cc1Swenshuai.xi ///Description
1958*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1959*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1960*53ee8cc1Swenshuai.xi ///@return status
1961*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetStatus(MS_U32 u32Id,MJPEG_Status * pStatus)1962*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_GetStatus(MS_U32 u32Id, MJPEG_Status *pStatus)
1963*53ee8cc1Swenshuai.xi {
1964*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1965*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1966*53ee8cc1Swenshuai.xi     {
1967*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1968*53ee8cc1Swenshuai.xi     }
1969*53ee8cc1Swenshuai.xi     pStatus->bIdle = MApi_MJPEG_IsIdle(u32Id);
1970*53ee8cc1Swenshuai.xi     //pStatus->bInit
1971*53ee8cc1Swenshuai.xi     //pStatus->eStage = E_MJPEG_STAGE_PLAY;
1972*53ee8cc1Swenshuai.xi 
1973*53ee8cc1Swenshuai.xi     return FALSE;
1974*53ee8cc1Swenshuai.xi }
1975*53ee8cc1Swenshuai.xi 
1976*53ee8cc1Swenshuai.xi /******************************************************************************/
1977*53ee8cc1Swenshuai.xi ///Return JPD error code
1978*53ee8cc1Swenshuai.xi ///@return JPD error code
1979*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetErrCode(MS_U32 u32Id)1980*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetErrCode(MS_U32 u32Id)
1981*53ee8cc1Swenshuai.xi {
1982*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1983*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
1984*53ee8cc1Swenshuai.xi     {
1985*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
1986*53ee8cc1Swenshuai.xi     }
1987*53ee8cc1Swenshuai.xi     // Per XDemux's request, this only returns critical error.
1988*53ee8cc1Swenshuai.xi     // Since no error would prevent JPD from decoding next JPEG,
1989*53ee8cc1Swenshuai.xi     // it always return 0 here.
1990*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("MApi_MJPEG_GetErrCode() with eMJPEGErrCode=0x%x\n", eMJPEGErrCode[u8DrvId]);
1991*53ee8cc1Swenshuai.xi     return eMJPEGErrCode[u8DrvId];
1992*53ee8cc1Swenshuai.xi }
1993*53ee8cc1Swenshuai.xi 
1994*53ee8cc1Swenshuai.xi /******************************************************************************/
1995*53ee8cc1Swenshuai.xi ///Description
1996*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1997*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1998*53ee8cc1Swenshuai.xi ///@return status
1999*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetErrCnt(MS_U32 u32Id)2000*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetErrCnt(MS_U32 u32Id)
2001*53ee8cc1Swenshuai.xi {
2002*53ee8cc1Swenshuai.xi #if SUPPORT_SKIP_ERROR_FRAME
2003*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2004*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2005*53ee8cc1Swenshuai.xi     {
2006*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2007*53ee8cc1Swenshuai.xi     }
2008*53ee8cc1Swenshuai.xi     return _u32ErrCnt[u8DrvId];
2009*53ee8cc1Swenshuai.xi #else
2010*53ee8cc1Swenshuai.xi     return 0;
2011*53ee8cc1Swenshuai.xi #endif
2012*53ee8cc1Swenshuai.xi }
2013*53ee8cc1Swenshuai.xi 
2014*53ee8cc1Swenshuai.xi /******************************************************************************/
2015*53ee8cc1Swenshuai.xi ///Description
2016*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2017*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2018*53ee8cc1Swenshuai.xi ///@return status
2019*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetSkipCnt(MS_U32 u32Id)2020*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetSkipCnt(MS_U32 u32Id)
2021*53ee8cc1Swenshuai.xi {
2022*53ee8cc1Swenshuai.xi #if SUPPORT_SKIP_ERROR_FRAME
2023*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2024*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2025*53ee8cc1Swenshuai.xi     {
2026*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2027*53ee8cc1Swenshuai.xi     }
2028*53ee8cc1Swenshuai.xi     return _u32SkipCnt[u8DrvId];
2029*53ee8cc1Swenshuai.xi #else
2030*53ee8cc1Swenshuai.xi     return 0;
2031*53ee8cc1Swenshuai.xi #endif
2032*53ee8cc1Swenshuai.xi }
2033*53ee8cc1Swenshuai.xi /******************************************************************************/
2034*53ee8cc1Swenshuai.xi ///Return count of current displayed frame
2035*53ee8cc1Swenshuai.xi ///@return frame count
2036*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetFrameCnt(MS_U32 u32Id)2037*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetFrameCnt(MS_U32 u32Id)
2038*53ee8cc1Swenshuai.xi {
2039*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2040*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2041*53ee8cc1Swenshuai.xi     {
2042*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2043*53ee8cc1Swenshuai.xi     }
2044*53ee8cc1Swenshuai.xi     return __u32FrameCnt[u8DrvId];
2045*53ee8cc1Swenshuai.xi }
2046*53ee8cc1Swenshuai.xi 
2047*53ee8cc1Swenshuai.xi /******************************************************************************/
2048*53ee8cc1Swenshuai.xi ///Return video information
2049*53ee8cc1Swenshuai.xi ///@param pInfo \b OUT video information: width & height
2050*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetDispInfo(MS_U32 u32Id,MJPEG_DISP_INFO * pInfo)2051*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_GetDispInfo(MS_U32 u32Id, MJPEG_DISP_INFO *pInfo)
2052*53ee8cc1Swenshuai.xi {
2053*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2054*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2055*53ee8cc1Swenshuai.xi     {
2056*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2057*53ee8cc1Swenshuai.xi     }
2058*53ee8cc1Swenshuai.xi     // APP wants pitch to setup display
2059*53ee8cc1Swenshuai.xi     // This should be used with crop information
2060*53ee8cc1Swenshuai.xi 
2061*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("MApi_MJPEG_GetDispInfo() with __u16Pitch=%d, __u16Height=%d, __u16Width=%d\n",
2062*53ee8cc1Swenshuai.xi     __u16Pitch[u8DrvId], __u16Height[u8DrvId], __u16Width[u8DrvId]);
2063*53ee8cc1Swenshuai.xi     pInfo->u16Width = __u16Pitch[u8DrvId];
2064*53ee8cc1Swenshuai.xi     pInfo->u16Height = __u16Height[u8DrvId];
2065*53ee8cc1Swenshuai.xi     pInfo->u16Pitch = __u16Pitch[u8DrvId];
2066*53ee8cc1Swenshuai.xi     if(__u32FrameRateBase[u8DrvId] !=0)
2067*53ee8cc1Swenshuai.xi     {
2068*53ee8cc1Swenshuai.xi         pInfo->u32FrameRate = __u32FrameRate[u8DrvId] * 1000 / __u32FrameRateBase[u8DrvId];
2069*53ee8cc1Swenshuai.xi     }
2070*53ee8cc1Swenshuai.xi     else
2071*53ee8cc1Swenshuai.xi     {
2072*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_ERR("Error!!! __u32FrameRateBase==0!!!!!\n");
2073*53ee8cc1Swenshuai.xi     }
2074*53ee8cc1Swenshuai.xi 
2075*53ee8cc1Swenshuai.xi     pInfo->u16CropLeft = (pInfo->u16Width - __u16Width[u8DrvId])/2;
2076*53ee8cc1Swenshuai.xi     pInfo->u16CropRight = pInfo->u16Width - __u16Width[u8DrvId] - pInfo->u16CropLeft;
2077*53ee8cc1Swenshuai.xi     pInfo->u16CropTop = (pInfo->u16Height - __u16Height[u8DrvId])/2;
2078*53ee8cc1Swenshuai.xi     pInfo->u16CropBottom = pInfo->u16Height - __u16Height[u8DrvId] - pInfo->u16CropTop;
2079*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("   Crop info right %d, left %d, bottom %d, top %d\n",
2080*53ee8cc1Swenshuai.xi         pInfo->u16CropRight, pInfo->u16CropLeft, pInfo->u16CropBottom, pInfo->u16CropTop);
2081*53ee8cc1Swenshuai.xi 
2082*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2083*53ee8cc1Swenshuai.xi }
2084*53ee8cc1Swenshuai.xi 
2085*53ee8cc1Swenshuai.xi /******************************************************************************/
2086*53ee8cc1Swenshuai.xi ///Description
2087*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2088*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2089*53ee8cc1Swenshuai.xi ///@return status
2090*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsPlaying(MS_U32 u32Id)2091*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsPlaying(MS_U32 u32Id)
2092*53ee8cc1Swenshuai.xi {
2093*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2094*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2095*53ee8cc1Swenshuai.xi     {
2096*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2097*53ee8cc1Swenshuai.xi     }
2098*53ee8cc1Swenshuai.xi #if USE_MJPEG_SHAREMEMORY
2099*53ee8cc1Swenshuai.xi     return MDrv_MJPEG_IsPlaying(u32Id);
2100*53ee8cc1Swenshuai.xi #else
2101*53ee8cc1Swenshuai.xi     if (MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_IS_PLAYING, 0xFFFFFFFF) == 0)
2102*53ee8cc1Swenshuai.xi     {
2103*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsPlaying : FALSE\n");
2104*53ee8cc1Swenshuai.xi         return FALSE;
2105*53ee8cc1Swenshuai.xi     }
2106*53ee8cc1Swenshuai.xi 
2107*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsPlaying : TRUE\n");
2108*53ee8cc1Swenshuai.xi     return TRUE;
2109*53ee8cc1Swenshuai.xi #endif
2110*53ee8cc1Swenshuai.xi }
2111*53ee8cc1Swenshuai.xi 
2112*53ee8cc1Swenshuai.xi /******************************************************************************/
2113*53ee8cc1Swenshuai.xi ///Return true if idle, including decode done & error
2114*53ee8cc1Swenshuai.xi ///@return idle or not
2115*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsIdle(MS_U32 u32Id)2116*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsIdle(MS_U32 u32Id)
2117*53ee8cc1Swenshuai.xi {
2118*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2119*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2120*53ee8cc1Swenshuai.xi     {
2121*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2122*53ee8cc1Swenshuai.xi     }
2123*53ee8cc1Swenshuai.xi     JPEG_Event u16Value = MApi_JPEG_GetJPDEventFlag();
2124*53ee8cc1Swenshuai.xi     if ((E_JPEG_EVENT_DEC_DONE & u16Value)
2125*53ee8cc1Swenshuai.xi     || (E_JPEG_EVENT_DEC_ERROR_MASK & u16Value))
2126*53ee8cc1Swenshuai.xi     {
2127*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsIdle : TRUE\n");
2128*53ee8cc1Swenshuai.xi         return TRUE;
2129*53ee8cc1Swenshuai.xi     }
2130*53ee8cc1Swenshuai.xi 
2131*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsIdle : FALSE\n");
2132*53ee8cc1Swenshuai.xi     return FALSE;
2133*53ee8cc1Swenshuai.xi }
2134*53ee8cc1Swenshuai.xi 
2135*53ee8cc1Swenshuai.xi /******************************************************************************/
2136*53ee8cc1Swenshuai.xi ///Description
2137*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2138*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2139*53ee8cc1Swenshuai.xi ///@return status
2140*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsIFrameFound(MS_U32 u32Id)2141*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsIFrameFound(MS_U32 u32Id)
2142*53ee8cc1Swenshuai.xi {
2143*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2144*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2145*53ee8cc1Swenshuai.xi     {
2146*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2147*53ee8cc1Swenshuai.xi     }
2148*53ee8cc1Swenshuai.xi     return TRUE;
2149*53ee8cc1Swenshuai.xi }
2150*53ee8cc1Swenshuai.xi 
2151*53ee8cc1Swenshuai.xi /******************************************************************************/
2152*53ee8cc1Swenshuai.xi ///Description
2153*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2154*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2155*53ee8cc1Swenshuai.xi ///@return status
2156*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsWithLowDelay(MS_U32 u32Id)2157*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsWithLowDelay(MS_U32 u32Id)
2158*53ee8cc1Swenshuai.xi {
2159*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2160*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2161*53ee8cc1Swenshuai.xi     {
2162*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2163*53ee8cc1Swenshuai.xi     }
2164*53ee8cc1Swenshuai.xi     return TRUE;
2165*53ee8cc1Swenshuai.xi }
2166*53ee8cc1Swenshuai.xi 
2167*53ee8cc1Swenshuai.xi /******************************************************************************/
2168*53ee8cc1Swenshuai.xi ///Description
2169*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2170*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2171*53ee8cc1Swenshuai.xi ///@return status
2172*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetDecFrameInfo(MS_U32 u32Id,MJPEG_FrameInfo * pFrmInfo)2173*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_GetDecFrameInfo(MS_U32 u32Id, MJPEG_FrameInfo *pFrmInfo)
2174*53ee8cc1Swenshuai.xi {
2175*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2176*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2177*53ee8cc1Swenshuai.xi     {
2178*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2179*53ee8cc1Swenshuai.xi     }
2180*53ee8cc1Swenshuai.xi     if(FALSE == isDecFrameInfoValid[u8DrvId])
2181*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
2182*53ee8cc1Swenshuai.xi 
2183*53ee8cc1Swenshuai.xi     pFrmInfo->u32LumaAddr = infoDecFrame[u8DrvId].u32LumaAddr;
2184*53ee8cc1Swenshuai.xi     pFrmInfo->u32ChromaAddr = infoDecFrame[u8DrvId].u32ChromaAddr;
2185*53ee8cc1Swenshuai.xi     pFrmInfo->u32TimeStamp = infoDecFrame[u8DrvId].u32TimeStamp;
2186*53ee8cc1Swenshuai.xi     pFrmInfo->u32ID_L = infoDecFrame[u8DrvId].u32ID_L;
2187*53ee8cc1Swenshuai.xi     pFrmInfo->u32ID_H = infoDecFrame[u8DrvId].u32ID_H;
2188*53ee8cc1Swenshuai.xi     pFrmInfo->u16Pitch = infoDecFrame[u8DrvId].u16Pitch;
2189*53ee8cc1Swenshuai.xi     pFrmInfo->u16Width = infoDecFrame[u8DrvId].u16Width;
2190*53ee8cc1Swenshuai.xi     pFrmInfo->u16Height = infoDecFrame[u8DrvId].u16Height;
2191*53ee8cc1Swenshuai.xi     pFrmInfo->eFrameType = E_MJPEG_FRM_TYPE_I;
2192*53ee8cc1Swenshuai.xi 
2193*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2194*53ee8cc1Swenshuai.xi }
2195*53ee8cc1Swenshuai.xi 
2196*53ee8cc1Swenshuai.xi /******************************************************************************/
2197*53ee8cc1Swenshuai.xi ///Description
2198*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2199*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2200*53ee8cc1Swenshuai.xi ///@return status
2201*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetDispFrameInfo(MS_U32 u32Id,MJPEG_FrameInfo * pFrmInfo)2202*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_GetDispFrameInfo(MS_U32 u32Id, MJPEG_FrameInfo *pFrmInfo)
2203*53ee8cc1Swenshuai.xi {
2204*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2205*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2206*53ee8cc1Swenshuai.xi     {
2207*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2208*53ee8cc1Swenshuai.xi     }
2209*53ee8cc1Swenshuai.xi     #if ENABLE_AVSYNC_ID_CHECK
2210*53ee8cc1Swenshuai.xi     static MS_U32 u32OldID_L = 0, u32OldID_H = 0, u32OldTimeStamp = 0;
2211*53ee8cc1Swenshuai.xi     #endif
2212*53ee8cc1Swenshuai.xi     MJPEG_FrameInfo info;
2213*53ee8cc1Swenshuai.xi     MDrv_MJPEG_GetDispFrameInfo(u32Id, (void *)&info);
2214*53ee8cc1Swenshuai.xi 
2215*53ee8cc1Swenshuai.xi     pFrmInfo->u32LumaAddr = info.u32LumaAddr;
2216*53ee8cc1Swenshuai.xi     pFrmInfo->u32ChromaAddr = info.u32ChromaAddr;
2217*53ee8cc1Swenshuai.xi     pFrmInfo->u32TimeStamp = info.u32TimeStamp;
2218*53ee8cc1Swenshuai.xi     pFrmInfo->u32ID_L = info.u32ID_L;
2219*53ee8cc1Swenshuai.xi     pFrmInfo->u32ID_H = info.u32ID_H;
2220*53ee8cc1Swenshuai.xi     pFrmInfo->u16Pitch = __u16Pitch[u8DrvId];
2221*53ee8cc1Swenshuai.xi     pFrmInfo->u16Width = __u16Width[u8DrvId];
2222*53ee8cc1Swenshuai.xi     pFrmInfo->u16Height = __u16Height[u8DrvId];
2223*53ee8cc1Swenshuai.xi     pFrmInfo->eFrameType = E_MJPEG_FRM_TYPE_I;
2224*53ee8cc1Swenshuai.xi 
2225*53ee8cc1Swenshuai.xi     #if ENABLE_AVSYNC_ID_CHECK
2226*53ee8cc1Swenshuai.xi     if (u32OldID_H != pFrmInfo->u32ID_H || u32OldID_L != pFrmInfo->u32ID_L
2227*53ee8cc1Swenshuai.xi         || u32OldTimeStamp != pFrmInfo->u32TimeStamp)
2228*53ee8cc1Swenshuai.xi     {
2229*53ee8cc1Swenshuai.xi         printf ("ID 0x%08lx%08lx    PTS %ld     addr 0x%lx\n",
2230*53ee8cc1Swenshuai.xi             pFrmInfo->u32ID_H, pFrmInfo->u32ID_L, pFrmInfo->u32TimeStamp, pFrmInfo->u32LumaAddr);
2231*53ee8cc1Swenshuai.xi         u32OldID_H = pFrmInfo->u32ID_H;
2232*53ee8cc1Swenshuai.xi         u32OldID_L = pFrmInfo->u32ID_L;
2233*53ee8cc1Swenshuai.xi         u32OldTimeStamp = pFrmInfo->u32TimeStamp;
2234*53ee8cc1Swenshuai.xi     }
2235*53ee8cc1Swenshuai.xi     #endif
2236*53ee8cc1Swenshuai.xi 
2237*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2238*53ee8cc1Swenshuai.xi }
2239*53ee8cc1Swenshuai.xi 
2240*53ee8cc1Swenshuai.xi /******************************************************************************/
2241*53ee8cc1Swenshuai.xi ///Description
2242*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2243*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2244*53ee8cc1Swenshuai.xi ///@return status
2245*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_DbgSetMsgLevel(MJPEG_DbgLevel eDbgLevel)2246*53ee8cc1Swenshuai.xi void MApi_MJPEG_DbgSetMsgLevel(MJPEG_DbgLevel eDbgLevel)
2247*53ee8cc1Swenshuai.xi {
2248*53ee8cc1Swenshuai.xi     MS_U8 u8Level;
2249*53ee8cc1Swenshuai.xi 
2250*53ee8cc1Swenshuai.xi     switch (eDbgLevel)
2251*53ee8cc1Swenshuai.xi     {
2252*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_ERR:
2253*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_ERR;
2254*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_ERR;
2255*53ee8cc1Swenshuai.xi         break;
2256*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_INFO:
2257*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_ERR;
2258*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_MJPEG | E_JPEG_DEBUG_ERR;
2259*53ee8cc1Swenshuai.xi         break;
2260*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_DBG:
2261*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_ALL;
2262*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_MJPEG | E_JPEG_DEBUG_API | E_JPEG_DEBUG_ERR;
2263*53ee8cc1Swenshuai.xi         break;
2264*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_TRACE:
2265*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_ALL;
2266*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_MJPEG | E_JPEG_DEBUG_API | E_JPEG_DEBUG_ERR;
2267*53ee8cc1Swenshuai.xi         break;
2268*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_FW:
2269*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_NONE;
2270*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
2271*53ee8cc1Swenshuai.xi         break;
2272*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_NONE:
2273*53ee8cc1Swenshuai.xi     default:
2274*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_NONE;
2275*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
2276*53ee8cc1Swenshuai.xi         break;
2277*53ee8cc1Swenshuai.xi     }
2278*53ee8cc1Swenshuai.xi 
2279*53ee8cc1Swenshuai.xi     MApi_JPEG_SetDbgLevel(u8Level);
2280*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SetDbgLevel(u8Level);
2281*53ee8cc1Swenshuai.xi }
2282*53ee8cc1Swenshuai.xi 
2283*53ee8cc1Swenshuai.xi /******************************************************************************/
2284*53ee8cc1Swenshuai.xi ///Description
2285*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2286*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2287*53ee8cc1Swenshuai.xi ///@return status
2288*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_DbgSetData(MS_U32 u32Id,MS_PHY u32Addr,MS_U32 u32Data)2289*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_DbgSetData(MS_U32 u32Id, MS_PHY u32Addr, MS_U32 u32Data)
2290*53ee8cc1Swenshuai.xi {
2291*53ee8cc1Swenshuai.xi     UNUSED(u32Id);
2292*53ee8cc1Swenshuai.xi     u32Addr = u32Addr;
2293*53ee8cc1Swenshuai.xi     u32Data = u32Data;
2294*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2295*53ee8cc1Swenshuai.xi }
2296*53ee8cc1Swenshuai.xi 
2297*53ee8cc1Swenshuai.xi /******************************************************************************/
2298*53ee8cc1Swenshuai.xi ///Description
2299*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2300*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2301*53ee8cc1Swenshuai.xi ///@return status
2302*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_DbgGetData(MS_U32 u32Id,MS_PHY u32Addr,MS_U32 * u32Data)2303*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_DbgGetData(MS_U32 u32Id, MS_PHY u32Addr, MS_U32* u32Data)
2304*53ee8cc1Swenshuai.xi {
2305*53ee8cc1Swenshuai.xi     UNUSED(u32Id);
2306*53ee8cc1Swenshuai.xi     u32Addr = u32Addr;
2307*53ee8cc1Swenshuai.xi     *u32Data = 0;
2308*53ee8cc1Swenshuai.xi 
2309*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2310*53ee8cc1Swenshuai.xi }
2311*53ee8cc1Swenshuai.xi 
2312*53ee8cc1Swenshuai.xi /******************************************************************************/
2313*53ee8cc1Swenshuai.xi ///Description
2314*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2315*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2316*53ee8cc1Swenshuai.xi ///@return status
2317*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_DispFrame(MS_U32 u32Id,MS_U32 u32DispIdx)2318*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_DispFrame(MS_U32 u32Id, MS_U32 u32DispIdx)
2319*53ee8cc1Swenshuai.xi {
2320*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2321*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2322*53ee8cc1Swenshuai.xi     {
2323*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2324*53ee8cc1Swenshuai.xi     }
2325*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("MApi_MJPEG_DispFrame() with index=%ld\n", u32DispIdx);
2326*53ee8cc1Swenshuai.xi     MDrv_MJPEG_DispFrame(u32Id, u32DispIdx);
2327*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2328*53ee8cc1Swenshuai.xi }
2329*53ee8cc1Swenshuai.xi 
2330*53ee8cc1Swenshuai.xi /******************************************************************************/
2331*53ee8cc1Swenshuai.xi ///Description
2332*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2333*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2334*53ee8cc1Swenshuai.xi ///@return status
2335*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_FreeFrame(MS_U32 u32Id,MS_U32 u32DispIdx)2336*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_FreeFrame(MS_U32 u32Id, MS_U32 u32DispIdx)
2337*53ee8cc1Swenshuai.xi {
2338*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2339*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2340*53ee8cc1Swenshuai.xi     {
2341*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2342*53ee8cc1Swenshuai.xi     }
2343*53ee8cc1Swenshuai.xi     MDrv_MJPEG_FreeFrame(u32Id, u32DispIdx);
2344*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2345*53ee8cc1Swenshuai.xi }
2346*53ee8cc1Swenshuai.xi 
2347*53ee8cc1Swenshuai.xi /******************************************************************************/
2348*53ee8cc1Swenshuai.xi ///Description
2349*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2350*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2351*53ee8cc1Swenshuai.xi ///@return status
2352*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetNextDispFrame(MS_U32 u32Id,MJPEG_FrameInfo * pFrmInfo)2353*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_GetNextDispFrame(MS_U32 u32Id, MJPEG_FrameInfo *pFrmInfo)
2354*53ee8cc1Swenshuai.xi {
2355*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2356*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2357*53ee8cc1Swenshuai.xi     {
2358*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2359*53ee8cc1Swenshuai.xi     }
2360*53ee8cc1Swenshuai.xi     MJPEG_FrameInfo *pSrc = (MJPEG_FrameInfo*)MDrv_MJPEG_GetNextDispFrame(u32Id);
2361*53ee8cc1Swenshuai.xi     if (pSrc != NULL)
2362*53ee8cc1Swenshuai.xi     {
2363*53ee8cc1Swenshuai.xi         _MJPEG_Memcpy(pFrmInfo, pSrc, sizeof(MJPEG_FrameInfo));
2364*53ee8cc1Swenshuai.xi         pFrmInfo->u16Pitch = __u16Pitch[u8DrvId];
2365*53ee8cc1Swenshuai.xi         pFrmInfo->u16Width = __u16Width[u8DrvId];
2366*53ee8cc1Swenshuai.xi         pFrmInfo->u16Height = __u16Height[u8DrvId];
2367*53ee8cc1Swenshuai.xi         pFrmInfo->eFrameType = E_MJPEG_FRM_TYPE_I;
2368*53ee8cc1Swenshuai.xi 
2369*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_SUCCESS;
2370*53ee8cc1Swenshuai.xi     }
2371*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
2372*53ee8cc1Swenshuai.xi }
2373*53ee8cc1Swenshuai.xi 
2374*53ee8cc1Swenshuai.xi /******************************************************************************/
2375*53ee8cc1Swenshuai.xi ///Description
2376*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2377*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2378*53ee8cc1Swenshuai.xi ///@return status
2379*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetDispFrmNum(MS_U32 u32Id)2380*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetDispFrmNum(MS_U32 u32Id)
2381*53ee8cc1Swenshuai.xi {
2382*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2383*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2384*53ee8cc1Swenshuai.xi     {
2385*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2386*53ee8cc1Swenshuai.xi     }
2387*53ee8cc1Swenshuai.xi     return MDrv_MJPEG_GetDispFrameNum(u32Id);
2388*53ee8cc1Swenshuai.xi }
2389*53ee8cc1Swenshuai.xi 
2390*53ee8cc1Swenshuai.xi /******************************************************************************/
2391*53ee8cc1Swenshuai.xi ///Description
2392*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2393*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2394*53ee8cc1Swenshuai.xi ///@return status
2395*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetNextDispQPtr(MS_U32 u32Id)2396*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetNextDispQPtr(MS_U32 u32Id)
2397*53ee8cc1Swenshuai.xi {
2398*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2399*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2400*53ee8cc1Swenshuai.xi     {
2401*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2402*53ee8cc1Swenshuai.xi     }
2403*53ee8cc1Swenshuai.xi     return MDrv_MJPEG_GetNextDispQPtr(u32Id);
2404*53ee8cc1Swenshuai.xi }
2405*53ee8cc1Swenshuai.xi 
2406*53ee8cc1Swenshuai.xi /******************************************************************************/
2407*53ee8cc1Swenshuai.xi ///Description
2408*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2409*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2410*53ee8cc1Swenshuai.xi ///@return status
2411*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_EnableDispCmdQ(MS_U32 u32Id,MS_BOOL bEnable)2412*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_EnableDispCmdQ(MS_U32 u32Id, MS_BOOL bEnable)
2413*53ee8cc1Swenshuai.xi {
2414*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2415*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2416*53ee8cc1Swenshuai.xi     {
2417*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2418*53ee8cc1Swenshuai.xi     }
2419*53ee8cc1Swenshuai.xi     bEnableDispCmdQ[u8DrvId] = bEnable;
2420*53ee8cc1Swenshuai.xi 
2421*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_ENABLE_DISP_CMD_QUEUE, bEnable);
2422*53ee8cc1Swenshuai.xi 
2423*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2424*53ee8cc1Swenshuai.xi }
2425*53ee8cc1Swenshuai.xi 
2426*53ee8cc1Swenshuai.xi /******************************************************************************/
2427*53ee8cc1Swenshuai.xi ///Description
2428*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2429*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2430*53ee8cc1Swenshuai.xi ///@return status
2431*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_PushDispCmdQ(MS_U32 u32Id)2432*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_PushDispCmdQ(MS_U32 u32Id)
2433*53ee8cc1Swenshuai.xi {
2434*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2435*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2436*53ee8cc1Swenshuai.xi     {
2437*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2438*53ee8cc1Swenshuai.xi     }
2439*53ee8cc1Swenshuai.xi     if (bEnableDispCmdQ[u8DrvId])
2440*53ee8cc1Swenshuai.xi     {
2441*53ee8cc1Swenshuai.xi     }
2442*53ee8cc1Swenshuai.xi 
2443*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
2444*53ee8cc1Swenshuai.xi }
2445*53ee8cc1Swenshuai.xi 
2446*53ee8cc1Swenshuai.xi /******************************************************************************/
2447*53ee8cc1Swenshuai.xi ///Description
2448*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2449*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2450*53ee8cc1Swenshuai.xi ///@return status
2451*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetDispCmdQVacancy(MS_U32 u32Id)2452*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetDispCmdQVacancy( MS_U32 u32Id)
2453*53ee8cc1Swenshuai.xi {
2454*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2455*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2456*53ee8cc1Swenshuai.xi     {
2457*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2458*53ee8cc1Swenshuai.xi     }
2459*53ee8cc1Swenshuai.xi     if (bEnableDispCmdQ[u8DrvId])
2460*53ee8cc1Swenshuai.xi     {
2461*53ee8cc1Swenshuai.xi     }
2462*53ee8cc1Swenshuai.xi 
2463*53ee8cc1Swenshuai.xi     return 0;
2464*53ee8cc1Swenshuai.xi }
2465*53ee8cc1Swenshuai.xi 
2466*53ee8cc1Swenshuai.xi /******************************************************************************/
2467*53ee8cc1Swenshuai.xi ///Description
2468*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2469*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2470*53ee8cc1Swenshuai.xi ///@return status
2471*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_SeekToPTS(MS_U32 u32Id,MS_U32 u32PTS)2472*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SeekToPTS(MS_U32 u32Id, MS_U32 u32PTS)
2473*53ee8cc1Swenshuai.xi {
2474*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2475*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2476*53ee8cc1Swenshuai.xi     {
2477*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2478*53ee8cc1Swenshuai.xi     }
2479*53ee8cc1Swenshuai.xi     __bSeekToPts[u8DrvId] = TRUE;
2480*53ee8cc1Swenshuai.xi     __u32Skip2PtsBase[u8DrvId] = MApi_MJPEG_GetPTS(u32Id);
2481*53ee8cc1Swenshuai.xi     __u32TargetPts[u8DrvId] = u32PTS;
2482*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("   Seek from PTS %ld to %ld\n", __u32Skip2PtsBase[u8DrvId], __u32TargetPts[u8DrvId]);
2483*53ee8cc1Swenshuai.xi 
2484*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2485*53ee8cc1Swenshuai.xi }
2486*53ee8cc1Swenshuai.xi 
2487*53ee8cc1Swenshuai.xi /******************************************************************************/
2488*53ee8cc1Swenshuai.xi ///Description
2489*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2490*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2491*53ee8cc1Swenshuai.xi ///@return status
2492*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_SkipToPTS(MS_U32 u32Id,MS_U32 u32PTS)2493*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SkipToPTS(MS_U32 u32Id, MS_U32 u32PTS)
2494*53ee8cc1Swenshuai.xi {
2495*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2496*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2497*53ee8cc1Swenshuai.xi     {
2498*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2499*53ee8cc1Swenshuai.xi     }
2500*53ee8cc1Swenshuai.xi     __bSkipToPts[u8DrvId] = TRUE;
2501*53ee8cc1Swenshuai.xi     __u32Skip2PtsBase[u8DrvId] = MApi_MJPEG_GetPTS(u32Id);
2502*53ee8cc1Swenshuai.xi     __u32TargetPts[u8DrvId] = u32PTS;
2503*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("   Skip from PTS %ld to %ld\n", __u32Skip2PtsBase[u8DrvId], __u32TargetPts[u8DrvId]);
2504*53ee8cc1Swenshuai.xi 
2505*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2506*53ee8cc1Swenshuai.xi }
2507*53ee8cc1Swenshuai.xi 
2508*53ee8cc1Swenshuai.xi /******************************************************************************/
2509*53ee8cc1Swenshuai.xi ///Description : Enable/Disable FW turbo mode
2510*53ee8cc1Swenshuai.xi ///@param bEnable \b IN enable or not.
2511*53ee8cc1Swenshuai.xi ///@return NONE
2512*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_EnableTurboFWMode(MS_BOOL bEnable)2513*53ee8cc1Swenshuai.xi void MApi_MJPEG_EnableTurboFWMode(MS_BOOL bEnable)
2514*53ee8cc1Swenshuai.xi {
2515*53ee8cc1Swenshuai.xi     MDrv_MJPEG_EnableTurboFWMode(bEnable);
2516*53ee8cc1Swenshuai.xi }
2517*53ee8cc1Swenshuai.xi 
_MApi_MJPEG_SetDisplayOutSideMode(MS_U32 u32Id,MS_BOOL bOn)2518*53ee8cc1Swenshuai.xi static MJPEG_Result _MApi_MJPEG_SetDisplayOutSideMode(MS_U32 u32Id, MS_BOOL bOn)
2519*53ee8cc1Swenshuai.xi {
2520*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("MJPEG _VDEC_EX_DISP_OUTSIDE_MODE!!!!!! with %d\n", bOn);
2521*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_DISPLAY_OUTSIDE_MODE, (MS_U32)bOn);
2522*53ee8cc1Swenshuai.xi 
2523*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
2524*53ee8cc1Swenshuai.xi }
2525*53ee8cc1Swenshuai.xi 
2526*53ee8cc1Swenshuai.xi 
MApi_MJPEG_SetControl(MS_U32 u32Id,MJPEG_VDEC_Cmd cmd_id,MS_U32 param)2527*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SetControl(MS_U32 u32Id, MJPEG_VDEC_Cmd cmd_id, MS_U32 param)
2528*53ee8cc1Swenshuai.xi {
2529*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
2530*53ee8cc1Swenshuai.xi     if(MApi_JPEG_IsNJPD()==TRUE)
2531*53ee8cc1Swenshuai.xi     {
2532*53ee8cc1Swenshuai.xi         MApi_JPEG_SetNJPDInstance(u8DrvId);
2533*53ee8cc1Swenshuai.xi     }
2534*53ee8cc1Swenshuai.xi     MJPEG_Result eRet = E_MJPEG_RET_INVALID_PARAMETER;
2535*53ee8cc1Swenshuai.xi     switch(cmd_id)
2536*53ee8cc1Swenshuai.xi     {
2537*53ee8cc1Swenshuai.xi         case E_MJPEG_VDEC_CMD_SET_DISPLAY_OUTSIDE_MODE:
2538*53ee8cc1Swenshuai.xi             eRet = _MApi_MJPEG_SetDisplayOutSideMode(u32Id, (MS_BOOL)param);
2539*53ee8cc1Swenshuai.xi             break;
2540*53ee8cc1Swenshuai.xi         default:
2541*53ee8cc1Swenshuai.xi             break;
2542*53ee8cc1Swenshuai.xi 
2543*53ee8cc1Swenshuai.xi }
2544*53ee8cc1Swenshuai.xi     return eRet;
2545*53ee8cc1Swenshuai.xi }
2546*53ee8cc1Swenshuai.xi 
2547*53ee8cc1Swenshuai.xi /******************************************************************************/
2548*53ee8cc1Swenshuai.xi ///Description : GetFreeStream for Dual Decode
2549*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
2550*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
2551*53ee8cc1Swenshuai.xi ///@return status
2552*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetFreeStream(MS_U32 * pu32Id,MJPEG_API_StreamType eStreamType)2553*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_GetFreeStream(MS_U32 *pu32Id, MJPEG_API_StreamType eStreamType)
2554*53ee8cc1Swenshuai.xi {
2555*53ee8cc1Swenshuai.xi     MJPEG_Result eRet = E_MJPEG_RET_INVALID_PARAMETER;
2556*53ee8cc1Swenshuai.xi 
2557*53ee8cc1Swenshuai.xi     switch(eStreamType)
2558*53ee8cc1Swenshuai.xi     {
2559*53ee8cc1Swenshuai.xi         case E_MJPEG_API_MAIN_STREAM:
2560*53ee8cc1Swenshuai.xi         {
2561*53ee8cc1Swenshuai.xi             if (E_MJPEG_OK == MDrv_MJPEG_GetFreeStream(pu32Id, E_MJPEG_DRV_MAIN_STREAM))
2562*53ee8cc1Swenshuai.xi                 eRet = E_MJPEG_RET_SUCCESS;
2563*53ee8cc1Swenshuai.xi             else
2564*53ee8cc1Swenshuai.xi                 eRet = E_MJPEG_RET_FAIL;
2565*53ee8cc1Swenshuai.xi 
2566*53ee8cc1Swenshuai.xi             break;
2567*53ee8cc1Swenshuai.xi         }
2568*53ee8cc1Swenshuai.xi         case E_MJPEG_API_SUB_STREAM:
2569*53ee8cc1Swenshuai.xi         {
2570*53ee8cc1Swenshuai.xi             if (E_MJPEG_OK == MDrv_MJPEG_GetFreeStream(pu32Id, E_MJPEG_DRV_SUB_STREAM))
2571*53ee8cc1Swenshuai.xi                 eRet = E_MJPEG_RET_SUCCESS;
2572*53ee8cc1Swenshuai.xi             else
2573*53ee8cc1Swenshuai.xi                 eRet = E_MJPEG_RET_FAIL;
2574*53ee8cc1Swenshuai.xi 
2575*53ee8cc1Swenshuai.xi             break;
2576*53ee8cc1Swenshuai.xi         }
2577*53ee8cc1Swenshuai.xi         default:
2578*53ee8cc1Swenshuai.xi             break;
2579*53ee8cc1Swenshuai.xi     }
2580*53ee8cc1Swenshuai.xi 
2581*53ee8cc1Swenshuai.xi     return eRet;
2582*53ee8cc1Swenshuai.xi }
2583*53ee8cc1Swenshuai.xi 
2584*53ee8cc1Swenshuai.xi #endif
2585*53ee8cc1Swenshuai.xi 
2586