xref: /utopia/UTPA2-700.0.x/modules/vdec_v1/api/vdec/apiMJPEG_inc.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.h"
110*53ee8cc1Swenshuai.xi // RIU Base
111*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
112*53ee8cc1Swenshuai.xi 
113*53ee8cc1Swenshuai.xi 
114*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
115*53ee8cc1Swenshuai.xi //  Local Compiler Options
116*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
117*53ee8cc1Swenshuai.xi 
118*53ee8cc1Swenshuai.xi #define ENABLE_MJPEG_FIRMWARE           1
119*53ee8cc1Swenshuai.xi 
120*53ee8cc1Swenshuai.xi #define ENABLE_AVSYNC_ID_CHECK          0
121*53ee8cc1Swenshuai.xi 
122*53ee8cc1Swenshuai.xi #define ENABLE_DOUBLE_FRAMERATE         0
123*53ee8cc1Swenshuai.xi 
124*53ee8cc1Swenshuai.xi #if (defined(CHIP_T8))
125*53ee8cc1Swenshuai.xi #define DECODER_RENDER_ARCH     1
126*53ee8cc1Swenshuai.xi #else
127*53ee8cc1Swenshuai.xi #define DECODER_RENDER_ARCH     0
128*53ee8cc1Swenshuai.xi #endif
129*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
130*53ee8cc1Swenshuai.xi //  Local Defines
131*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
132*53ee8cc1Swenshuai.xi #define JPEGBASEWIDTHMAX    1600
133*53ee8cc1Swenshuai.xi #define JPEGBASEHEIGHTMAX   1200
134*53ee8cc1Swenshuai.xi #define JPEGPROWIDTHMAX     1024
135*53ee8cc1Swenshuai.xi #define JPEGPROHEIGHTMAX    768
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi #define MJPEG_MAX_SUPPORT_WIDTH     640
138*53ee8cc1Swenshuai.xi #define MJPEG_MAX_SUPPORT_HEIGHT     480
139*53ee8cc1Swenshuai.xi 
140*53ee8cc1Swenshuai.xi 
141*53ee8cc1Swenshuai.xi #define DISPLAY_QUEUE_NUM           4
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi 
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
146*53ee8cc1Swenshuai.xi //  Local Structures
147*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
148*53ee8cc1Swenshuai.xi #define _MJPEG_Memcpy(pDstAddr, pSrcAddr, u32Size)               \
149*53ee8cc1Swenshuai.xi     do {                                                        \
150*53ee8cc1Swenshuai.xi         MS_U32 i = 0;                                           \
151*53ee8cc1Swenshuai.xi         volatile MS_U8 *dst = (volatile MS_U8 *)(pDstAddr);     \
152*53ee8cc1Swenshuai.xi         volatile MS_U8 *src = (volatile MS_U8 *)(pSrcAddr);     \
153*53ee8cc1Swenshuai.xi         for (i = 0; i < (u32Size); i++)                         \
154*53ee8cc1Swenshuai.xi         {                                                       \
155*53ee8cc1Swenshuai.xi             dst[i] = src[i];                                    \
156*53ee8cc1Swenshuai.xi         }                                                       \
157*53ee8cc1Swenshuai.xi     } while (0)
158*53ee8cc1Swenshuai.xi 
159*53ee8cc1Swenshuai.xi #ifndef UNUSED
160*53ee8cc1Swenshuai.xi #define UNUSED(x) ((x)=(x))
161*53ee8cc1Swenshuai.xi #endif
162*53ee8cc1Swenshuai.xi 
163*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
164*53ee8cc1Swenshuai.xi //  Global Variables
165*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi 
168*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
169*53ee8cc1Swenshuai.xi //  Local Variables
170*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
171*53ee8cc1Swenshuai.xi static MS_BOOL bEnableDispCmdQ = TRUE;
172*53ee8cc1Swenshuai.xi 
173*53ee8cc1Swenshuai.xi //static MS_U32 __u32FwAddr = 0xFFFFFFFF;           // Address to load firmware
174*53ee8cc1Swenshuai.xi static MS_U32 __u32MRCBufAddr = 0;
175*53ee8cc1Swenshuai.xi //static MS_U32 __u32MRCBufSize = 0;
176*53ee8cc1Swenshuai.xi static MS_U32 __u32MWCBufAddr = 0;
177*53ee8cc1Swenshuai.xi #if defined(CHIP_MARIA10) ||  defined(CHIP_MACAW12) || defined(CHIP_EDEN) || defined(CHIP_EULER)
178*53ee8cc1Swenshuai.xi static MS_U32 __u32MWCBufSize = 0;
179*53ee8cc1Swenshuai.xi #endif
180*53ee8cc1Swenshuai.xi static MS_U32 __u32InternalBufAddr = 0;
181*53ee8cc1Swenshuai.xi static MS_U32 __u32InternalBufSize = 0;
182*53ee8cc1Swenshuai.xi 
183*53ee8cc1Swenshuai.xi static MS_U32 __u32ReadPtr = 0;
184*53ee8cc1Swenshuai.xi static MS_U32 __u32WritePtr = 0;
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi static MS_U32 __u32FrameCnt = 0;
187*53ee8cc1Swenshuai.xi static MS_U32 __u32FrameTime = 0;
188*53ee8cc1Swenshuai.xi static MS_U32 __u32FrameRate = 600;
189*53ee8cc1Swenshuai.xi static MS_U32 __u32FrameRateBase = 20;
190*53ee8cc1Swenshuai.xi 
191*53ee8cc1Swenshuai.xi static MS_U16 __u16Width = 0;
192*53ee8cc1Swenshuai.xi static MS_U16 __u16Height = 0;
193*53ee8cc1Swenshuai.xi static MS_U16 __u16Pitch = 0;
194*53ee8cc1Swenshuai.xi 
195*53ee8cc1Swenshuai.xi static MS_U8 __u8FrameBuffTotalNum = DISPLAY_QUEUE_NUM;
196*53ee8cc1Swenshuai.xi static MS_U32 __u32FrameBuffUnitSize = 0;
197*53ee8cc1Swenshuai.xi 
198*53ee8cc1Swenshuai.xi static MS_BOOL __bIsFirstFrameRdy = FALSE;
199*53ee8cc1Swenshuai.xi 
200*53ee8cc1Swenshuai.xi static MS_U8 PreVIdx = 0;
201*53ee8cc1Swenshuai.xi static MS_U16 ReCheckTime = 0;
202*53ee8cc1Swenshuai.xi 
203*53ee8cc1Swenshuai.xi static MS_BOOL __bIsDecodeDone = FALSE;
204*53ee8cc1Swenshuai.xi static MS_U32 __u32DropFrameCnt = 0;
205*53ee8cc1Swenshuai.xi static MS_U32 u32NextFrameBuffIdx = 0;
206*53ee8cc1Swenshuai.xi static MS_U32 u32EndAddr = 0;
207*53ee8cc1Swenshuai.xi 
208*53ee8cc1Swenshuai.xi // Speed Control
209*53ee8cc1Swenshuai.xi static MJPEG_SpeedType eCurSpeedType = E_MJPEG_SPEED_DEFAULT;
210*53ee8cc1Swenshuai.xi static MJPEG_DispSpeed eCurDispSpeed = E_MJPEG_DISP_SPEED_1X;
211*53ee8cc1Swenshuai.xi static MS_U32 __u32SpeedCtrlFrameCntBase = 0;
212*53ee8cc1Swenshuai.xi 
213*53ee8cc1Swenshuai.xi static MS_U8 _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
214*53ee8cc1Swenshuai.xi 
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi MJPEG_FrameInfo infoDecFrame;
217*53ee8cc1Swenshuai.xi static MS_BOOL isDecFrameInfoValid = FALSE;
218*53ee8cc1Swenshuai.xi static MS_BOOL bStepDec = FALSE;
219*53ee8cc1Swenshuai.xi static MS_BOOL bLstFrame = FALSE;
220*53ee8cc1Swenshuai.xi 
221*53ee8cc1Swenshuai.xi static MS_BOOL __bSkipToPts = FALSE;
222*53ee8cc1Swenshuai.xi static MS_BOOL __bSeekToPts = FALSE;
223*53ee8cc1Swenshuai.xi static MS_U32 __u32TargetPts = 0;
224*53ee8cc1Swenshuai.xi static MS_U32 __u32Skip2PtsBase = 0;
225*53ee8cc1Swenshuai.xi 
226*53ee8cc1Swenshuai.xi static MJPEG_ErrorCode eMJPEGErrCode;
227*53ee8cc1Swenshuai.xi 
228*53ee8cc1Swenshuai.xi #if defined(CHIP_MARIA10) ||  defined(CHIP_MACAW12) || defined(CHIP_EDEN) || defined(CHIP_EULER)
229*53ee8cc1Swenshuai.xi static MS_U32 _u32FramePitch = 0;
230*53ee8cc1Swenshuai.xi static MS_U32 _u32FrameHeight = 0;
231*53ee8cc1Swenshuai.xi #endif
232*53ee8cc1Swenshuai.xi 
233*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
234*53ee8cc1Swenshuai.xi //  Debug Functions
235*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
236*53ee8cc1Swenshuai.xi 
237*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG(format, args...)          do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_MJPEG) printf(format, ##args);}while(0)
238*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG_API_MSG(format, args...)  do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_API) printf(format, ##args);}while(0)
239*53ee8cc1Swenshuai.xi #define MJPEG_DEBUG_API_ERR(format, args...)  do{if(_u8MJPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) printf(format, ##args);}while(0)
240*53ee8cc1Swenshuai.xi 
241*53ee8cc1Swenshuai.xi 
242*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
243*53ee8cc1Swenshuai.xi //  Local Functions
244*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_MApi_MJPEG_SetErrCode(MJPEG_ErrorCode eErrorCode)245*53ee8cc1Swenshuai.xi void _MApi_MJPEG_SetErrCode(MJPEG_ErrorCode eErrorCode)
246*53ee8cc1Swenshuai.xi {
247*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("_MApi_MJPEG_SetErrCode() with eMJPEGErrCode=0x%x\n", eErrorCode);
248*53ee8cc1Swenshuai.xi     eMJPEGErrCode = eErrorCode;
249*53ee8cc1Swenshuai.xi }
250*53ee8cc1Swenshuai.xi 
251*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
252*53ee8cc1Swenshuai.xi //  Global Functions
253*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
254*53ee8cc1Swenshuai.xi 
255*53ee8cc1Swenshuai.xi /******************************************************************************/
256*53ee8cc1Swenshuai.xi ///Called only when video start
257*53ee8cc1Swenshuai.xi ///@param pInitParam \b IN initial paramters
258*53ee8cc1Swenshuai.xi ///@param pStream \b IN file system realted function pointers
259*53ee8cc1Swenshuai.xi ///@return true or false
260*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_Init(MJPEG_INIT_PARAM * pInitParam)261*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Init(MJPEG_INIT_PARAM *pInitParam)//, PJPEG_FILE_FileSystem_t pStream)
262*53ee8cc1Swenshuai.xi {
263*53ee8cc1Swenshuai.xi     JPEG_InitParam jpegInitParam;
264*53ee8cc1Swenshuai.xi 
265*53ee8cc1Swenshuai.xi     // For register read/write
266*53ee8cc1Swenshuai.xi     extern MS_U32 u32MJPEGRiuBaseAdd;
267*53ee8cc1Swenshuai.xi     MS_U32 u32NonPMBankSize = 0;
268*53ee8cc1Swenshuai.xi 
269*53ee8cc1Swenshuai.xi     if(FALSE == MDrv_MMIO_GetBASE( &u32MJPEGRiuBaseAdd, &u32NonPMBankSize, MS_MODULE_JPD))
270*53ee8cc1Swenshuai.xi     {
271*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("MDrv_MMIO_GetBASE FAILED !! \n");
272*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
273*53ee8cc1Swenshuai.xi     }
274*53ee8cc1Swenshuai.xi 
275*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("DRVreg base = 0x%lX, length = %lu\n", u32MJPEGRiuBaseAdd, u32NonPMBankSize);
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi #if defined(CHIP_MARIA10) ||  defined(CHIP_MACAW12) || defined(CHIP_EDEN) || defined(CHIP_EULER)
278*53ee8cc1Swenshuai.xi     _u32FramePitch = (((pInitParam->u32Width + 7)>>3)<<3);
279*53ee8cc1Swenshuai.xi     _u32FrameHeight = pInitParam->u32Height;
280*53ee8cc1Swenshuai.xi #endif
281*53ee8cc1Swenshuai.xi 
282*53ee8cc1Swenshuai.xi #if ENABLE_MJPEG_FIRMWARE
283*53ee8cc1Swenshuai.xi     //
284*53ee8cc1Swenshuai.xi     // Init Firmware
285*53ee8cc1Swenshuai.xi     //
286*53ee8cc1Swenshuai.xi #if defined(CHIP_T2)
287*53ee8cc1Swenshuai.xi     // Reset VPU
288*53ee8cc1Swenshuai.xi     MDrv_JPD_RstVPU();
289*53ee8cc1Swenshuai.xi     // Load JPD firmware
290*53ee8cc1Swenshuai.xi //    __u32FwAddr = pInitParam->u32FwAddr;
291*53ee8cc1Swenshuai.xi     MDrv_JPD_LoadCode(pInitParam->u32FwAddr, pInitParam->u32FwBinSize, pInitParam->u32FwBinAddr, pInitParam->eFwSrcType);
292*53ee8cc1Swenshuai.xi     // Set VPU base and endian
293*53ee8cc1Swenshuai.xi     MDrv_JPD_ConfigVPU(pInitParam->u32FwAddr, 1); // 1 for little endian
294*53ee8cc1Swenshuai.xi 
295*53ee8cc1Swenshuai.xi     // Clear ShareMemory before releasing VPU
296*53ee8cc1Swenshuai.xi     MDrv_JPD_ClearShareMemory();
297*53ee8cc1Swenshuai.xi 
298*53ee8cc1Swenshuai.xi     // Release VPU
299*53ee8cc1Swenshuai.xi     MDrv_JPD_ReleaseVPU();
300*53ee8cc1Swenshuai.xi #else
301*53ee8cc1Swenshuai.xi     if(E_JPD_OK != MDrv_JPD_InitFw(pInitParam->u32FwAddr, pInitParam->u32FwBinSize, pInitParam->u32FwBinAddr, pInitParam->eFwSrcType))
302*53ee8cc1Swenshuai.xi     {
303*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_ERR("MDrv_JPD_InitFw Failed~~~~\n");
304*53ee8cc1Swenshuai.xi     }
305*53ee8cc1Swenshuai.xi //    __u32FwAddr = pInitParam->u32FwAddr;
306*53ee8cc1Swenshuai.xi #endif
307*53ee8cc1Swenshuai.xi 
308*53ee8cc1Swenshuai.xi     isDecFrameInfoValid = FALSE;
309*53ee8cc1Swenshuai.xi     bStepDec = FALSE;
310*53ee8cc1Swenshuai.xi 
311*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("clear error code due to call MApi_MJPEG_Init()\n");
312*53ee8cc1Swenshuai.xi     _MApi_MJPEG_SetErrCode(E_MJPEG_ERROR_CODE_NONE);
313*53ee8cc1Swenshuai.xi     // Check if firmware is ready or not
314*53ee8cc1Swenshuai.xi     if (MDrv_JPD_IsFirmwareReady() == FALSE)
315*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
316*53ee8cc1Swenshuai.xi 
317*53ee8cc1Swenshuai.xi     if((pInitParam->u32MWCBufAddr)%8)
318*53ee8cc1Swenshuai.xi     {
319*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_ERR("u32MWCBufAddr need 8 byte alignment~~~~0x%lx\n", pInitParam->u32MWCBufAddr);
320*53ee8cc1Swenshuai.xi     }
321*53ee8cc1Swenshuai.xi     else
322*53ee8cc1Swenshuai.xi     {
323*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_ERR("u32MWCBufAddr don't need 8 byte alignment~~~~0x%lx\n", pInitParam->u32MWCBufAddr);
324*53ee8cc1Swenshuai.xi     }
325*53ee8cc1Swenshuai.xi 
326*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_START_ADDR, pInitParam->u32MWCBufAddr);
327*53ee8cc1Swenshuai.xi #if defined(CHIP_MARIA10) ||  defined(CHIP_MACAW12) || defined(CHIP_EDEN) || defined(CHIP_EULER)
328*53ee8cc1Swenshuai.xi     __u32FrameBuffUnitSize = _u32FramePitch * _u32FrameHeight * 2;
329*53ee8cc1Swenshuai.xi     printf("_u32FramePitch = %ld\n", _u32FramePitch);
330*53ee8cc1Swenshuai.xi     printf("_u32FrameHeight = %ld\n", _u32FrameHeight);
331*53ee8cc1Swenshuai.xi     printf("__u32FrameBuffUnitSize = 0x%lx\n", __u32FrameBuffUnitSize);
332*53ee8cc1Swenshuai.xi #else
333*53ee8cc1Swenshuai.xi     __u32FrameBuffUnitSize = pInitParam->u32MWCBufSize/__u8FrameBuffTotalNum;
334*53ee8cc1Swenshuai.xi     __u32FrameBuffUnitSize = (__u32FrameBuffUnitSize >> 3) << 3;//8 byte alignment
335*53ee8cc1Swenshuai.xi #endif
336*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_UNIT_SIZE, __u32FrameBuffUnitSize);
337*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_TOTAL_NUM, __u8FrameBuffTotalNum);
338*53ee8cc1Swenshuai.xi     #if ENABLE_DOUBLE_FRAMERATE
339*53ee8cc1Swenshuai.xi     printf ("   frame rate base %ld\n", pInitParam->u32FrameRate);
340*53ee8cc1Swenshuai.xi     pInitParam->u32FrameRate /= 2;
341*53ee8cc1Swenshuai.xi     printf ("   1/2 frame rate base %ld\n", pInitParam->u32FrameRate);
342*53ee8cc1Swenshuai.xi     #endif
343*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAMERATE, pInitParam->u32FrameRate);
344*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAMERATE_BASE, pInitParam->u32FrameRateBase);
345*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_CHIP_ID, MDrv_JPD_Get_Chip_ID());
346*53ee8cc1Swenshuai.xi 
347*53ee8cc1Swenshuai.xi     if(pInitParam->u32FrameRate ==0)
348*53ee8cc1Swenshuai.xi     {
349*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_ERR("Error!!! MJPEG Frame rate is 0\n");
350*53ee8cc1Swenshuai.xi         pInitParam->u32FrameRate =30000;
351*53ee8cc1Swenshuai.xi     }
352*53ee8cc1Swenshuai.xi     __u32FrameRate = pInitParam->u32FrameRate;
353*53ee8cc1Swenshuai.xi     __u32FrameRateBase = pInitParam->u32FrameRateBase;
354*53ee8cc1Swenshuai.xi     __u32FrameTime = __u32FrameRateBase * 1000 / __u32FrameRate;
355*53ee8cc1Swenshuai.xi #endif // ENABLE_MJPEG_FIRMWARE
356*53ee8cc1Swenshuai.xi 
357*53ee8cc1Swenshuai.xi     __u32FrameCnt = 0;
358*53ee8cc1Swenshuai.xi     __u32DropFrameCnt = 0;
359*53ee8cc1Swenshuai.xi 
360*53ee8cc1Swenshuai.xi     __u32MRCBufAddr = pInitParam->u32MRCBufAddr;
361*53ee8cc1Swenshuai.xi //    __u32MRCBufSize = pInitParam->u32MRCBufSize;
362*53ee8cc1Swenshuai.xi     __u32MWCBufAddr = pInitParam->u32MWCBufAddr;
363*53ee8cc1Swenshuai.xi #if defined(CHIP_MARIA10) ||  defined(CHIP_MACAW12) || defined(CHIP_EDEN) || defined(CHIP_EULER)
364*53ee8cc1Swenshuai.xi     __u32MWCBufSize = __u32FrameBuffUnitSize * __u8FrameBuffTotalNum * 2;
365*53ee8cc1Swenshuai.xi #else
366*53ee8cc1Swenshuai.xi //    __u32MWCBufSize = pInitParam->u32MWCBufSize;
367*53ee8cc1Swenshuai.xi #endif
368*53ee8cc1Swenshuai.xi     __u32InternalBufAddr = pInitParam->u32InternalBufAddr;
369*53ee8cc1Swenshuai.xi     __u32InternalBufSize = pInitParam->u32InternalBufSize;
370*53ee8cc1Swenshuai.xi 
371*53ee8cc1Swenshuai.xi     jpegInitParam.u32MRCBufAddr = pInitParam->u32MRCBufAddr;
372*53ee8cc1Swenshuai.xi     jpegInitParam.u32MRCBufSize = pInitParam->u32MRCBufSize;
373*53ee8cc1Swenshuai.xi     jpegInitParam.u32MWCBufAddr = pInitParam->u32MWCBufAddr;
374*53ee8cc1Swenshuai.xi #if defined(CHIP_MARIA10) ||  defined(CHIP_MACAW12) || defined(CHIP_EDEN) || defined(CHIP_EULER)
375*53ee8cc1Swenshuai.xi     jpegInitParam.u32MWCBufSize = __u32MWCBufSize;
376*53ee8cc1Swenshuai.xi #else
377*53ee8cc1Swenshuai.xi     jpegInitParam.u32MWCBufSize = pInitParam->u32MWCBufSize;
378*53ee8cc1Swenshuai.xi #endif
379*53ee8cc1Swenshuai.xi     jpegInitParam.u32InternalBufAddr = pInitParam->u32InternalBufAddr;
380*53ee8cc1Swenshuai.xi     jpegInitParam.u32InternalBufSize = pInitParam->u32InternalBufSize;
381*53ee8cc1Swenshuai.xi     jpegInitParam.u32DecByteRead = 0;
382*53ee8cc1Swenshuai.xi     jpegInitParam.bEOF = TRUE;
383*53ee8cc1Swenshuai.xi     jpegInitParam.u8DecodeType = E_JPEG_TYPE_MJPEG;
384*53ee8cc1Swenshuai.xi     jpegInitParam.bInitMem = TRUE;
385*53ee8cc1Swenshuai.xi     jpegInitParam.pFillHdrFunc = NULL;
386*53ee8cc1Swenshuai.xi 
387*53ee8cc1Swenshuai.xi 
388*53ee8cc1Swenshuai.xi     // This is used to init memory
389*53ee8cc1Swenshuai.xi     if (MApi_JPEG_Init(&jpegInitParam) == E_JPEG_FAILED)
390*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi     // Make sure it's exited correctly
393*53ee8cc1Swenshuai.xi     MApi_JPEG_Exit();
394*53ee8cc1Swenshuai.xi 
395*53ee8cc1Swenshuai.xi     // Init Local Variables
396*53ee8cc1Swenshuai.xi     PreVIdx = 0;
397*53ee8cc1Swenshuai.xi     ReCheckTime = 0;
398*53ee8cc1Swenshuai.xi     bLstFrame = FALSE;
399*53ee8cc1Swenshuai.xi     __u32ReadPtr = 0;
400*53ee8cc1Swenshuai.xi     __u32WritePtr =0;
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
403*53ee8cc1Swenshuai.xi }
404*53ee8cc1Swenshuai.xi 
405*53ee8cc1Swenshuai.xi /******************************************************************************/
406*53ee8cc1Swenshuai.xi ///Reset JPD
407*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_Rst(void)408*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Rst(void)
409*53ee8cc1Swenshuai.xi {
410*53ee8cc1Swenshuai.xi     //__u32FrameCnt = 0;
411*53ee8cc1Swenshuai.xi     __bIsFirstFrameRdy = FALSE;
412*53ee8cc1Swenshuai.xi 
413*53ee8cc1Swenshuai.xi     MApi_JPEG_Rst();
414*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("clear error code due to call MApi_MJPEG_Rst()\n");
415*53ee8cc1Swenshuai.xi     _MApi_MJPEG_SetErrCode(E_MJPEG_ERROR_CODE_NONE);
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi     // CHECK : reset firmware???
418*53ee8cc1Swenshuai.xi 
419*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
420*53ee8cc1Swenshuai.xi }
421*53ee8cc1Swenshuai.xi 
422*53ee8cc1Swenshuai.xi /******************************************************************************/
423*53ee8cc1Swenshuai.xi ///Turn off JPD clock
424*53ee8cc1Swenshuai.xi /******************************************************************************/
425*53ee8cc1Swenshuai.xi //extern void MApi_JPEG_DisableAddressConvert(void); // defined in apiJPEG.c
MApi_MJPEG_Stop(void)426*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Stop(void)
427*53ee8cc1Swenshuai.xi {
428*53ee8cc1Swenshuai.xi 
429*53ee8cc1Swenshuai.xi     //__u32FrameCnt = 0;
430*53ee8cc1Swenshuai.xi     __bIsFirstFrameRdy = FALSE;
431*53ee8cc1Swenshuai.xi     isDecFrameInfoValid = FALSE;
432*53ee8cc1Swenshuai.xi     bStepDec = FALSE;
433*53ee8cc1Swenshuai.xi 
434*53ee8cc1Swenshuai.xi     MDrv_JPD_StopVPU();
435*53ee8cc1Swenshuai.xi 
436*53ee8cc1Swenshuai.xi     //MApi_JPEG_PowerOff() is called in MApi_JPEG_Exit()
437*53ee8cc1Swenshuai.xi     MApi_JPEG_Exit();
438*53ee8cc1Swenshuai.xi 
439*53ee8cc1Swenshuai.xi     MApi_JPEG_DisableAddressConvert();
440*53ee8cc1Swenshuai.xi 
441*53ee8cc1Swenshuai.xi     // CHECK : stop firmware???
442*53ee8cc1Swenshuai.xi 
443*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
444*53ee8cc1Swenshuai.xi }
445*53ee8cc1Swenshuai.xi 
446*53ee8cc1Swenshuai.xi /******************************************************************************/
447*53ee8cc1Swenshuai.xi ///Check if first frame has been decoded
448*53ee8cc1Swenshuai.xi ///@return TRUE if first picture is decoded, else return FALSE
449*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_CheckDispInfoRdy(void)450*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_CheckDispInfoRdy(void)
451*53ee8cc1Swenshuai.xi {
452*53ee8cc1Swenshuai.xi     if ((TRUE == __bIsFirstFrameRdy)
453*53ee8cc1Swenshuai.xi     && (E_JPEG_EVENT_DEC_DONE & MApi_JPEG_GetJPDEventFlag()))
454*53ee8cc1Swenshuai.xi     {
455*53ee8cc1Swenshuai.xi         // Should use the width & height of 1st frame
456*53ee8cc1Swenshuai.xi         //__u16Width = MApi_JPEG_GetWidth();
457*53ee8cc1Swenshuai.xi         //__u16Height = MApi_JPEG_GetHeight();
458*53ee8cc1Swenshuai.xi 
459*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_CheckDispInfoRdy : E_MJPEG_RET_SUCCESS\n");
460*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_SUCCESS;
461*53ee8cc1Swenshuai.xi     }
462*53ee8cc1Swenshuai.xi 
463*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_CheckDispInfoRdy : E_MJPEG_RET_FAIL\n");
464*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
465*53ee8cc1Swenshuai.xi }
466*53ee8cc1Swenshuai.xi 
467*53ee8cc1Swenshuai.xi /******************************************************************************/
468*53ee8cc1Swenshuai.xi ///Play
469*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
470*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
471*53ee8cc1Swenshuai.xi ///@return status
472*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_Play(void)473*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Play(void)
474*53ee8cc1Swenshuai.xi {
475*53ee8cc1Swenshuai.xi     if (MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_PLAY, 0xFFFFFFFF) == 0)
476*53ee8cc1Swenshuai.xi     {
477*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Play : E_MJPEG_RET_FAIL\n");
478*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
479*53ee8cc1Swenshuai.xi     }
480*53ee8cc1Swenshuai.xi 
481*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Play : E_MJPEG_RET_SUCCESS\n");
482*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
483*53ee8cc1Swenshuai.xi }
484*53ee8cc1Swenshuai.xi 
485*53ee8cc1Swenshuai.xi /******************************************************************************/
486*53ee8cc1Swenshuai.xi ///Pause
487*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
488*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
489*53ee8cc1Swenshuai.xi ///@return status
490*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_Pause(void)491*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Pause(void)
492*53ee8cc1Swenshuai.xi {
493*53ee8cc1Swenshuai.xi     if (MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_PAUSE, 0xFFFFFFFF) == 0)
494*53ee8cc1Swenshuai.xi     {
495*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Play : E_MJPEG_RET_FAIL\n");
496*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
497*53ee8cc1Swenshuai.xi     }
498*53ee8cc1Swenshuai.xi 
499*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Play : E_MJPEG_RET_SUCCESS\n");
500*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
501*53ee8cc1Swenshuai.xi }
502*53ee8cc1Swenshuai.xi 
503*53ee8cc1Swenshuai.xi /******************************************************************************/
504*53ee8cc1Swenshuai.xi ///Resume
505*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
506*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
507*53ee8cc1Swenshuai.xi ///@return status
508*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_Resume(void)509*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_Resume(void)
510*53ee8cc1Swenshuai.xi {
511*53ee8cc1Swenshuai.xi     if (MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_RESUME, 0xFFFFFFFF) == 0)
512*53ee8cc1Swenshuai.xi     {
513*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Resume : E_MJPEG_RET_FAIL\n");
514*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
515*53ee8cc1Swenshuai.xi     }
516*53ee8cc1Swenshuai.xi 
517*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_Resume : E_MJPEG_RET_SUCCESS\n");
518*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
519*53ee8cc1Swenshuai.xi }
520*53ee8cc1Swenshuai.xi 
521*53ee8cc1Swenshuai.xi /******************************************************************************/
522*53ee8cc1Swenshuai.xi ///Step Play
523*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
524*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
525*53ee8cc1Swenshuai.xi ///@return status
526*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_StepPlay(void)527*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_StepPlay(void)
528*53ee8cc1Swenshuai.xi {
529*53ee8cc1Swenshuai.xi     if (MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_STEP_PLAY, 0xFFFFFFFF) == 0)
530*53ee8cc1Swenshuai.xi     {
531*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_StepPlay : E_MJPEG_RET_FAIL\n");
532*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
533*53ee8cc1Swenshuai.xi     }
534*53ee8cc1Swenshuai.xi 
535*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_StepPlay : E_MJPEG_RET_SUCCESS\n");
536*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
537*53ee8cc1Swenshuai.xi }
538*53ee8cc1Swenshuai.xi 
539*53ee8cc1Swenshuai.xi /******************************************************************************/
540*53ee8cc1Swenshuai.xi ///Check if step play is done or not
541*53ee8cc1Swenshuai.xi ///@return true or false
542*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsStepPlayDone(void)543*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsStepPlayDone(void)
544*53ee8cc1Swenshuai.xi {
545*53ee8cc1Swenshuai.xi     if (MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_IS_STEP_PLAY_DONE, 0xFFFFFFFF) == 0)
546*53ee8cc1Swenshuai.xi     {
547*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsStepPlayDone : TRUE\n");
548*53ee8cc1Swenshuai.xi         return TRUE;
549*53ee8cc1Swenshuai.xi     }
550*53ee8cc1Swenshuai.xi 
551*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsStepPlayDone : FALSE\n");
552*53ee8cc1Swenshuai.xi     return FALSE;
553*53ee8cc1Swenshuai.xi }
554*53ee8cc1Swenshuai.xi 
555*53ee8cc1Swenshuai.xi /******************************************************************************/
556*53ee8cc1Swenshuai.xi ///Description
557*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
558*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
559*53ee8cc1Swenshuai.xi ///@return status
560*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_StepDecode(void)561*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_StepDecode(void)
562*53ee8cc1Swenshuai.xi {
563*53ee8cc1Swenshuai.xi     bStepDec = FALSE;
564*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
565*53ee8cc1Swenshuai.xi }
566*53ee8cc1Swenshuai.xi 
567*53ee8cc1Swenshuai.xi /******************************************************************************/
568*53ee8cc1Swenshuai.xi ///Check if JPEG decode done
569*53ee8cc1Swenshuai.xi ///@return status
570*53ee8cc1Swenshuai.xi /******************************************************************************/
__MApi_MJPEG_CheckDecodeDone(void)571*53ee8cc1Swenshuai.xi MJPEG_Result __MApi_MJPEG_CheckDecodeDone(void)
572*53ee8cc1Swenshuai.xi {
573*53ee8cc1Swenshuai.xi     MS_U16 cur_vidx = 0;
574*53ee8cc1Swenshuai.xi 
575*53ee8cc1Swenshuai.xi 
576*53ee8cc1Swenshuai.xi     if (__bIsFirstFrameRdy)
577*53ee8cc1Swenshuai.xi     {
578*53ee8cc1Swenshuai.xi         JPEG_Event reg_val = MApi_JPEG_GetJPDEventFlag();
579*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("        EventFlag = %d\n", reg_val);
580*53ee8cc1Swenshuai.xi 
581*53ee8cc1Swenshuai.xi         //For H/W bug, some cases can not exit after decode done. Check Vidx to exit.
582*53ee8cc1Swenshuai.xi         if(PreVIdx != (cur_vidx = MApi_JPEG_GetCurVidx()))
583*53ee8cc1Swenshuai.xi         {
584*53ee8cc1Swenshuai.xi             PreVIdx = cur_vidx;
585*53ee8cc1Swenshuai.xi             ReCheckTime = 0;
586*53ee8cc1Swenshuai.xi         }
587*53ee8cc1Swenshuai.xi         else
588*53ee8cc1Swenshuai.xi         {
589*53ee8cc1Swenshuai.xi             ReCheckTime++;
590*53ee8cc1Swenshuai.xi             if(ReCheckTime >= 1000)
591*53ee8cc1Swenshuai.xi             {
592*53ee8cc1Swenshuai.xi                 MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID, u32NextFrameBuffIdx);
593*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("Set frame buffer index %ld as Valid", u32NextFrameBuffIdx);
594*53ee8cc1Swenshuai.xi                 __bIsDecodeDone = TRUE;
595*53ee8cc1Swenshuai.xi                 __u32DropFrameCnt++;
596*53ee8cc1Swenshuai.xi 
597*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_ERR("Decode timeout!!!!\n");
598*53ee8cc1Swenshuai.xi                 reg_val = E_JPEG_EVENT_DEC_ERROR_MASK;
599*53ee8cc1Swenshuai.xi                 return E_MJPEG_RET_FAIL;
600*53ee8cc1Swenshuai.xi             }
601*53ee8cc1Swenshuai.xi         }
602*53ee8cc1Swenshuai.xi 
603*53ee8cc1Swenshuai.xi         if(E_JPEG_EVENT_DEC_DONE & reg_val)
604*53ee8cc1Swenshuai.xi         {
605*53ee8cc1Swenshuai.xi             ReCheckTime = 0;
606*53ee8cc1Swenshuai.xi 
607*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("        Decode Done -- ");
608*53ee8cc1Swenshuai.xi #if ENABLE_MJPEG_FIRMWARE
609*53ee8cc1Swenshuai.xi             if (__bIsDecodeDone == FALSE)
610*53ee8cc1Swenshuai.xi             {
611*53ee8cc1Swenshuai.xi                 if (__u32DropFrameCnt != 0)
612*53ee8cc1Swenshuai.xi                 {   // Ask firmware to compensate PTS
613*53ee8cc1Swenshuai.xi                     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_COMPENSATE_PTS, __u32DropFrameCnt);
614*53ee8cc1Swenshuai.xi                     MJPEG_DEBUG_API_MSG("Compensate PTS for %ld dropped frames", __u32DropFrameCnt);
615*53ee8cc1Swenshuai.xi                 }
616*53ee8cc1Swenshuai.xi                 __u32DropFrameCnt = 0;
617*53ee8cc1Swenshuai.xi 
618*53ee8cc1Swenshuai.xi                 MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_IDX_READY, u32NextFrameBuffIdx);
619*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("Frame Buffer Index %ld", u32NextFrameBuffIdx);
620*53ee8cc1Swenshuai.xi                 __bIsDecodeDone = TRUE;
621*53ee8cc1Swenshuai.xi             }
622*53ee8cc1Swenshuai.xi #endif
623*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("\n");
624*53ee8cc1Swenshuai.xi             //__u32FrameCnt++;
625*53ee8cc1Swenshuai.xi             //__u32ReadPtr = u32EndAddr;
626*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Count %ld\n", __u32FrameCnt);
627*53ee8cc1Swenshuai.xi         }
628*53ee8cc1Swenshuai.xi         else
629*53ee8cc1Swenshuai.xi         if(E_JPEG_EVENT_DEC_ERROR_MASK & reg_val)
630*53ee8cc1Swenshuai.xi         {
631*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("   JPD Decode Error\n");
632*53ee8cc1Swenshuai.xi 
633*53ee8cc1Swenshuai.xi             MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID, u32NextFrameBuffIdx);
634*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Set frame buffer index %ld as Valid", u32NextFrameBuffIdx);
635*53ee8cc1Swenshuai.xi             __bIsDecodeDone = TRUE;
636*53ee8cc1Swenshuai.xi             __u32DropFrameCnt++;
637*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODE_ERROR;
638*53ee8cc1Swenshuai.xi         }
639*53ee8cc1Swenshuai.xi         else
640*53ee8cc1Swenshuai.xi         {
641*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("   Still decoding previous JPEG ......\n");
642*53ee8cc1Swenshuai.xi 
643*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODING;
644*53ee8cc1Swenshuai.xi         }
645*53ee8cc1Swenshuai.xi     }
646*53ee8cc1Swenshuai.xi     else
647*53ee8cc1Swenshuai.xi     {
648*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
649*53ee8cc1Swenshuai.xi     }
650*53ee8cc1Swenshuai.xi 
651*53ee8cc1Swenshuai.xi 
652*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
653*53ee8cc1Swenshuai.xi }
654*53ee8cc1Swenshuai.xi 
655*53ee8cc1Swenshuai.xi /******************************************************************************/
656*53ee8cc1Swenshuai.xi ///Description
657*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
658*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
659*53ee8cc1Swenshuai.xi ///@return status
660*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsStepDecodeDone(void)661*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsStepDecodeDone(void)
662*53ee8cc1Swenshuai.xi {
663*53ee8cc1Swenshuai.xi     if(FALSE == bStepDec)
664*53ee8cc1Swenshuai.xi         return FALSE;
665*53ee8cc1Swenshuai.xi 
666*53ee8cc1Swenshuai.xi     if (E_MJPEG_RET_SUCCESS == __MApi_MJPEG_CheckDecodeDone())
667*53ee8cc1Swenshuai.xi         return TRUE;
668*53ee8cc1Swenshuai.xi 
669*53ee8cc1Swenshuai.xi     return FALSE;
670*53ee8cc1Swenshuai.xi }
671*53ee8cc1Swenshuai.xi 
672*53ee8cc1Swenshuai.xi static MS_U16 u16NullCnt;
673*53ee8cc1Swenshuai.xi 
674*53ee8cc1Swenshuai.xi /******************************************************************************/
675*53ee8cc1Swenshuai.xi ///Issue full JPEG decode process
676*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
677*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
678*53ee8cc1Swenshuai.xi ///@return status
679*53ee8cc1Swenshuai.xi /******************************************************************************/
680*53ee8cc1Swenshuai.xi //MJPEG_Result MApi_MJPEG_PushQueue(MS_PHYADDR u32StAddr, MS_U32 u32Size, MS_U32 u32TimeStamp)
MApi_MJPEG_PushQueue(MJPEG_Packet_Info * pInfo)681*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_PushQueue(MJPEG_Packet_Info *pInfo)
682*53ee8cc1Swenshuai.xi {
683*53ee8cc1Swenshuai.xi     //
684*53ee8cc1Swenshuai.xi     // There's no queue
685*53ee8cc1Swenshuai.xi     //
686*53ee8cc1Swenshuai.xi     JPEG_InitParam jpegInitParam;
687*53ee8cc1Swenshuai.xi 
688*53ee8cc1Swenshuai.xi 
689*53ee8cc1Swenshuai.xi     if(pInfo->u32Size == 0)
690*53ee8cc1Swenshuai.xi     {
691*53ee8cc1Swenshuai.xi         u16NullCnt++;
692*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("%s: MJPEG NULL PACKET!!!!!!!!!!\n", __FUNCTION__);
693*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_SUCCESS;
694*53ee8cc1Swenshuai.xi     }
695*53ee8cc1Swenshuai.xi 
696*53ee8cc1Swenshuai.xi     MS_U16 u16DecodeCnt;
697*53ee8cc1Swenshuai.xi     for(u16DecodeCnt=0; u16DecodeCnt<=u16NullCnt; u16DecodeCnt++)
698*53ee8cc1Swenshuai.xi     {
699*53ee8cc1Swenshuai.xi         if (E_MJPEG_RET_DECODING == __MApi_MJPEG_CheckDecodeDone())
700*53ee8cc1Swenshuai.xi         {
701*53ee8cc1Swenshuai.xi             u16NullCnt -=u16DecodeCnt;
702*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("%s: E_MJPEG_RET_DECODING with u16DecodeCnt=%d\n", __FUNCTION__, u16DecodeCnt);
703*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODING;
704*53ee8cc1Swenshuai.xi         }
705*53ee8cc1Swenshuai.xi #if 1
706*53ee8cc1Swenshuai.xi         MJPEG_DEBUG("[MWC][%dx%d.yuyv]addr=0x%lx, size=0x%x\n",
707*53ee8cc1Swenshuai.xi             MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), infoDecFrame.u32LumaAddr,
708*53ee8cc1Swenshuai.xi             MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2);
709*53ee8cc1Swenshuai.xi #endif
710*53ee8cc1Swenshuai.xi         __u32FrameCnt++;
711*53ee8cc1Swenshuai.xi         __u32ReadPtr = u32EndAddr;
712*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("%s: Count %ld, __bSkipToPts=%d, __bSeekToPts=%d, __u32Skip2PtsBase=%ld, __u32TargetPts=%ld\n",
713*53ee8cc1Swenshuai.xi             __FUNCTION__, __u32FrameCnt, __bSkipToPts, __bSeekToPts, __u32Skip2PtsBase, __u32TargetPts);
714*53ee8cc1Swenshuai.xi 
715*53ee8cc1Swenshuai.xi 
716*53ee8cc1Swenshuai.xi         __u32WritePtr = pInfo->u32StAddr + pInfo->u32Size - 1;
717*53ee8cc1Swenshuai.xi 
718*53ee8cc1Swenshuai.xi 
719*53ee8cc1Swenshuai.xi         // Skip/Seek to PTS
720*53ee8cc1Swenshuai.xi         if (__bSkipToPts || __bSeekToPts)
721*53ee8cc1Swenshuai.xi         {
722*53ee8cc1Swenshuai.xi             if (__u32Skip2PtsBase >= __u32TargetPts)
723*53ee8cc1Swenshuai.xi             {
724*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("Skip/Seek to PTS done -- current PTS %ld\n", __u32Skip2PtsBase);
725*53ee8cc1Swenshuai.xi                 __bSkipToPts = FALSE;
726*53ee8cc1Swenshuai.xi                 __bSeekToPts = FALSE;
727*53ee8cc1Swenshuai.xi                 // Need to update firmware PTS base
728*53ee8cc1Swenshuai.xi                 MDrv_JPD_ResetPTS(__u32Skip2PtsBase);
729*53ee8cc1Swenshuai.xi             }
730*53ee8cc1Swenshuai.xi             else
731*53ee8cc1Swenshuai.xi             {
732*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("Skip Frame -- PTS %ld\n", __u32Skip2PtsBase);
733*53ee8cc1Swenshuai.xi                 __u32Skip2PtsBase += __u32FrameTime;
734*53ee8cc1Swenshuai.xi                 __bIsDecodeDone = TRUE;
735*53ee8cc1Swenshuai.xi                 u32EndAddr = pInfo->u32StAddr + pInfo->u32Size - 1;
736*53ee8cc1Swenshuai.xi                 return E_MJPEG_RET_SUCCESS;
737*53ee8cc1Swenshuai.xi             }
738*53ee8cc1Swenshuai.xi         }
739*53ee8cc1Swenshuai.xi 
740*53ee8cc1Swenshuai.xi         // Speed Control
741*53ee8cc1Swenshuai.xi         if (__bIsFirstFrameRdy)
742*53ee8cc1Swenshuai.xi         {
743*53ee8cc1Swenshuai.xi             if (eCurSpeedType == E_MJPEG_SPEED_FAST)
744*53ee8cc1Swenshuai.xi             {
745*53ee8cc1Swenshuai.xi                 if ((__u32FrameCnt - __u32SpeedCtrlFrameCntBase) % eCurDispSpeed)
746*53ee8cc1Swenshuai.xi                 {
747*53ee8cc1Swenshuai.xi                     MJPEG_DEBUG_API_MSG("       Skip frame %ld\n", (__u32FrameCnt - __u32SpeedCtrlFrameCntBase));
748*53ee8cc1Swenshuai.xi                     //__u32FrameCnt++;
749*53ee8cc1Swenshuai.xi                     __bIsDecodeDone = TRUE;
750*53ee8cc1Swenshuai.xi                     u16NullCnt=0;
751*53ee8cc1Swenshuai.xi                     return E_MJPEG_RET_SUCCESS;
752*53ee8cc1Swenshuai.xi                 }
753*53ee8cc1Swenshuai.xi             }
754*53ee8cc1Swenshuai.xi             else if (eCurSpeedType == E_MJPEG_SPEED_SLOW)
755*53ee8cc1Swenshuai.xi             {
756*53ee8cc1Swenshuai.xi             }
757*53ee8cc1Swenshuai.xi             else // if (eCurSpeedType == E_MJPEG_SPEED_DEFAULT)
758*53ee8cc1Swenshuai.xi             {
759*53ee8cc1Swenshuai.xi                 __u32SpeedCtrlFrameCntBase = __u32FrameCnt;
760*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("   Update Frame Count Base %ld\n", __u32SpeedCtrlFrameCntBase);
761*53ee8cc1Swenshuai.xi             }
762*53ee8cc1Swenshuai.xi         }
763*53ee8cc1Swenshuai.xi 
764*53ee8cc1Swenshuai.xi 
765*53ee8cc1Swenshuai.xi         MApi_JPEG_SetMaxDecodeResolution(JPEGBASEWIDTHMAX, JPEGBASEHEIGHTMAX);
766*53ee8cc1Swenshuai.xi         // Init
767*53ee8cc1Swenshuai.xi         jpegInitParam.u32MRCBufAddr = pInfo->u32StAddr + __u32MRCBufAddr;
768*53ee8cc1Swenshuai.xi         // Tricky code: let JPD decode only L buffer, then decode dne
769*53ee8cc1Swenshuai.xi         jpegInitParam.u32MRCBufSize = pInfo->u32Size*2;
770*53ee8cc1Swenshuai.xi         if (jpegInitParam.u32MRCBufSize < JPEG_DEFAULT_EXIF_SIZE)
771*53ee8cc1Swenshuai.xi         {   // Meet size check in MApi_JPEG_Init()
772*53ee8cc1Swenshuai.xi             jpegInitParam.u32MRCBufSize = JPEG_DEFAULT_EXIF_SIZE;
773*53ee8cc1Swenshuai.xi         }
774*53ee8cc1Swenshuai.xi 
775*53ee8cc1Swenshuai.xi         // Ask firmware if there is any frame buffer available
776*53ee8cc1Swenshuai.xi         u32NextFrameBuffIdx = MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_GET_NEXT_FREE_FRAME_BUFF_IDX, 0xFFFFFFFF);
777*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("                   E_MJPEG_CMD_GET_NEXT_FREE_FRAME_BUFF_IDX %ld\n", u32NextFrameBuffIdx);
778*53ee8cc1Swenshuai.xi         if (u32NextFrameBuffIdx >= 0xFF)// It may be 0xFF, 0xFFFF, 0xFFFFFF, or 0xFFFFFFFF
779*53ee8cc1Swenshuai.xi         {
780*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("   !!! No frame buffer available !!!\n");
781*53ee8cc1Swenshuai.xi             __bIsDecodeDone = TRUE;
782*53ee8cc1Swenshuai.xi             __u32DropFrameCnt++;
783*53ee8cc1Swenshuai.xi             u16NullCnt=0;
784*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_FAIL;
785*53ee8cc1Swenshuai.xi         }
786*53ee8cc1Swenshuai.xi         if (__bIsFirstFrameRdy == FALSE)
787*53ee8cc1Swenshuai.xi         {
788*53ee8cc1Swenshuai.xi             u32NextFrameBuffIdx = 0;
789*53ee8cc1Swenshuai.xi         }
790*53ee8cc1Swenshuai.xi         __bIsDecodeDone = FALSE;
791*53ee8cc1Swenshuai.xi         MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_IDX, u32NextFrameBuffIdx);
792*53ee8cc1Swenshuai.xi         MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_TIMESTAMP, pInfo->u32TimeStamp);
793*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("   u32TimeStamp %ld", pInfo->u32TimeStamp);
794*53ee8cc1Swenshuai.xi         MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_ID_L, pInfo->u32ID_L);
795*53ee8cc1Swenshuai.xi         MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_ID_H, pInfo->u32ID_H);
796*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("Frame ID 0x%lx%lx", pInfo->u32ID_H, pInfo->u32ID_L);
797*53ee8cc1Swenshuai.xi 
798*53ee8cc1Swenshuai.xi         jpegInitParam.u32MWCBufAddr = __u32MWCBufAddr + __u32FrameBuffUnitSize*u32NextFrameBuffIdx;
799*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("   Set Frame buffer addr 0x%lx\n", jpegInitParam.u32MWCBufAddr);
800*53ee8cc1Swenshuai.xi         jpegInitParam.u32MWCBufSize = __u32FrameBuffUnitSize;
801*53ee8cc1Swenshuai.xi 
802*53ee8cc1Swenshuai.xi         jpegInitParam.u32InternalBufAddr = __u32InternalBufAddr;
803*53ee8cc1Swenshuai.xi         jpegInitParam.u32InternalBufSize = __u32InternalBufSize;
804*53ee8cc1Swenshuai.xi         jpegInitParam.u32DecByteRead = pInfo->u32Size;
805*53ee8cc1Swenshuai.xi         jpegInitParam.bEOF = TRUE; // Set to TRUE to disable read function
806*53ee8cc1Swenshuai.xi         jpegInitParam.u8DecodeType = E_JPEG_TYPE_MAIN; // only set to E_JPEG_TYPE_MJPEG when 1st time
807*53ee8cc1Swenshuai.xi         jpegInitParam.bInitMem = TRUE;
808*53ee8cc1Swenshuai.xi         jpegInitParam.pFillHdrFunc = NULL;
809*53ee8cc1Swenshuai.xi 
810*53ee8cc1Swenshuai.xi         #if ENABLE_AVSYNC_ID_CHECK
811*53ee8cc1Swenshuai.xi         printf ("ID 0x%08lx%08lx    PTS %ld\n", pInfo->u32ID_H, pInfo->u32ID_L, pInfo->u32TimeStamp);
812*53ee8cc1Swenshuai.xi         #endif
813*53ee8cc1Swenshuai.xi 
814*53ee8cc1Swenshuai.xi         // Make sure it's exited correctly
815*53ee8cc1Swenshuai.xi         MApi_JPEG_Exit();
816*53ee8cc1Swenshuai.xi 
817*53ee8cc1Swenshuai.xi 
818*53ee8cc1Swenshuai.xi         u32EndAddr = pInfo->u32StAddr + pInfo->u32Size - 1;
819*53ee8cc1Swenshuai.xi 
820*53ee8cc1Swenshuai.xi 
821*53ee8cc1Swenshuai.xi         if (MApi_JPEG_Init(&jpegInitParam) == E_JPEG_FAILED)
822*53ee8cc1Swenshuai.xi         {
823*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("MApi_JPEG_Init() FAIL\n");
824*53ee8cc1Swenshuai.xi             MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID, u32NextFrameBuffIdx);
825*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Set frame buffer index %ld as Valid", u32NextFrameBuffIdx);
826*53ee8cc1Swenshuai.xi             __bIsDecodeDone = TRUE;
827*53ee8cc1Swenshuai.xi             __u32DropFrameCnt++;
828*53ee8cc1Swenshuai.xi             u16NullCnt=0;
829*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_FAIL;
830*53ee8cc1Swenshuai.xi         }
831*53ee8cc1Swenshuai.xi 
832*53ee8cc1Swenshuai.xi         // Get width, height, & pitch of 1st frame
833*53ee8cc1Swenshuai.xi         if (__bIsFirstFrameRdy == FALSE)
834*53ee8cc1Swenshuai.xi         {
835*53ee8cc1Swenshuai.xi             __u16Width = MApi_JPEG_GetWidth();
836*53ee8cc1Swenshuai.xi             MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_WIDTH, __u16Width);
837*53ee8cc1Swenshuai.xi             __u16Height = MApi_JPEG_GetHeight();
838*53ee8cc1Swenshuai.xi             MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_HEIGHT, __u16Height);
839*53ee8cc1Swenshuai.xi             __u16Pitch = MApi_JPEG_GetAlignedPitch();
840*53ee8cc1Swenshuai.xi             MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_PITCH, __u16Pitch);
841*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("       width %d, height %d, pitch %d\n", __u16Width, __u16Height, __u16Pitch);
842*53ee8cc1Swenshuai.xi 
843*53ee8cc1Swenshuai.xi             if((__u16Width > MJPEG_MAX_SUPPORT_WIDTH) ||
844*53ee8cc1Swenshuai.xi                 (__u16Height>MJPEG_MAX_SUPPORT_HEIGHT))
845*53ee8cc1Swenshuai.xi             {
846*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("Set MJPEG error code=E_MJPEG_ERR_CODE_RES \n");
847*53ee8cc1Swenshuai.xi                 _MApi_MJPEG_SetErrCode(E_MJPEG_ERR_CODE_RES);
848*53ee8cc1Swenshuai.xi             }
849*53ee8cc1Swenshuai.xi #if defined(CHIP_MARIA10) ||  defined(CHIP_MACAW12) || defined(CHIP_EDEN) || defined(CHIP_EULER)
850*53ee8cc1Swenshuai.xi             if((_u32FramePitch < __u16Width)
851*53ee8cc1Swenshuai.xi             || (_u32FrameHeight < __u16Height))
852*53ee8cc1Swenshuai.xi             {
853*53ee8cc1Swenshuai.xi                 _u32FramePitch = (((__u16Width + 7)>>3)<<3);
854*53ee8cc1Swenshuai.xi                 _u32FrameHeight = __u16Height;
855*53ee8cc1Swenshuai.xi                 __u32FrameBuffUnitSize = _u32FramePitch * _u32FrameHeight * 2;
856*53ee8cc1Swenshuai.xi                 MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_UNIT_SIZE, __u32FrameBuffUnitSize);
857*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("Change _u32FramePitch = %ld\n", _u32FramePitch);
858*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("Change _u32FrameHeight = %ld\n", _u32FrameHeight);
859*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("Change __u32FrameBuffUnitSize = 0x%lx\n", __u32FrameBuffUnitSize);
860*53ee8cc1Swenshuai.xi             }
861*53ee8cc1Swenshuai.xi #endif
862*53ee8cc1Swenshuai.xi         }
863*53ee8cc1Swenshuai.xi 
864*53ee8cc1Swenshuai.xi         // Fill decode frame info
865*53ee8cc1Swenshuai.xi         infoDecFrame.u32LumaAddr = jpegInitParam.u32MWCBufAddr;
866*53ee8cc1Swenshuai.xi         infoDecFrame.u32ChromaAddr = infoDecFrame.u32LumaAddr;
867*53ee8cc1Swenshuai.xi         infoDecFrame.u32TimeStamp = pInfo->u32TimeStamp;
868*53ee8cc1Swenshuai.xi         infoDecFrame.u32ID_L = pInfo->u32ID_L;
869*53ee8cc1Swenshuai.xi         infoDecFrame.u32ID_H = pInfo->u32ID_H;
870*53ee8cc1Swenshuai.xi         infoDecFrame.u16Pitch = __u16Pitch;
871*53ee8cc1Swenshuai.xi         infoDecFrame.u16Width = __u16Width;
872*53ee8cc1Swenshuai.xi         infoDecFrame.u16Height = __u16Height;
873*53ee8cc1Swenshuai.xi         isDecFrameInfoValid = TRUE;
874*53ee8cc1Swenshuai.xi 
875*53ee8cc1Swenshuai.xi         // Decode header
876*53ee8cc1Swenshuai.xi         if (MApi_JPEG_DecodeHdr() == E_JPEG_FAILED)
877*53ee8cc1Swenshuai.xi         {
878*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("MApi_JPEG_DecodeHdr() FAIL\n");
879*53ee8cc1Swenshuai.xi             MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID, u32NextFrameBuffIdx);
880*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Set frame buffer index %ld as Valid", u32NextFrameBuffIdx);
881*53ee8cc1Swenshuai.xi             __bIsDecodeDone = TRUE;
882*53ee8cc1Swenshuai.xi             __u32DropFrameCnt++;
883*53ee8cc1Swenshuai.xi             u16NullCnt=0;
884*53ee8cc1Swenshuai.xi 
885*53ee8cc1Swenshuai.xi             JPEG_ErrCode jpeg_errcode = MApi_JPEG_GetErrorCode();
886*53ee8cc1Swenshuai.xi             if((E_JPEG_UNSUPPORTED_COLORSPACE == jpeg_errcode)
887*53ee8cc1Swenshuai.xi             || (E_JPEG_UNSUPPORTED_SAMP_FACTORS == jpeg_errcode)
888*53ee8cc1Swenshuai.xi             || (E_JPEG_UNSUPPORTED_HUFF_DECODE == jpeg_errcode))
889*53ee8cc1Swenshuai.xi             {
890*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_ERR("Set MJPEG error code=E_MJPEG_ERR_CODE_RES for unsupport!!\n");
891*53ee8cc1Swenshuai.xi                 _MApi_MJPEG_SetErrCode(E_MJPEG_ERR_CODE_RES);
892*53ee8cc1Swenshuai.xi             }
893*53ee8cc1Swenshuai.xi 
894*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODE_HDR_ERROR;
895*53ee8cc1Swenshuai.xi         }
896*53ee8cc1Swenshuai.xi 
897*53ee8cc1Swenshuai.xi         bStepDec = TRUE;
898*53ee8cc1Swenshuai.xi 
899*53ee8cc1Swenshuai.xi         // Decode
900*53ee8cc1Swenshuai.xi         if (MApi_JPEG_Decode() == E_JPEG_FAILED)
901*53ee8cc1Swenshuai.xi         {
902*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_ERR("MApi_JPEG_Decode() FAIL\n");
903*53ee8cc1Swenshuai.xi             MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID, u32NextFrameBuffIdx);
904*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("Set frame buffer index %ld as Valid", u32NextFrameBuffIdx);
905*53ee8cc1Swenshuai.xi             __bIsDecodeDone = TRUE;
906*53ee8cc1Swenshuai.xi             __u32DropFrameCnt++;
907*53ee8cc1Swenshuai.xi             u16NullCnt=0;
908*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_DECODE_ERROR;
909*53ee8cc1Swenshuai.xi         }
910*53ee8cc1Swenshuai.xi 
911*53ee8cc1Swenshuai.xi 
912*53ee8cc1Swenshuai.xi         // Moved Up
913*53ee8cc1Swenshuai.xi         //u32EndAddr = pInfo->u32StAddr + pInfo->u32Size - 1;
914*53ee8cc1Swenshuai.xi         __bIsFirstFrameRdy = TRUE;
915*53ee8cc1Swenshuai.xi 
916*53ee8cc1Swenshuai.xi         // All done, wait for decoding finish
917*53ee8cc1Swenshuai.xi         if(u16NullCnt ==u16DecodeCnt)
918*53ee8cc1Swenshuai.xi         {
919*53ee8cc1Swenshuai.xi             if(u16NullCnt!=0)
920*53ee8cc1Swenshuai.xi             {
921*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("%s: Handle MJPEG NULL PACKET with u16DecodeCnt=%d\n", __FUNCTION__, u16DecodeCnt);
922*53ee8cc1Swenshuai.xi             }
923*53ee8cc1Swenshuai.xi             u16NullCnt=0;
924*53ee8cc1Swenshuai.xi             return E_MJPEG_RET_SUCCESS;
925*53ee8cc1Swenshuai.xi         }
926*53ee8cc1Swenshuai.xi         else
927*53ee8cc1Swenshuai.xi         {
928*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("%s: Duplicate PACKET with u16DecodeCnt=%d\n", __FUNCTION__, u16DecodeCnt);
929*53ee8cc1Swenshuai.xi         }
930*53ee8cc1Swenshuai.xi     }
931*53ee8cc1Swenshuai.xi 
932*53ee8cc1Swenshuai.xi     // Only for compile ok, the code should not run to this place.
933*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("%s: Handle MJPEG NULL PACKET with u16DecodeCnt=%d\n", __FUNCTION__, u16DecodeCnt);
934*53ee8cc1Swenshuai.xi     u16NullCnt=0;
935*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
936*53ee8cc1Swenshuai.xi }
937*53ee8cc1Swenshuai.xi 
938*53ee8cc1Swenshuai.xi /******************************************************************************/
939*53ee8cc1Swenshuai.xi ///Description
940*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
941*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
942*53ee8cc1Swenshuai.xi ///@return status
943*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetQueueVacancy(void)944*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetQueueVacancy(void)
945*53ee8cc1Swenshuai.xi {
946*53ee8cc1Swenshuai.xi     MS_U32 u32tmpcounter;
947*53ee8cc1Swenshuai.xi     #if ENABLE_AVSYNC_ID_CHECK
948*53ee8cc1Swenshuai.xi     MJPEG_FrameInfo info;
949*53ee8cc1Swenshuai.xi     MApi_MJPEG_GetDispFrameInfo(&info);
950*53ee8cc1Swenshuai.xi     #endif
951*53ee8cc1Swenshuai.xi 
952*53ee8cc1Swenshuai.xi 
953*53ee8cc1Swenshuai.xi     if (__bIsFirstFrameRdy == FALSE)
954*53ee8cc1Swenshuai.xi     {
955*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_GetQueueVacancy : 1\n");
956*53ee8cc1Swenshuai.xi         return 1;
957*53ee8cc1Swenshuai.xi     }
958*53ee8cc1Swenshuai.xi     else
959*53ee8cc1Swenshuai.xi     {
960*53ee8cc1Swenshuai.xi         if (__MApi_MJPEG_CheckDecodeDone() != E_MJPEG_RET_DECODING)
961*53ee8cc1Swenshuai.xi         {
962*53ee8cc1Swenshuai.xi             if (MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_IS_DISPLAY_QUEUE_FULL, 0xFFFFFFFF) == 1)
963*53ee8cc1Swenshuai.xi             {
964*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("            Display queue is full\n");
965*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("           MApi_MJPEG_GetQueueVacancy : 0\n");
966*53ee8cc1Swenshuai.xi                 return 0;
967*53ee8cc1Swenshuai.xi             }
968*53ee8cc1Swenshuai.xi 
969*53ee8cc1Swenshuai.xi             u32tmpcounter = MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_GET_NEXT_FREE_FRAME_BUFF_IDX, 0xFFFFFFFF);
970*53ee8cc1Swenshuai.xi             if ( u32tmpcounter>= 0xFF)
971*53ee8cc1Swenshuai.xi             {
972*53ee8cc1Swenshuai.xi                 MJPEG_DEBUG_API_MSG("E_MJPEG_CMD_GET_NEXT_FREE_FRAME_BUFF_IDX %ld\n", u32tmpcounter);
973*53ee8cc1Swenshuai.xi                 return 0;
974*53ee8cc1Swenshuai.xi             }
975*53ee8cc1Swenshuai.xi             MJPEG_DEBUG_API_MSG("           MApi_MJPEG_GetQueueVacancy : 1\n");
976*53ee8cc1Swenshuai.xi             return 1;
977*53ee8cc1Swenshuai.xi         }
978*53ee8cc1Swenshuai.xi     }
979*53ee8cc1Swenshuai.xi 
980*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_GetQueueVacancy : 0\n");
981*53ee8cc1Swenshuai.xi     return 0;
982*53ee8cc1Swenshuai.xi }
983*53ee8cc1Swenshuai.xi 
984*53ee8cc1Swenshuai.xi /******************************************************************************/
985*53ee8cc1Swenshuai.xi ///Description
986*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
987*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
988*53ee8cc1Swenshuai.xi ///@return status
989*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_FlushQueue(void)990*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_FlushQueue(void)
991*53ee8cc1Swenshuai.xi {
992*53ee8cc1Swenshuai.xi     // Wait current frame decode done
993*53ee8cc1Swenshuai.xi     while (E_MJPEG_RET_DECODING == __MApi_MJPEG_CheckDecodeDone())
994*53ee8cc1Swenshuai.xi         ;
995*53ee8cc1Swenshuai.xi 
996*53ee8cc1Swenshuai.xi     // Stop firmware display to avoid display queue status overwritten
997*53ee8cc1Swenshuai.xi     MApi_MJPEG_Pause();
998*53ee8cc1Swenshuai.xi 
999*53ee8cc1Swenshuai.xi     isDecFrameInfoValid = FALSE;
1000*53ee8cc1Swenshuai.xi     bStepDec = FALSE;
1001*53ee8cc1Swenshuai.xi 
1002*53ee8cc1Swenshuai.xi     if (MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_FLUSH_DISP_QUEUE, 0xFFFFFFFF) == 0)
1003*53ee8cc1Swenshuai.xi     {
1004*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_FlushQueue : E_MJPEG_RET_FAIL\n");
1005*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
1006*53ee8cc1Swenshuai.xi     }
1007*53ee8cc1Swenshuai.xi 
1008*53ee8cc1Swenshuai.xi     while (MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_IS_FLUSH_DONE, 0xFFFFFFFF) == 0)
1009*53ee8cc1Swenshuai.xi     {
1010*53ee8cc1Swenshuai.xi         printf ("Wait for flush done\n");
1011*53ee8cc1Swenshuai.xi     }
1012*53ee8cc1Swenshuai.xi 
1013*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_FlushQueue : E_MJPEG_RET_SUCCESS\n");
1014*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1015*53ee8cc1Swenshuai.xi }
1016*53ee8cc1Swenshuai.xi 
1017*53ee8cc1Swenshuai.xi /******************************************************************************/
1018*53ee8cc1Swenshuai.xi ///Description
1019*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1020*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1021*53ee8cc1Swenshuai.xi ///@return status
1022*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetESWritePtr(void)1023*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetESWritePtr(void)
1024*53ee8cc1Swenshuai.xi {
1025*53ee8cc1Swenshuai.xi     // return end of data
1026*53ee8cc1Swenshuai.xi     return __u32WritePtr;
1027*53ee8cc1Swenshuai.xi }
1028*53ee8cc1Swenshuai.xi 
1029*53ee8cc1Swenshuai.xi /******************************************************************************/
1030*53ee8cc1Swenshuai.xi ///Description
1031*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1032*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1033*53ee8cc1Swenshuai.xi ///@return status
1034*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetESReadPtr(void)1035*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetESReadPtr(void)
1036*53ee8cc1Swenshuai.xi {
1037*53ee8cc1Swenshuai.xi     // return end of data
1038*53ee8cc1Swenshuai.xi     return __u32ReadPtr;
1039*53ee8cc1Swenshuai.xi }
1040*53ee8cc1Swenshuai.xi 
1041*53ee8cc1Swenshuai.xi /******************************************************************************/
1042*53ee8cc1Swenshuai.xi ///Description
1043*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1044*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1045*53ee8cc1Swenshuai.xi ///@return status
1046*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_EnableLastFrameShow(MS_BOOL bEnable)1047*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_EnableLastFrameShow(MS_BOOL bEnable)
1048*53ee8cc1Swenshuai.xi {
1049*53ee8cc1Swenshuai.xi     bLstFrame = bEnable;
1050*53ee8cc1Swenshuai.xi     // This function always returns true.
1051*53ee8cc1Swenshuai.xi     // Because MJPEG firmware does not reserve any frame.
1052*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1053*53ee8cc1Swenshuai.xi }
1054*53ee8cc1Swenshuai.xi 
1055*53ee8cc1Swenshuai.xi /******************************************************************************/
1056*53ee8cc1Swenshuai.xi ///Description
1057*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1058*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1059*53ee8cc1Swenshuai.xi ///@return status
1060*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsDispFinish(void)1061*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsDispFinish(void)
1062*53ee8cc1Swenshuai.xi {
1063*53ee8cc1Swenshuai.xi     // Check if the last frame decode finish,
1064*53ee8cc1Swenshuai.xi     // Call this function to set E_MJPEG_CMD_SET_FRAME_BUFF_IDX_READY
1065*53ee8cc1Swenshuai.xi     // when decode done.
1066*53ee8cc1Swenshuai.xi //    MJPEG_Result ret;
1067*53ee8cc1Swenshuai.xi     if (bLstFrame == 0)
1068*53ee8cc1Swenshuai.xi     {
1069*53ee8cc1Swenshuai.xi         return FALSE;
1070*53ee8cc1Swenshuai.xi     }
1071*53ee8cc1Swenshuai.xi //    ret = __MApi_MJPEG_CheckDecodeDone();
1072*53ee8cc1Swenshuai.xi 
1073*53ee8cc1Swenshuai.xi     if(E_MJPEG_RET_SUCCESS != __MApi_MJPEG_CheckDecodeDone())
1074*53ee8cc1Swenshuai.xi     {
1075*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("MApi_MJPEG_IsDispFinish: MApi_MJPEG_CheckDecodeDone Fail!!\n");
1076*53ee8cc1Swenshuai.xi     }
1077*53ee8cc1Swenshuai.xi 
1078*53ee8cc1Swenshuai.xi 
1079*53ee8cc1Swenshuai.xi     if (MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_IS_DISP_FINISH, 0xFFFFFFFF) == 0)
1080*53ee8cc1Swenshuai.xi     {
1081*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsDispFinish : FALSE\n");
1082*53ee8cc1Swenshuai.xi         return FALSE;
1083*53ee8cc1Swenshuai.xi     }
1084*53ee8cc1Swenshuai.xi 
1085*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsDispFinish : TRUE\n");
1086*53ee8cc1Swenshuai.xi     return TRUE;
1087*53ee8cc1Swenshuai.xi }
1088*53ee8cc1Swenshuai.xi 
1089*53ee8cc1Swenshuai.xi /******************************************************************************/
1090*53ee8cc1Swenshuai.xi ///Description
1091*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1092*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1093*53ee8cc1Swenshuai.xi ///@return status
1094*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_SetSpeed(MJPEG_SpeedType eSpeedType,MJPEG_DispSpeed eDispSpeed)1095*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SetSpeed(MJPEG_SpeedType eSpeedType, MJPEG_DispSpeed eDispSpeed)
1096*53ee8cc1Swenshuai.xi {
1097*53ee8cc1Swenshuai.xi     eCurSpeedType = eSpeedType;
1098*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_SPEED_TYPE, (MS_U32)eSpeedType);
1099*53ee8cc1Swenshuai.xi 
1100*53ee8cc1Swenshuai.xi     eCurDispSpeed = eDispSpeed;
1101*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_SPEED, (MS_U32)eDispSpeed);
1102*53ee8cc1Swenshuai.xi 
1103*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_STC_BASE, 0xFFFFFFFF);
1104*53ee8cc1Swenshuai.xi 
1105*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1106*53ee8cc1Swenshuai.xi }
1107*53ee8cc1Swenshuai.xi 
1108*53ee8cc1Swenshuai.xi /******************************************************************************/
1109*53ee8cc1Swenshuai.xi ///Description
1110*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1111*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1112*53ee8cc1Swenshuai.xi ///@return status
1113*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_SetFreezeDisp(MS_BOOL bEnable)1114*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SetFreezeDisp(MS_BOOL bEnable)
1115*53ee8cc1Swenshuai.xi {
1116*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_FREEZE_DISP, (MS_U32)bEnable);
1117*53ee8cc1Swenshuai.xi 
1118*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1119*53ee8cc1Swenshuai.xi }
1120*53ee8cc1Swenshuai.xi 
1121*53ee8cc1Swenshuai.xi /******************************************************************************/
1122*53ee8cc1Swenshuai.xi ///Description
1123*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1124*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1125*53ee8cc1Swenshuai.xi ///@return status
1126*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_SetBlueScreen(MS_BOOL bOn)1127*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SetBlueScreen(MS_BOOL bOn)
1128*53ee8cc1Swenshuai.xi {
1129*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_BLUE_SCREEN, (MS_U32)bOn);
1130*53ee8cc1Swenshuai.xi 
1131*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1132*53ee8cc1Swenshuai.xi }
1133*53ee8cc1Swenshuai.xi 
1134*53ee8cc1Swenshuai.xi /******************************************************************************/
1135*53ee8cc1Swenshuai.xi ///Reset PTS value
1136*53ee8cc1Swenshuai.xi ///@param u32Value \b IN new PTS value
1137*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_ResetPTS(MS_U32 u32PtsBase)1138*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_ResetPTS(MS_U32 u32PtsBase)
1139*53ee8cc1Swenshuai.xi {
1140*53ee8cc1Swenshuai.xi     if (MDrv_JPD_ResetPTS(u32PtsBase))
1141*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_SUCCESS;
1142*53ee8cc1Swenshuai.xi 
1143*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
1144*53ee8cc1Swenshuai.xi }
1145*53ee8cc1Swenshuai.xi 
1146*53ee8cc1Swenshuai.xi /******************************************************************************/
1147*53ee8cc1Swenshuai.xi ///Return PTS of current displayed frame
1148*53ee8cc1Swenshuai.xi ///@return PTS
1149*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetPTS(void)1150*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetPTS(void)
1151*53ee8cc1Swenshuai.xi {
1152*53ee8cc1Swenshuai.xi     return MDrv_JPD_GetPTS();
1153*53ee8cc1Swenshuai.xi }
1154*53ee8cc1Swenshuai.xi 
1155*53ee8cc1Swenshuai.xi /******************************************************************************/
1156*53ee8cc1Swenshuai.xi ///Description
1157*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1158*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1159*53ee8cc1Swenshuai.xi ///@return status
1160*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_AVSyncOn(MS_BOOL bOn,MS_U32 u32SyncDelay,MS_U16 u16SyncTolerance)1161*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_AVSyncOn(MS_BOOL bOn, MS_U32 u32SyncDelay, MS_U16 u16SyncTolerance)
1162*53ee8cc1Swenshuai.xi {
1163*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_ENABLE_AVSYNC, (MS_U32)bOn);
1164*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_AVSYNC_DELAY, (MS_U32)u32SyncDelay);
1165*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_SET_AVSYNC_TOLERENCE, (MS_U32)u16SyncTolerance);
1166*53ee8cc1Swenshuai.xi 
1167*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1168*53ee8cc1Swenshuai.xi }
1169*53ee8cc1Swenshuai.xi 
1170*53ee8cc1Swenshuai.xi /******************************************************************************/
1171*53ee8cc1Swenshuai.xi ///Description
1172*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1173*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1174*53ee8cc1Swenshuai.xi ///@return status
1175*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsAVSyncOn(void)1176*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsAVSyncOn(void)
1177*53ee8cc1Swenshuai.xi {
1178*53ee8cc1Swenshuai.xi     return MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_IS_AVSYNC_ON, 0xFFFFFFFF);
1179*53ee8cc1Swenshuai.xi }
1180*53ee8cc1Swenshuai.xi 
1181*53ee8cc1Swenshuai.xi /******************************************************************************/
1182*53ee8cc1Swenshuai.xi ///Description
1183*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1184*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1185*53ee8cc1Swenshuai.xi ///@return status
1186*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsReachSync(void)1187*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsReachSync(void)
1188*53ee8cc1Swenshuai.xi {
1189*53ee8cc1Swenshuai.xi     return MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_IS_REACH_AVSYNC, 0xFFFFFFFF);
1190*53ee8cc1Swenshuai.xi }
1191*53ee8cc1Swenshuai.xi 
1192*53ee8cc1Swenshuai.xi /******************************************************************************/
1193*53ee8cc1Swenshuai.xi ///Description
1194*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1195*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1196*53ee8cc1Swenshuai.xi ///@return status
1197*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetStatus(MJPEG_Status * pStatus)1198*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_GetStatus(MJPEG_Status *pStatus)
1199*53ee8cc1Swenshuai.xi {
1200*53ee8cc1Swenshuai.xi     pStatus->bIdle = MApi_MJPEG_IsIdle();
1201*53ee8cc1Swenshuai.xi     //pStatus->bInit
1202*53ee8cc1Swenshuai.xi     //pStatus->eStage = E_MJPEG_STAGE_PLAY;
1203*53ee8cc1Swenshuai.xi 
1204*53ee8cc1Swenshuai.xi     return FALSE;
1205*53ee8cc1Swenshuai.xi }
1206*53ee8cc1Swenshuai.xi 
1207*53ee8cc1Swenshuai.xi /******************************************************************************/
1208*53ee8cc1Swenshuai.xi ///Return JPD error code
1209*53ee8cc1Swenshuai.xi ///@return JPD error code
1210*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetErrCode(void)1211*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetErrCode(void)
1212*53ee8cc1Swenshuai.xi {
1213*53ee8cc1Swenshuai.xi     // Per XDemux's request, this only returns critical error.
1214*53ee8cc1Swenshuai.xi     // Since no error would prevent JPD from decoding next JPEG,
1215*53ee8cc1Swenshuai.xi     // it always return 0 here.
1216*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("MApi_MJPEG_GetErrCode() with eMJPEGErrCode=0x%x\n", eMJPEGErrCode);
1217*53ee8cc1Swenshuai.xi     return eMJPEGErrCode;
1218*53ee8cc1Swenshuai.xi }
1219*53ee8cc1Swenshuai.xi 
1220*53ee8cc1Swenshuai.xi /******************************************************************************/
1221*53ee8cc1Swenshuai.xi ///Description
1222*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1223*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1224*53ee8cc1Swenshuai.xi ///@return status
1225*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetErrCnt(void)1226*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetErrCnt(void)
1227*53ee8cc1Swenshuai.xi {
1228*53ee8cc1Swenshuai.xi     return 0;
1229*53ee8cc1Swenshuai.xi }
1230*53ee8cc1Swenshuai.xi 
1231*53ee8cc1Swenshuai.xi /******************************************************************************/
1232*53ee8cc1Swenshuai.xi ///Return count of current displayed frame
1233*53ee8cc1Swenshuai.xi ///@return frame count
1234*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetFrameCnt(void)1235*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetFrameCnt(void)
1236*53ee8cc1Swenshuai.xi {
1237*53ee8cc1Swenshuai.xi     return __u32FrameCnt;
1238*53ee8cc1Swenshuai.xi }
1239*53ee8cc1Swenshuai.xi 
1240*53ee8cc1Swenshuai.xi /******************************************************************************/
1241*53ee8cc1Swenshuai.xi ///Return video information
1242*53ee8cc1Swenshuai.xi ///@param pInfo \b OUT video information: width & height
1243*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetDispInfo(MJPEG_DISP_INFO * pInfo)1244*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_GetDispInfo(MJPEG_DISP_INFO *pInfo)
1245*53ee8cc1Swenshuai.xi {
1246*53ee8cc1Swenshuai.xi     // APP wants pitch to setup display
1247*53ee8cc1Swenshuai.xi     // This should be used with crop information
1248*53ee8cc1Swenshuai.xi     pInfo->u16Width = __u16Pitch;
1249*53ee8cc1Swenshuai.xi     pInfo->u16Height = __u16Height;
1250*53ee8cc1Swenshuai.xi     pInfo->u16Pitch = __u16Pitch;
1251*53ee8cc1Swenshuai.xi     pInfo->u32FrameRate = __u32FrameRate * 1000 / __u32FrameRateBase;
1252*53ee8cc1Swenshuai.xi 
1253*53ee8cc1Swenshuai.xi     pInfo->u16CropLeft = (pInfo->u16Width - __u16Width)/2;
1254*53ee8cc1Swenshuai.xi     pInfo->u16CropRight = pInfo->u16Width - __u16Width - pInfo->u16CropLeft;
1255*53ee8cc1Swenshuai.xi     pInfo->u16CropTop = (pInfo->u16Height - __u16Height)/2;
1256*53ee8cc1Swenshuai.xi     pInfo->u16CropBottom = pInfo->u16Height - __u16Height - pInfo->u16CropTop;
1257*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("   Crop info right %d, left %d, bottom %d, top %d\n",
1258*53ee8cc1Swenshuai.xi         pInfo->u16CropRight, pInfo->u16CropLeft, pInfo->u16CropBottom, pInfo->u16CropTop);
1259*53ee8cc1Swenshuai.xi 
1260*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1261*53ee8cc1Swenshuai.xi }
1262*53ee8cc1Swenshuai.xi 
1263*53ee8cc1Swenshuai.xi /******************************************************************************/
1264*53ee8cc1Swenshuai.xi ///Description
1265*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1266*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1267*53ee8cc1Swenshuai.xi ///@return status
1268*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsPlaying(void)1269*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsPlaying(void)
1270*53ee8cc1Swenshuai.xi {
1271*53ee8cc1Swenshuai.xi     if (MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_IS_PLAYING, 0xFFFFFFFF) == 0)
1272*53ee8cc1Swenshuai.xi     {
1273*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsPlaying : FALSE\n");
1274*53ee8cc1Swenshuai.xi         return FALSE;
1275*53ee8cc1Swenshuai.xi     }
1276*53ee8cc1Swenshuai.xi 
1277*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsPlaying : TRUE\n");
1278*53ee8cc1Swenshuai.xi     return TRUE;
1279*53ee8cc1Swenshuai.xi }
1280*53ee8cc1Swenshuai.xi 
1281*53ee8cc1Swenshuai.xi /******************************************************************************/
1282*53ee8cc1Swenshuai.xi ///Return true if idle, including decode done & error
1283*53ee8cc1Swenshuai.xi ///@return idle or not
1284*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsIdle(void)1285*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsIdle(void)
1286*53ee8cc1Swenshuai.xi {
1287*53ee8cc1Swenshuai.xi     JPEG_Event u16Value = MApi_JPEG_GetJPDEventFlag();
1288*53ee8cc1Swenshuai.xi     if ((E_JPEG_EVENT_DEC_DONE & u16Value)
1289*53ee8cc1Swenshuai.xi     || (E_JPEG_EVENT_DEC_ERROR_MASK & u16Value))
1290*53ee8cc1Swenshuai.xi     {
1291*53ee8cc1Swenshuai.xi         MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsIdle : TRUE\n");
1292*53ee8cc1Swenshuai.xi         return TRUE;
1293*53ee8cc1Swenshuai.xi     }
1294*53ee8cc1Swenshuai.xi 
1295*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("           MApi_MJPEG_IsIdle : FALSE\n");
1296*53ee8cc1Swenshuai.xi     return FALSE;
1297*53ee8cc1Swenshuai.xi }
1298*53ee8cc1Swenshuai.xi 
1299*53ee8cc1Swenshuai.xi /******************************************************************************/
1300*53ee8cc1Swenshuai.xi ///Description
1301*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1302*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1303*53ee8cc1Swenshuai.xi ///@return status
1304*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsIFrameFound(void)1305*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsIFrameFound(void)
1306*53ee8cc1Swenshuai.xi {
1307*53ee8cc1Swenshuai.xi     return TRUE;
1308*53ee8cc1Swenshuai.xi }
1309*53ee8cc1Swenshuai.xi 
1310*53ee8cc1Swenshuai.xi /******************************************************************************/
1311*53ee8cc1Swenshuai.xi ///Description
1312*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1313*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1314*53ee8cc1Swenshuai.xi ///@return status
1315*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_IsWithLowDelay(void)1316*53ee8cc1Swenshuai.xi MS_BOOL MApi_MJPEG_IsWithLowDelay(void)
1317*53ee8cc1Swenshuai.xi {
1318*53ee8cc1Swenshuai.xi     return TRUE;
1319*53ee8cc1Swenshuai.xi }
1320*53ee8cc1Swenshuai.xi 
1321*53ee8cc1Swenshuai.xi /******************************************************************************/
1322*53ee8cc1Swenshuai.xi ///Description
1323*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1324*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1325*53ee8cc1Swenshuai.xi ///@return status
1326*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetDecFrameInfo(MJPEG_FrameInfo * pFrmInfo)1327*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_GetDecFrameInfo(MJPEG_FrameInfo *pFrmInfo)
1328*53ee8cc1Swenshuai.xi {
1329*53ee8cc1Swenshuai.xi     if(FALSE == isDecFrameInfoValid)
1330*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_FAIL;
1331*53ee8cc1Swenshuai.xi 
1332*53ee8cc1Swenshuai.xi     pFrmInfo->u32LumaAddr = infoDecFrame.u32LumaAddr;
1333*53ee8cc1Swenshuai.xi     pFrmInfo->u32ChromaAddr = infoDecFrame.u32ChromaAddr;
1334*53ee8cc1Swenshuai.xi     pFrmInfo->u32TimeStamp = infoDecFrame.u32TimeStamp;
1335*53ee8cc1Swenshuai.xi     pFrmInfo->u32ID_L = infoDecFrame.u32ID_L;
1336*53ee8cc1Swenshuai.xi     pFrmInfo->u32ID_H = infoDecFrame.u32ID_H;
1337*53ee8cc1Swenshuai.xi     pFrmInfo->u16Pitch = infoDecFrame.u16Pitch;
1338*53ee8cc1Swenshuai.xi     pFrmInfo->u16Width = infoDecFrame.u16Width;
1339*53ee8cc1Swenshuai.xi     pFrmInfo->u16Height = infoDecFrame.u16Height;
1340*53ee8cc1Swenshuai.xi     pFrmInfo->eFrameType = E_MJPEG_FRM_TYPE_I;
1341*53ee8cc1Swenshuai.xi 
1342*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1343*53ee8cc1Swenshuai.xi }
1344*53ee8cc1Swenshuai.xi 
1345*53ee8cc1Swenshuai.xi /******************************************************************************/
1346*53ee8cc1Swenshuai.xi ///Description
1347*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1348*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1349*53ee8cc1Swenshuai.xi ///@return status
1350*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetDispFrameInfo(MJPEG_FrameInfo * pFrmInfo)1351*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_GetDispFrameInfo(MJPEG_FrameInfo *pFrmInfo)
1352*53ee8cc1Swenshuai.xi {
1353*53ee8cc1Swenshuai.xi     #if ENABLE_AVSYNC_ID_CHECK
1354*53ee8cc1Swenshuai.xi     static MS_U32 u32OldID_L = 0, u32OldID_H = 0, u32OldTimeStamp = 0;
1355*53ee8cc1Swenshuai.xi     #endif
1356*53ee8cc1Swenshuai.xi     MJPEG_FrameInfo info;
1357*53ee8cc1Swenshuai.xi     MDrv_JPD_GetDispFrameInfo((void *)&info);
1358*53ee8cc1Swenshuai.xi 
1359*53ee8cc1Swenshuai.xi     pFrmInfo->u32LumaAddr = info.u32LumaAddr;
1360*53ee8cc1Swenshuai.xi     pFrmInfo->u32ChromaAddr = info.u32ChromaAddr;
1361*53ee8cc1Swenshuai.xi     pFrmInfo->u32TimeStamp = info.u32TimeStamp;
1362*53ee8cc1Swenshuai.xi     pFrmInfo->u32ID_L = info.u32ID_L;
1363*53ee8cc1Swenshuai.xi     pFrmInfo->u32ID_H = info.u32ID_H;
1364*53ee8cc1Swenshuai.xi     pFrmInfo->u16Pitch = __u16Pitch;
1365*53ee8cc1Swenshuai.xi     pFrmInfo->u16Width = __u16Width;
1366*53ee8cc1Swenshuai.xi     pFrmInfo->u16Height = __u16Height;
1367*53ee8cc1Swenshuai.xi     pFrmInfo->eFrameType = E_MJPEG_FRM_TYPE_I;
1368*53ee8cc1Swenshuai.xi 
1369*53ee8cc1Swenshuai.xi     #if ENABLE_AVSYNC_ID_CHECK
1370*53ee8cc1Swenshuai.xi     if (u32OldID_H != pFrmInfo->u32ID_H || u32OldID_L != pFrmInfo->u32ID_L
1371*53ee8cc1Swenshuai.xi         || u32OldTimeStamp != pFrmInfo->u32TimeStamp)
1372*53ee8cc1Swenshuai.xi     {
1373*53ee8cc1Swenshuai.xi         printf ("ID 0x%08lx%08lx    PTS %ld     addr 0x%lx\n",
1374*53ee8cc1Swenshuai.xi             pFrmInfo->u32ID_H, pFrmInfo->u32ID_L, pFrmInfo->u32TimeStamp, pFrmInfo->u32LumaAddr);
1375*53ee8cc1Swenshuai.xi         u32OldID_H = pFrmInfo->u32ID_H;
1376*53ee8cc1Swenshuai.xi         u32OldID_L = pFrmInfo->u32ID_L;
1377*53ee8cc1Swenshuai.xi         u32OldTimeStamp = pFrmInfo->u32TimeStamp;
1378*53ee8cc1Swenshuai.xi     }
1379*53ee8cc1Swenshuai.xi     #endif
1380*53ee8cc1Swenshuai.xi 
1381*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1382*53ee8cc1Swenshuai.xi }
1383*53ee8cc1Swenshuai.xi 
1384*53ee8cc1Swenshuai.xi /******************************************************************************/
1385*53ee8cc1Swenshuai.xi ///Description
1386*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1387*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1388*53ee8cc1Swenshuai.xi ///@return status
1389*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_DbgSetMsgLevel(MJPEG_DbgLevel eDbgLevel)1390*53ee8cc1Swenshuai.xi void MApi_MJPEG_DbgSetMsgLevel(MJPEG_DbgLevel eDbgLevel)
1391*53ee8cc1Swenshuai.xi {
1392*53ee8cc1Swenshuai.xi     MS_U8 u8Level;
1393*53ee8cc1Swenshuai.xi 
1394*53ee8cc1Swenshuai.xi     switch (eDbgLevel)
1395*53ee8cc1Swenshuai.xi     {
1396*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_ERR:
1397*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_ERR;
1398*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_ERR;
1399*53ee8cc1Swenshuai.xi         break;
1400*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_INFO:
1401*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_ERR;
1402*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_MJPEG | E_JPEG_DEBUG_ERR;
1403*53ee8cc1Swenshuai.xi         break;
1404*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_DBG:
1405*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_ALL;
1406*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_API | E_JPEG_DEBUG_ERR;
1407*53ee8cc1Swenshuai.xi         break;
1408*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_TRACE:
1409*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_ALL;
1410*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_API | E_JPEG_DEBUG_ERR;
1411*53ee8cc1Swenshuai.xi         break;
1412*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_FW:
1413*53ee8cc1Swenshuai.xi         printf ("\n   !!!Firmware debug message is not supported yet!!!\n\n");
1414*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_NONE;
1415*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
1416*53ee8cc1Swenshuai.xi         break;
1417*53ee8cc1Swenshuai.xi     case E_MJPEG_DBG_LEVEL_NONE:
1418*53ee8cc1Swenshuai.xi     default:
1419*53ee8cc1Swenshuai.xi         u8Level = E_JPEG_DEBUG_NONE;
1420*53ee8cc1Swenshuai.xi         _u8MJPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
1421*53ee8cc1Swenshuai.xi         break;
1422*53ee8cc1Swenshuai.xi     }
1423*53ee8cc1Swenshuai.xi 
1424*53ee8cc1Swenshuai.xi     MApi_JPEG_SetDbgLevel(u8Level);
1425*53ee8cc1Swenshuai.xi     MDrv_MJPEG_SetDbgLevel(u8Level);
1426*53ee8cc1Swenshuai.xi }
1427*53ee8cc1Swenshuai.xi 
1428*53ee8cc1Swenshuai.xi /******************************************************************************/
1429*53ee8cc1Swenshuai.xi ///Description
1430*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1431*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1432*53ee8cc1Swenshuai.xi ///@return status
1433*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_DbgSetData(MS_PHYADDR u32Addr,MS_U32 u32Data)1434*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_DbgSetData(MS_PHYADDR u32Addr, MS_U32 u32Data)
1435*53ee8cc1Swenshuai.xi {
1436*53ee8cc1Swenshuai.xi     u32Addr = u32Addr;
1437*53ee8cc1Swenshuai.xi     u32Data = u32Data;
1438*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1439*53ee8cc1Swenshuai.xi }
1440*53ee8cc1Swenshuai.xi 
1441*53ee8cc1Swenshuai.xi /******************************************************************************/
1442*53ee8cc1Swenshuai.xi ///Description
1443*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1444*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1445*53ee8cc1Swenshuai.xi ///@return status
1446*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_DbgGetData(MS_PHYADDR u32Addr,MS_U32 * u32Data)1447*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_DbgGetData(MS_PHYADDR u32Addr, MS_U32* u32Data)
1448*53ee8cc1Swenshuai.xi {
1449*53ee8cc1Swenshuai.xi     u32Addr = u32Addr;
1450*53ee8cc1Swenshuai.xi     *u32Data = 0;
1451*53ee8cc1Swenshuai.xi 
1452*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1453*53ee8cc1Swenshuai.xi }
1454*53ee8cc1Swenshuai.xi 
1455*53ee8cc1Swenshuai.xi /******************************************************************************/
1456*53ee8cc1Swenshuai.xi ///Description
1457*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1458*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1459*53ee8cc1Swenshuai.xi ///@return status
1460*53ee8cc1Swenshuai.xi /******************************************************************************/
1461*53ee8cc1Swenshuai.xi #if DECODER_RENDER_ARCH
MApi_MJPEG_DispFrame(MS_U32 u32DispIdx)1462*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_DispFrame(MS_U32 u32DispIdx)
1463*53ee8cc1Swenshuai.xi {
1464*53ee8cc1Swenshuai.xi     MDrv_JPD_DispFrame(u32DispIdx);
1465*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1466*53ee8cc1Swenshuai.xi }
1467*53ee8cc1Swenshuai.xi 
1468*53ee8cc1Swenshuai.xi /******************************************************************************/
1469*53ee8cc1Swenshuai.xi ///Description
1470*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1471*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1472*53ee8cc1Swenshuai.xi ///@return status
1473*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_FreeFrame(MS_U32 u32DispIdx)1474*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_FreeFrame(MS_U32 u32DispIdx)
1475*53ee8cc1Swenshuai.xi {
1476*53ee8cc1Swenshuai.xi     MDrv_JPD_FreeFrame(u32DispIdx);
1477*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1478*53ee8cc1Swenshuai.xi }
1479*53ee8cc1Swenshuai.xi 
1480*53ee8cc1Swenshuai.xi /******************************************************************************/
1481*53ee8cc1Swenshuai.xi ///Description
1482*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1483*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1484*53ee8cc1Swenshuai.xi ///@return status
1485*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetNextDispFrame(MJPEG_FrameInfo * pFrmInfo)1486*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_GetNextDispFrame(MJPEG_FrameInfo *pFrmInfo)
1487*53ee8cc1Swenshuai.xi {
1488*53ee8cc1Swenshuai.xi     MJPEG_FrameInfo *pSrc = (MJPEG_FrameInfo*)MDrv_JPD_GetNextDispFrame();
1489*53ee8cc1Swenshuai.xi     if (pSrc != NULL)
1490*53ee8cc1Swenshuai.xi     {
1491*53ee8cc1Swenshuai.xi         _MJPEG_Memcpy(pFrmInfo, pSrc, sizeof(MJPEG_FrameInfo));
1492*53ee8cc1Swenshuai.xi         pFrmInfo->u16Width = __u16Pitch;
1493*53ee8cc1Swenshuai.xi         pFrmInfo->u16Height = __u16Height;
1494*53ee8cc1Swenshuai.xi         pFrmInfo->u16Pitch = __u16Pitch;
1495*53ee8cc1Swenshuai.xi         pFrmInfo->eFrameType = E_MJPEG_FRM_TYPE_I;
1496*53ee8cc1Swenshuai.xi         return E_MJPEG_RET_SUCCESS;
1497*53ee8cc1Swenshuai.xi     }
1498*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
1499*53ee8cc1Swenshuai.xi }
1500*53ee8cc1Swenshuai.xi 
1501*53ee8cc1Swenshuai.xi /******************************************************************************/
1502*53ee8cc1Swenshuai.xi ///Description
1503*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1504*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1505*53ee8cc1Swenshuai.xi ///@return status
1506*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetNextDispQPtr(void)1507*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetNextDispQPtr(void)
1508*53ee8cc1Swenshuai.xi {
1509*53ee8cc1Swenshuai.xi     return MDrv_JPD_GetNextDispQPtr();
1510*53ee8cc1Swenshuai.xi }
1511*53ee8cc1Swenshuai.xi 
1512*53ee8cc1Swenshuai.xi /******************************************************************************/
1513*53ee8cc1Swenshuai.xi ///Description
1514*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1515*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1516*53ee8cc1Swenshuai.xi ///@return status
1517*53ee8cc1Swenshuai.xi /******************************************************************************/
1518*53ee8cc1Swenshuai.xi #else
MApi_MJPEG_DispFrame(MS_U32 u32DispIdx)1519*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_DispFrame(MS_U32 u32DispIdx)
1520*53ee8cc1Swenshuai.xi {
1521*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
1522*53ee8cc1Swenshuai.xi }
1523*53ee8cc1Swenshuai.xi 
1524*53ee8cc1Swenshuai.xi /******************************************************************************/
1525*53ee8cc1Swenshuai.xi ///Description
1526*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1527*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1528*53ee8cc1Swenshuai.xi ///@return status
1529*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_FreeFrame(MS_U32 u32DispIdx)1530*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_FreeFrame(MS_U32 u32DispIdx)
1531*53ee8cc1Swenshuai.xi {
1532*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
1533*53ee8cc1Swenshuai.xi }
1534*53ee8cc1Swenshuai.xi 
1535*53ee8cc1Swenshuai.xi /******************************************************************************/
1536*53ee8cc1Swenshuai.xi ///Description
1537*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1538*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1539*53ee8cc1Swenshuai.xi ///@return status
1540*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetNextDispFrame(MJPEG_FrameInfo * pFrmInfo)1541*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_GetNextDispFrame(MJPEG_FrameInfo *pFrmInfo)
1542*53ee8cc1Swenshuai.xi {
1543*53ee8cc1Swenshuai.xi     UNUSED(pFrmInfo);
1544*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
1545*53ee8cc1Swenshuai.xi }
1546*53ee8cc1Swenshuai.xi 
1547*53ee8cc1Swenshuai.xi /******************************************************************************/
1548*53ee8cc1Swenshuai.xi ///Description
1549*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1550*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1551*53ee8cc1Swenshuai.xi ///@return status
1552*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetNextDispQPtr(void)1553*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetNextDispQPtr(void)
1554*53ee8cc1Swenshuai.xi {
1555*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
1556*53ee8cc1Swenshuai.xi }
1557*53ee8cc1Swenshuai.xi #endif
MApi_MJPEG_EnableDispCmdQ(MS_BOOL bEnable)1558*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_EnableDispCmdQ(MS_BOOL bEnable)
1559*53ee8cc1Swenshuai.xi {
1560*53ee8cc1Swenshuai.xi     bEnableDispCmdQ = bEnable;
1561*53ee8cc1Swenshuai.xi 
1562*53ee8cc1Swenshuai.xi     MDrv_JPD_SendVPUCommand(E_MJPEG_CMD_ENABLE_DISP_CMD_QUEUE, bEnable);
1563*53ee8cc1Swenshuai.xi 
1564*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1565*53ee8cc1Swenshuai.xi }
1566*53ee8cc1Swenshuai.xi 
1567*53ee8cc1Swenshuai.xi /******************************************************************************/
1568*53ee8cc1Swenshuai.xi ///Description
1569*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1570*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1571*53ee8cc1Swenshuai.xi ///@return status
1572*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_PushDispCmdQ(void)1573*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_PushDispCmdQ(void)
1574*53ee8cc1Swenshuai.xi {
1575*53ee8cc1Swenshuai.xi     if (bEnableDispCmdQ)
1576*53ee8cc1Swenshuai.xi     {
1577*53ee8cc1Swenshuai.xi     }
1578*53ee8cc1Swenshuai.xi 
1579*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_FAIL;
1580*53ee8cc1Swenshuai.xi }
1581*53ee8cc1Swenshuai.xi 
1582*53ee8cc1Swenshuai.xi /******************************************************************************/
1583*53ee8cc1Swenshuai.xi ///Description
1584*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1585*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1586*53ee8cc1Swenshuai.xi ///@return status
1587*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_GetDispCmdQVacancy(void)1588*53ee8cc1Swenshuai.xi MS_U32 MApi_MJPEG_GetDispCmdQVacancy(void)
1589*53ee8cc1Swenshuai.xi {
1590*53ee8cc1Swenshuai.xi     if (bEnableDispCmdQ)
1591*53ee8cc1Swenshuai.xi     {
1592*53ee8cc1Swenshuai.xi     }
1593*53ee8cc1Swenshuai.xi 
1594*53ee8cc1Swenshuai.xi     return 0;
1595*53ee8cc1Swenshuai.xi }
1596*53ee8cc1Swenshuai.xi 
1597*53ee8cc1Swenshuai.xi /******************************************************************************/
1598*53ee8cc1Swenshuai.xi ///Description
1599*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1600*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1601*53ee8cc1Swenshuai.xi ///@return status
1602*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_SeekToPTS(MS_U32 u32PTS)1603*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SeekToPTS(MS_U32 u32PTS)
1604*53ee8cc1Swenshuai.xi {
1605*53ee8cc1Swenshuai.xi     __bSeekToPts = TRUE;
1606*53ee8cc1Swenshuai.xi     __u32Skip2PtsBase = MApi_MJPEG_GetPTS();
1607*53ee8cc1Swenshuai.xi     __u32TargetPts = u32PTS;
1608*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("   Seek from PTS %ld to %ld\n", __u32Skip2PtsBase, __u32TargetPts);
1609*53ee8cc1Swenshuai.xi 
1610*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1611*53ee8cc1Swenshuai.xi }
1612*53ee8cc1Swenshuai.xi 
1613*53ee8cc1Swenshuai.xi /******************************************************************************/
1614*53ee8cc1Swenshuai.xi ///Description
1615*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
1616*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
1617*53ee8cc1Swenshuai.xi ///@return status
1618*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_SkipToPTS(MS_U32 u32PTS)1619*53ee8cc1Swenshuai.xi MJPEG_Result MApi_MJPEG_SkipToPTS(MS_U32 u32PTS)
1620*53ee8cc1Swenshuai.xi {
1621*53ee8cc1Swenshuai.xi     __bSkipToPts = TRUE;
1622*53ee8cc1Swenshuai.xi     __u32Skip2PtsBase = MApi_MJPEG_GetPTS();
1623*53ee8cc1Swenshuai.xi     __u32TargetPts = u32PTS;
1624*53ee8cc1Swenshuai.xi     MJPEG_DEBUG_API_MSG("   Skip from PTS %ld to %ld\n", __u32Skip2PtsBase, __u32TargetPts);
1625*53ee8cc1Swenshuai.xi 
1626*53ee8cc1Swenshuai.xi     return E_MJPEG_RET_SUCCESS;
1627*53ee8cc1Swenshuai.xi }
1628*53ee8cc1Swenshuai.xi 
1629*53ee8cc1Swenshuai.xi /******************************************************************************/
1630*53ee8cc1Swenshuai.xi ///Description : Enable/Disable FW turbo mode
1631*53ee8cc1Swenshuai.xi ///@param bEnable \b IN enable or not.
1632*53ee8cc1Swenshuai.xi ///@return NONE
1633*53ee8cc1Swenshuai.xi /******************************************************************************/
MApi_MJPEG_EnableTurboFWMode(MS_BOOL bEnable)1634*53ee8cc1Swenshuai.xi void MApi_MJPEG_EnableTurboFWMode(MS_BOOL bEnable)
1635*53ee8cc1Swenshuai.xi {
1636*53ee8cc1Swenshuai.xi     MDrv_JPD_EnableTurboFWMode(bEnable);
1637*53ee8cc1Swenshuai.xi }
1638*53ee8cc1Swenshuai.xi 
1639