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