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 /// file drvMVD.c
94*53ee8cc1Swenshuai.xi /// @brief MPEG-2/4 Video Decoder Driver
95*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
98*53ee8cc1Swenshuai.xi
99*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
100*53ee8cc1Swenshuai.xi // Include Files
101*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
102*53ee8cc1Swenshuai.xi // Common Definition
103*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
104*53ee8cc1Swenshuai.xi #include <linux/string.h>
105*53ee8cc1Swenshuai.xi #else
106*53ee8cc1Swenshuai.xi #include <string.h>
107*53ee8cc1Swenshuai.xi #endif
108*53ee8cc1Swenshuai.xi #include "MsCommon.h"
109*53ee8cc1Swenshuai.xi #include "MsVersion.h"
110*53ee8cc1Swenshuai.xi #include "halCHIP.h"
111*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
112*53ee8cc1Swenshuai.xi #include "drvMIU.h"
113*53ee8cc1Swenshuai.xi #include "drvMVD_EX.h"
114*53ee8cc1Swenshuai.xi
115*53ee8cc1Swenshuai.xi // Internal Definition
116*53ee8cc1Swenshuai.xi #include "halMVD_EX.h"
117*53ee8cc1Swenshuai.xi #include "asmCPU.h"
118*53ee8cc1Swenshuai.xi #include "controller.h"
119*53ee8cc1Swenshuai.xi #include "osalMVD_EX.h"
120*53ee8cc1Swenshuai.xi #include "drvmvd_cc.h" //ATSC Closed Caption
121*53ee8cc1Swenshuai.xi //#include "drvCMAPool.h" // TODO: wait for system to merge CMA kernel mode
122*53ee8cc1Swenshuai.xi #include "drvCMAPool_v2.h"
123*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX)
124*53ee8cc1Swenshuai.xi #include "msos/linux/mdrv_cma_pool_st.h"
125*53ee8cc1Swenshuai.xi #endif
126*53ee8cc1Swenshuai.xi #include "mvd4_interface.h" //firmware header
127*53ee8cc1Swenshuai.xi #include "MVD_EX_Common.h"
128*53ee8cc1Swenshuai.xi
129*53ee8cc1Swenshuai.xi #if (!defined(MSOS_TYPE_NUTTX) && !defined(MSOS_TYPE_OPTEE)) || defined(SUPPORT_X_MODEL_FEATURE)
130*53ee8cc1Swenshuai.xi #include "ULog.h"
131*53ee8cc1Swenshuai.xi
132*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
133*53ee8cc1Swenshuai.xi // Local defines & local structures
134*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
135*53ee8cc1Swenshuai.xi //Different level debug message
136*53ee8cc1Swenshuai.xi #if ((defined(CHIP_A1) || defined(CHIP_A7) || defined(CHIP_AMETHYST)) && defined (__aeon__))
137*53ee8cc1Swenshuai.xi #define MVD_DEBUGVERBAL(x)
138*53ee8cc1Swenshuai.xi #define MVD_DEBUGINFO(x)
139*53ee8cc1Swenshuai.xi #else
140*53ee8cc1Swenshuai.xi #define MVD_DEBUGVERBAL(x) if (_u8DbgLevel>4) { (x); }
141*53ee8cc1Swenshuai.xi #define MVD_DEBUGINFO(x) if (_u8DbgLevel>1) { (x); }
142*53ee8cc1Swenshuai.xi #endif
143*53ee8cc1Swenshuai.xi #define MVD_DEBUGERROR(x) if (_u8DbgLevel>0) { (x); }
144*53ee8cc1Swenshuai.xi #define MVD_FUNC_ENTRY() {}//MVD_PRINT(" $$$ drvMVD::%s\n", __FUNCTION__)
145*53ee8cc1Swenshuai.xi
146*53ee8cc1Swenshuai.xi
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi
149*53ee8cc1Swenshuai.xi
150*53ee8cc1Swenshuai.xi #define DISABLE_ISR_DETACH
151*53ee8cc1Swenshuai.xi
152*53ee8cc1Swenshuai.xi #define _DUMP_FRMINFO FALSE
153*53ee8cc1Swenshuai.xi
154*53ee8cc1Swenshuai.xi #define _MS_TO_90K(x) (x*90) //ms ==> 90k counter
155*53ee8cc1Swenshuai.xi #define _90K_TO_MS(x) (x/90) //90k counter ==> ms
156*53ee8cc1Swenshuai.xi
157*53ee8cc1Swenshuai.xi #define _MVD_GET_IDX(x) (MS_U8)(((x) >>16) & 0xff)
158*53ee8cc1Swenshuai.xi #define _MVD_GET_HAL_SID(x) (HAL_MVD_StreamId)(((x) >>8) & 0xff)
159*53ee8cc1Swenshuai.xi #define _MVD_GET_VPU_SID(x) (HAL_VPU_StreamId)((x) & 0xff)
160*53ee8cc1Swenshuai.xi
161*53ee8cc1Swenshuai.xi #define MVD_U32_MAX 0xffffffffUL
162*53ee8cc1Swenshuai.xi #define MVD_U32_MASK 0xf0000000UL
163*53ee8cc1Swenshuai.xi #define PB_ONLY_UNMUTE_VSYNC_COUNT 30
164*53ee8cc1Swenshuai.xi
165*53ee8cc1Swenshuai.xi #ifdef VDEC3
166*53ee8cc1Swenshuai.xi #define MVD_MAX_STREAMS 16
167*53ee8cc1Swenshuai.xi #else
168*53ee8cc1Swenshuai.xi #define MVD_MAX_STREAMS 2
169*53ee8cc1Swenshuai.xi #endif
170*53ee8cc1Swenshuai.xi
171*53ee8cc1Swenshuai.xi #ifdef VDEC3
172*53ee8cc1Swenshuai.xi #define v3_temp 1
173*53ee8cc1Swenshuai.xi #define v3_thinplayer 0
174*53ee8cc1Swenshuai.xi #else
175*53ee8cc1Swenshuai.xi #define v3_temp 0
176*53ee8cc1Swenshuai.xi #define v3_thinplayer 0
177*53ee8cc1Swenshuai.xi #endif
178*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
179*53ee8cc1Swenshuai.xi // Local Global Variables
180*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
181*53ee8cc1Swenshuai.xi #if 0
182*53ee8cc1Swenshuai.xi /// Version string
183*53ee8cc1Swenshuai.xi static MSIF_Version _drv_mvd_version = {
184*53ee8cc1Swenshuai.xi .DDI = { MVD_DRV_VERSION, },
185*53ee8cc1Swenshuai.xi };
186*53ee8cc1Swenshuai.xi
187*53ee8cc1Swenshuai.xi static MVD_DrvInfo _stDrvInfo = {
188*53ee8cc1Swenshuai.xi 1, //1 MVD HW
189*53ee8cc1Swenshuai.xi 0, //Device# fixme
190*53ee8cc1Swenshuai.xi MVD_U32_MAX, //firmware version
191*53ee8cc1Swenshuai.xi { FALSE, FALSE, FALSE } //capability
192*53ee8cc1Swenshuai.xi };
193*53ee8cc1Swenshuai.xi
194*53ee8cc1Swenshuai.xi static MS_U8 _u8DbgLevel = 0;
195*53ee8cc1Swenshuai.xi
196*53ee8cc1Swenshuai.xi static MS_BOOL bFrmRateSupported[MVD_MAX_STREAMS];
197*53ee8cc1Swenshuai.xi static MVD_FrameInfo stPreFrmInfo[MVD_MAX_STREAMS];
198*53ee8cc1Swenshuai.xi static MVD_AVSyncCfg stNFPSyncCfg[MVD_MAX_STREAMS];
199*53ee8cc1Swenshuai.xi static MVD_AVSyncCfg stSyncCfg[MVD_MAX_STREAMS];
200*53ee8cc1Swenshuai.xi
201*53ee8cc1Swenshuai.xi #ifdef MVD_ENABLE_ISR
202*53ee8cc1Swenshuai.xi static MVD_InterruptCb _pfnCallback[MVD_MAX_STREAMS];
203*53ee8cc1Swenshuai.xi static MS_U32 _eEventFlag[MVD_MAX_STREAMS];
204*53ee8cc1Swenshuai.xi static MS_U32 _eCurEvent[MVD_MAX_STREAMS];
205*53ee8cc1Swenshuai.xi static MS_U32 _u32CallbackPara[MVD_MAX_STREAMS];
206*53ee8cc1Swenshuai.xi #endif
207*53ee8cc1Swenshuai.xi
208*53ee8cc1Swenshuai.xi static MS_U32 u32SyncDoneCnt = 0;
209*53ee8cc1Swenshuai.xi static MS_U32 u32VSyncCnt = 0;
210*53ee8cc1Swenshuai.xi static MS_BOOL bMVDIsrAttached = FALSE;
211*53ee8cc1Swenshuai.xi static MS_BOOL bSuspendDS_Ftime=TRUE; //to check 3d<->2d mode first time
212*53ee8cc1Swenshuai.xi
213*53ee8cc1Swenshuai.xi typedef struct
214*53ee8cc1Swenshuai.xi {
215*53ee8cc1Swenshuai.xi MS_BOOL bUsed; //updated when init/exit
216*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx; //index used by HAL. use it to communicate with HAL.
217*53ee8cc1Swenshuai.xi MS_U16 u16Rsvd; //reserved bytes
218*53ee8cc1Swenshuai.xi
219*53ee8cc1Swenshuai.xi MS_U32 u32VpuSid; //StreamID obtained from VPU by HAL_VPU_GetFreeStream()
220*53ee8cc1Swenshuai.xi MS_U32 u32MvdSid; //StreamID obtained from VPU by HAL_MVD_GetFreeStream()
221*53ee8cc1Swenshuai.xi } MVD_Drv_Ctrl;
222*53ee8cc1Swenshuai.xi static MVD_Drv_Ctrl gMVDCtrl_EX[MVD_MAX_STREAMS]
223*53ee8cc1Swenshuai.xi = { { FALSE, 0, 0, 0, 0},
224*53ee8cc1Swenshuai.xi { FALSE, 0, 0, 0, 0},
225*53ee8cc1Swenshuai.xi };//ToDo: check when to init/reset!
226*53ee8cc1Swenshuai.xi #endif
227*53ee8cc1Swenshuai.xi typedef struct
228*53ee8cc1Swenshuai.xi {
229*53ee8cc1Swenshuai.xi MS_BOOL bUsed; //updated when init/exit
230*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx; //index used by HAL. use it to communicate with HAL.
231*53ee8cc1Swenshuai.xi MS_U16 u16Rsvd; //reserved bytes
232*53ee8cc1Swenshuai.xi
233*53ee8cc1Swenshuai.xi MS_U32 u32VpuSid; //StreamID obtained from VPU by HAL_VPU_GetFreeStream()
234*53ee8cc1Swenshuai.xi MS_U32 u32MvdSid; //StreamID obtained from VPU by HAL_MVD_GetFreeStream()
235*53ee8cc1Swenshuai.xi } MVD_Drv_Ctrl;
236*53ee8cc1Swenshuai.xi
237*53ee8cc1Swenshuai.xi typedef struct
238*53ee8cc1Swenshuai.xi {
239*53ee8cc1Swenshuai.xi MS_BOOL bFrmRateSupported[MVD_MAX_STREAMS];
240*53ee8cc1Swenshuai.xi MVD_FrameInfo stPreFrmInfo[MVD_MAX_STREAMS];
241*53ee8cc1Swenshuai.xi MVD_AVSyncCfg stNFPSyncCfg[MVD_MAX_STREAMS];
242*53ee8cc1Swenshuai.xi MVD_AVSyncCfg stSyncCfg[MVD_MAX_STREAMS];
243*53ee8cc1Swenshuai.xi
244*53ee8cc1Swenshuai.xi #ifdef MVD_ENABLE_ISR
245*53ee8cc1Swenshuai.xi MVD_InterruptCb _pfnCallback[MVD_MAX_STREAMS];
246*53ee8cc1Swenshuai.xi MS_U32 _eEventFlag[MVD_MAX_STREAMS];
247*53ee8cc1Swenshuai.xi MS_U32 _eCurEvent[MVD_MAX_STREAMS];
248*53ee8cc1Swenshuai.xi MS_U32 _u32CallbackPara[MVD_MAX_STREAMS];
249*53ee8cc1Swenshuai.xi #endif
250*53ee8cc1Swenshuai.xi
251*53ee8cc1Swenshuai.xi MS_U32 u32SyncDoneCnt[MVD_MAX_STREAMS];
252*53ee8cc1Swenshuai.xi MS_U32 u32VSyncCnt[MVD_MAX_STREAMS];
253*53ee8cc1Swenshuai.xi MS_BOOL bSuspendDS_Ftime[MVD_MAX_STREAMS];
254*53ee8cc1Swenshuai.xi
255*53ee8cc1Swenshuai.xi MVD_Drv_Ctrl gMVDCtrl_EX[MVD_MAX_STREAMS];//ToDo: check when to init/reset!
256*53ee8cc1Swenshuai.xi
257*53ee8cc1Swenshuai.xi MS_U8 u8Afd[MVD_MAX_STREAMS];//MDrv_MVD_GetActiveFormat()
258*53ee8cc1Swenshuai.xi #if (MVD_TURBO_INIT)
259*53ee8cc1Swenshuai.xi MS_U32 u32FrmCnt[MVD_MAX_STREAMS];//MDrv_MVD_GetActiveFormat()
260*53ee8cc1Swenshuai.xi #endif
261*53ee8cc1Swenshuai.xi MS_BOOL bSelf_SeqChange[MVD_MAX_STREAMS];
262*53ee8cc1Swenshuai.xi //pre_set
263*53ee8cc1Swenshuai.xi MVD_Pre_Ctrl gMVDPreCtrl[MVD_MAX_STREAMS];
264*53ee8cc1Swenshuai.xi
265*53ee8cc1Swenshuai.xi MS_U32 u32Id[MVD_MAX_STREAMS];
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi #ifdef VDEC3
268*53ee8cc1Swenshuai.xi MS_U32 u32FrameBaseMode[MVD_MAX_STREAMS];
269*53ee8cc1Swenshuai.xi #endif
270*53ee8cc1Swenshuai.xi MS_BOOL bCMAUsed;
271*53ee8cc1Swenshuai.xi MS_BOOL bCMAAllocDone;
272*53ee8cc1Swenshuai.xi struct CMA_Pool_Init_Param cmaInitParam; // support two MIU
273*53ee8cc1Swenshuai.xi struct CMA_Pool_Free_Param cmaFreeParam[MVD_MAX_STREAMS];
274*53ee8cc1Swenshuai.xi MS_BOOL bCMATwoMIU[MVD_MAX_STREAMS];
275*53ee8cc1Swenshuai.xi MS_BOOL bTrickPlay2xAVSync[MVD_MAX_STREAMS];
276*53ee8cc1Swenshuai.xi } MVD_Drv_CTX;
277*53ee8cc1Swenshuai.xi
278*53ee8cc1Swenshuai.xi // global variables
279*53ee8cc1Swenshuai.xi MVD_Drv_CTX* pMVDDrvContext = NULL;
280*53ee8cc1Swenshuai.xi MVD_Drv_CTX gMVDDrvContext;
281*53ee8cc1Swenshuai.xi MSIF_Version _drv_mvd_version = {
282*53ee8cc1Swenshuai.xi .DDI = { MVD_DRV_VERSION, },
283*53ee8cc1Swenshuai.xi };
284*53ee8cc1Swenshuai.xi MVD_DrvInfo _stDrvInfo = {
285*53ee8cc1Swenshuai.xi 1, //1 MVD HW
286*53ee8cc1Swenshuai.xi 0, //Device# fixme
287*53ee8cc1Swenshuai.xi MVD_U32_MAX, //firmware version
288*53ee8cc1Swenshuai.xi {FALSE, FALSE, FALSE} //capability
289*53ee8cc1Swenshuai.xi };
290*53ee8cc1Swenshuai.xi MS_U8 _u8DbgLevel = 0;
291*53ee8cc1Swenshuai.xi MS_BOOL bMVDIsrAttached = FALSE;
292*53ee8cc1Swenshuai.xi MS_BOOL _bDisableFlag = TRUE;
293*53ee8cc1Swenshuai.xi
294*53ee8cc1Swenshuai.xi
295*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
296*53ee8cc1Swenshuai.xi // Local functions
297*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
298*53ee8cc1Swenshuai.xi
MVD_Context_Init(void)299*53ee8cc1Swenshuai.xi static void MVD_Context_Init(void)
300*53ee8cc1Swenshuai.xi {
301*53ee8cc1Swenshuai.xi pMVDDrvContext->bSuspendDS_Ftime[0] = TRUE;
302*53ee8cc1Swenshuai.xi pMVDDrvContext->bSuspendDS_Ftime[1] = TRUE;
303*53ee8cc1Swenshuai.xi pMVDDrvContext->u8Afd[0] = 0xff;
304*53ee8cc1Swenshuai.xi pMVDDrvContext->u8Afd[1] = 0xff;
305*53ee8cc1Swenshuai.xi }
306*53ee8cc1Swenshuai.xi
307*53ee8cc1Swenshuai.xi
308*53ee8cc1Swenshuai.xi static void MVD_InitVar(MS_U8 u8DrvIdx,MS_U8 u8HalIdx);
309*53ee8cc1Swenshuai.xi
MVD_SaveStreamId(MS_U8 u8DrvIdx,MS_U32 u32MvdSid,MS_U32 u32VpuSid)310*53ee8cc1Swenshuai.xi static MS_BOOL MVD_SaveStreamId(MS_U8 u8DrvIdx, MS_U32 u32MvdSid, MS_U32 u32VpuSid)
311*53ee8cc1Swenshuai.xi {
312*53ee8cc1Swenshuai.xi if (pMVDDrvContext->gMVDCtrl_EX[u8DrvIdx].bUsed)
313*53ee8cc1Swenshuai.xi {
314*53ee8cc1Swenshuai.xi MVD_ERR("%s err IsUsed: drv=%x mvd=%x vpu=%x\n", __FUNCTION__,
315*53ee8cc1Swenshuai.xi u8DrvIdx, u32MvdSid, u32VpuSid);
316*53ee8cc1Swenshuai.xi return FALSE;
317*53ee8cc1Swenshuai.xi }
318*53ee8cc1Swenshuai.xi pMVDDrvContext->gMVDCtrl_EX[u8DrvIdx].u32MvdSid = u32MvdSid;
319*53ee8cc1Swenshuai.xi pMVDDrvContext->gMVDCtrl_EX[u8DrvIdx].u32VpuSid = u32VpuSid;
320*53ee8cc1Swenshuai.xi pMVDDrvContext->gMVDCtrl_EX[u8DrvIdx].u8HalIdx = HAL_MVD_SidToIdx((HAL_MVD_StreamId)u32MvdSid);
321*53ee8cc1Swenshuai.xi return TRUE;
322*53ee8cc1Swenshuai.xi }
323*53ee8cc1Swenshuai.xi
MVD_RecordStreamId(MS_U32 u32Id)324*53ee8cc1Swenshuai.xi void MVD_RecordStreamId(MS_U32 u32Id)
325*53ee8cc1Swenshuai.xi {
326*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
327*53ee8cc1Swenshuai.xi pMVDDrvContext->u32Id[u8DrvIdx] = u32Id;
328*53ee8cc1Swenshuai.xi }
329*53ee8cc1Swenshuai.xi
MVD_GetStreamId(MS_U8 u8Idx)330*53ee8cc1Swenshuai.xi MS_U32 MVD_GetStreamId(MS_U8 u8Idx)
331*53ee8cc1Swenshuai.xi {
332*53ee8cc1Swenshuai.xi return pMVDDrvContext->u32Id[u8Idx];
333*53ee8cc1Swenshuai.xi }
334*53ee8cc1Swenshuai.xi
MVD_GetHalIdx(MS_U32 u32Id)335*53ee8cc1Swenshuai.xi MS_U8 MVD_GetHalIdx(MS_U32 u32Id)
336*53ee8cc1Swenshuai.xi {
337*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
338*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = pMVDDrvContext->gMVDCtrl_EX[u8DrvIdx].u8HalIdx;
339*53ee8cc1Swenshuai.xi return u8HalIdx;
340*53ee8cc1Swenshuai.xi }
341*53ee8cc1Swenshuai.xi
MVD_GetVpuStreamId(MS_U32 u32Id)342*53ee8cc1Swenshuai.xi MS_U32 MVD_GetVpuStreamId(MS_U32 u32Id)
343*53ee8cc1Swenshuai.xi {
344*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
345*53ee8cc1Swenshuai.xi MS_U32 u32VpuSid = pMVDDrvContext->gMVDCtrl_EX[u8DrvIdx].u32VpuSid;
346*53ee8cc1Swenshuai.xi return u32VpuSid;
347*53ee8cc1Swenshuai.xi }
348*53ee8cc1Swenshuai.xi
MDrv_MVD_GetVpuStreamId(MS_U32 u32Id)349*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetVpuStreamId(MS_U32 u32Id)
350*53ee8cc1Swenshuai.xi {
351*53ee8cc1Swenshuai.xi return MVD_GetVpuStreamId(u32Id);
352*53ee8cc1Swenshuai.xi }
MVD_SetIsUsed(MS_U8 u8DrvIdx,MS_BOOL bUsed)353*53ee8cc1Swenshuai.xi static MS_BOOL MVD_SetIsUsed(MS_U8 u8DrvIdx, MS_BOOL bUsed)
354*53ee8cc1Swenshuai.xi {
355*53ee8cc1Swenshuai.xi pMVDDrvContext->gMVDCtrl_EX[u8DrvIdx].bUsed = bUsed;
356*53ee8cc1Swenshuai.xi //MVD_PRINT("%s u8DrvIdx=0x%x bUsed=%x\n", __FUNCTION__, u8DrvIdx, bUsed);
357*53ee8cc1Swenshuai.xi return TRUE;
358*53ee8cc1Swenshuai.xi }
359*53ee8cc1Swenshuai.xi
MVD_GetIsUsed(MS_U8 u8DrvIdx)360*53ee8cc1Swenshuai.xi static MS_BOOL MVD_GetIsUsed(MS_U8 u8DrvIdx)
361*53ee8cc1Swenshuai.xi {
362*53ee8cc1Swenshuai.xi MS_BOOL bUsed = pMVDDrvContext->gMVDCtrl_EX[u8DrvIdx].bUsed;
363*53ee8cc1Swenshuai.xi //MVD_PRINT("%s u8DrvIdx=0x%x bUsed=%x\n", __FUNCTION__, u8DrvIdx, bUsed);
364*53ee8cc1Swenshuai.xi return bUsed;
365*53ee8cc1Swenshuai.xi }
366*53ee8cc1Swenshuai.xi
367*53ee8cc1Swenshuai.xi #if _DUMP_FRMINFO
MVD_DumpFrmInfo(MVD_FrmInfo * pInfo)368*53ee8cc1Swenshuai.xi static void MVD_DumpFrmInfo(MVD_FrmInfo* pInfo)
369*53ee8cc1Swenshuai.xi {
370*53ee8cc1Swenshuai.xi if (NULL == pInfo)
371*53ee8cc1Swenshuai.xi {
372*53ee8cc1Swenshuai.xi MVD_ERR("%s: pInfo invalid!\n", __FUNCTION__);
373*53ee8cc1Swenshuai.xi return;
374*53ee8cc1Swenshuai.xi }
375*53ee8cc1Swenshuai.xi
376*53ee8cc1Swenshuai.xi MVD_PRINT("u32LumaAddr =0x%lx\n", pInfo->u32LumaAddr );
377*53ee8cc1Swenshuai.xi MVD_PRINT("u32ChromaAddr=0x%lx\n", pInfo->u32ChromaAddr);
378*53ee8cc1Swenshuai.xi MVD_PRINT("u32TimeStamp =0x%lx\n", pInfo->u32TimeStamp );
379*53ee8cc1Swenshuai.xi MVD_PRINT("u32ID_L =0x%lx\n", pInfo->u32ID_L );
380*53ee8cc1Swenshuai.xi MVD_PRINT("u32ID_H =0x%lx\n", pInfo->u32ID_H );
381*53ee8cc1Swenshuai.xi MVD_PRINT("u16Pitch =0x%x\n", pInfo->u16Pitch );
382*53ee8cc1Swenshuai.xi MVD_PRINT("u16Width =0x%x\n", pInfo->u16Width );
383*53ee8cc1Swenshuai.xi MVD_PRINT("u16Height =0x%x\n", pInfo->u16Height );
384*53ee8cc1Swenshuai.xi MVD_PRINT("eFrmType =0x%x\n", pInfo->eFrmType );
385*53ee8cc1Swenshuai.xi return;
386*53ee8cc1Swenshuai.xi }
387*53ee8cc1Swenshuai.xi #endif
388*53ee8cc1Swenshuai.xi
389*53ee8cc1Swenshuai.xi
390*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
391*53ee8cc1Swenshuai.xi /// Get MVD driver information
392*53ee8cc1Swenshuai.xi /// @return -the pointer to the driver information
393*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetInfo(void)394*53ee8cc1Swenshuai.xi const MVD_DrvInfo* MDrv_MVD_GetInfo(void)
395*53ee8cc1Swenshuai.xi {
396*53ee8cc1Swenshuai.xi MDrv_MVD_GetCaps(&(_stDrvInfo.stCaps));
397*53ee8cc1Swenshuai.xi _stDrvInfo.u32FWVersion = HAL_MVD_GetDrvFwVer();
398*53ee8cc1Swenshuai.xi return (&_stDrvInfo);
399*53ee8cc1Swenshuai.xi }
400*53ee8cc1Swenshuai.xi
401*53ee8cc1Swenshuai.xi
402*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
403*53ee8cc1Swenshuai.xi /// Get MVD driver version
404*53ee8cc1Swenshuai.xi /// @return -the pointer to the driver version
405*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetLibVer(const MSIF_Version ** ppVersion)406*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_GetLibVer(const MSIF_Version **ppVersion)
407*53ee8cc1Swenshuai.xi {
408*53ee8cc1Swenshuai.xi if (!ppVersion)
409*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
410*53ee8cc1Swenshuai.xi
411*53ee8cc1Swenshuai.xi *ppVersion = &_drv_mvd_version;
412*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
413*53ee8cc1Swenshuai.xi }
414*53ee8cc1Swenshuai.xi
415*53ee8cc1Swenshuai.xi
416*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
417*53ee8cc1Swenshuai.xi /// Set detailed level of MVD driver debug message
418*53ee8cc1Swenshuai.xi /// 0: None, 1: MVD_DEBUGERROR, 2: MVD_DEBUGINFO
419*53ee8cc1Swenshuai.xi /// @param level \b IN level from 0 to 2
420*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetDbgLevel(MS_U8 level)421*53ee8cc1Swenshuai.xi void MDrv_MVD_SetDbgLevel(MS_U8 level)
422*53ee8cc1Swenshuai.xi {
423*53ee8cc1Swenshuai.xi _u8DbgLevel = level;
424*53ee8cc1Swenshuai.xi VPU_EX_UartLevel eVpuDbgLevel[6] =
425*53ee8cc1Swenshuai.xi {
426*53ee8cc1Swenshuai.xi E_VPU_EX_UART_LEVEL_NONE,
427*53ee8cc1Swenshuai.xi E_VPU_EX_UART_LEVEL_ERR,
428*53ee8cc1Swenshuai.xi E_VPU_EX_UART_LEVEL_INFO,
429*53ee8cc1Swenshuai.xi E_VPU_EX_UART_LEVEL_DBG,
430*53ee8cc1Swenshuai.xi E_VPU_EX_UART_LEVEL_TRACE,
431*53ee8cc1Swenshuai.xi E_VPU_EX_UART_LEVEL_FW,
432*53ee8cc1Swenshuai.xi };
433*53ee8cc1Swenshuai.xi
434*53ee8cc1Swenshuai.xi if (level >= 1)
435*53ee8cc1Swenshuai.xi {
436*53ee8cc1Swenshuai.xi HAL_MVD_SetDbgLevel(level);
437*53ee8cc1Swenshuai.xi }
438*53ee8cc1Swenshuai.xi if (level<6) HAL_VPU_EX_SetDbgLevel(eVpuDbgLevel[level]);
439*53ee8cc1Swenshuai.xi
440*53ee8cc1Swenshuai.xi return;
441*53ee8cc1Swenshuai.xi }
442*53ee8cc1Swenshuai.xi
443*53ee8cc1Swenshuai.xi
444*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
445*53ee8cc1Swenshuai.xi /// Get MVD firmware version
446*53ee8cc1Swenshuai.xi /// @return -firmware version
447*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetFWVer(MS_U32 u32Id)448*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetFWVer(MS_U32 u32Id)
449*53ee8cc1Swenshuai.xi {
450*53ee8cc1Swenshuai.xi MS_U32 u32VpuSid = MVD_GetVpuStreamId(u32Id);
451*53ee8cc1Swenshuai.xi return HAL_MVD_GetFWVer(u32VpuSid);
452*53ee8cc1Swenshuai.xi }
453*53ee8cc1Swenshuai.xi
454*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
455*53ee8cc1Swenshuai.xi /// Initialize variables for MVD driver
456*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MVD_InitVar(MS_U8 u8DrvIdx,MS_U8 u8HalIdx)457*53ee8cc1Swenshuai.xi static void MVD_InitVar(MS_U8 u8DrvIdx,MS_U8 u8HalIdx)
458*53ee8cc1Swenshuai.xi {
459*53ee8cc1Swenshuai.xi MVD_FrameInfo* pPreInfo = &(pMVDDrvContext->stPreFrmInfo[u8DrvIdx]);
460*53ee8cc1Swenshuai.xi HAL_MVD_InitVar(u8HalIdx);
461*53ee8cc1Swenshuai.xi
462*53ee8cc1Swenshuai.xi pPreInfo->u16HorSize = 0;
463*53ee8cc1Swenshuai.xi pPreInfo->u16VerSize = 0;
464*53ee8cc1Swenshuai.xi pPreInfo->u8AspectRate = 0;
465*53ee8cc1Swenshuai.xi pPreInfo->u32FrameRate = 0;
466*53ee8cc1Swenshuai.xi pPreInfo->u8Interlace = 0;
467*53ee8cc1Swenshuai.xi
468*53ee8cc1Swenshuai.xi memset(&(pMVDDrvContext->stSyncCfg[u8DrvIdx]), 0, sizeof(MVD_AVSyncCfg));
469*53ee8cc1Swenshuai.xi
470*53ee8cc1Swenshuai.xi pMVDDrvContext->bFrmRateSupported[u8DrvIdx] = TRUE;
471*53ee8cc1Swenshuai.xi
472*53ee8cc1Swenshuai.xi pMVDDrvContext->u32SyncDoneCnt[0] = 0;
473*53ee8cc1Swenshuai.xi pMVDDrvContext->u32SyncDoneCnt[1] = 0;
474*53ee8cc1Swenshuai.xi pMVDDrvContext->u32VSyncCnt[0] = 0;
475*53ee8cc1Swenshuai.xi pMVDDrvContext->u32VSyncCnt[1] = 0;
476*53ee8cc1Swenshuai.xi pMVDDrvContext->u32FrameBaseMode[u8DrvIdx] = FALSE;
477*53ee8cc1Swenshuai.xi pMVDDrvContext->bTrickPlay2xAVSync[u8DrvIdx] = FALSE;
478*53ee8cc1Swenshuai.xi return;
479*53ee8cc1Swenshuai.xi }
480*53ee8cc1Swenshuai.xi
481*53ee8cc1Swenshuai.xi #if 0
482*53ee8cc1Swenshuai.xi static void MVD_DumpMemCfg(MVD_MEMCfg* pCfg)
483*53ee8cc1Swenshuai.xi {
484*53ee8cc1Swenshuai.xi if (pCfg)
485*53ee8cc1Swenshuai.xi {
486*53ee8cc1Swenshuai.xi MVD_PRINT("u32FWBinAddr = 0x%lx\n", pCfg->u32FWBinAddr);
487*53ee8cc1Swenshuai.xi MVD_PRINT("u32FWBinSize = 0x%lx\n", pCfg->u32FWBinSize);
488*53ee8cc1Swenshuai.xi MVD_PRINT("u32FWCodeAddr = 0x%lx\n", pCfg->u32FWCodeAddr);
489*53ee8cc1Swenshuai.xi MVD_PRINT("u32FWCodeSize = 0x%lx\n", pCfg->u32FWCodeSize);
490*53ee8cc1Swenshuai.xi MVD_PRINT("u32FBAddr = 0x%lx\n", pCfg->u32FBAddr);
491*53ee8cc1Swenshuai.xi MVD_PRINT("u32FBSize = 0x%lx\n", pCfg->u32FBSize);
492*53ee8cc1Swenshuai.xi MVD_PRINT("u32BSAddr = 0x%lx\n", pCfg->u32BSAddr);
493*53ee8cc1Swenshuai.xi MVD_PRINT("u32BSSize = 0x%lx\n", pCfg->u32BSSize);
494*53ee8cc1Swenshuai.xi MVD_PRINT("u32DrvBufAddr = 0x%lx\n", pCfg->u32DrvBufAddr);
495*53ee8cc1Swenshuai.xi MVD_PRINT("u32DrvBufSize = 0x%lx\n", pCfg->u32DrvBufSize);
496*53ee8cc1Swenshuai.xi MVD_PRINT("u32DynSacalingBufAddr = 0x%lx\n", pCfg->u32DynSacalingBufAddr);
497*53ee8cc1Swenshuai.xi MVD_PRINT("u32DynSacalingBufSize = 0x%lx\n", pCfg->u32DynSacalingBufSize);
498*53ee8cc1Swenshuai.xi MVD_PRINT("u32Miu1BaseAddr = 0x%lx\n", pCfg->u32Miu1BaseAddr);
499*53ee8cc1Swenshuai.xi MVD_PRINT("bFWMiuSel = 0x%x\n", pCfg->bFWMiuSel);
500*53ee8cc1Swenshuai.xi MVD_PRINT("bHWMiuSel = 0x%x\n", pCfg->bHWMiuSel);
501*53ee8cc1Swenshuai.xi }
502*53ee8cc1Swenshuai.xi }
503*53ee8cc1Swenshuai.xi #endif
504*53ee8cc1Swenshuai.xi
505*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
506*53ee8cc1Swenshuai.xi /// Configure MVD for memory and firmware and info.
507*53ee8cc1Swenshuai.xi /// Notice:
508*53ee8cc1Swenshuai.xi /// (1) u32FWAddr & u32DrvBufAddr should be on the same MIU
509*53ee8cc1Swenshuai.xi /// (2) u32FBAddr & u32BSAddr should be on the same MIU
510*53ee8cc1Swenshuai.xi /// @param -fwCfg \b IN : pointer to firmware configuration
511*53ee8cc1Swenshuai.xi /// @param -memCfg \b IN : pointer to memory configuration
512*53ee8cc1Swenshuai.xi /// @param -InfoCfg \b IN : pointer to mvd info configuration
513*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetCfg(MS_U32 u32Id,MVD_FWCfg * fwCfg,MVD_MEMCfg * memCfg)514*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetCfg(MS_U32 u32Id, MVD_FWCfg* fwCfg, MVD_MEMCfg* memCfg)
515*53ee8cc1Swenshuai.xi {
516*53ee8cc1Swenshuai.xi MS_U8 u8DrvBuffMiuSel = 0;
517*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
518*53ee8cc1Swenshuai.xi
519*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
520*53ee8cc1Swenshuai.xi if (!fwCfg || !memCfg)
521*53ee8cc1Swenshuai.xi {
522*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
523*53ee8cc1Swenshuai.xi }
524*53ee8cc1Swenshuai.xi
525*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s u32Id=0x%x, u8HalIdx=0x%x\n", __FUNCTION__, u32Id, u8HalIdx));
526*53ee8cc1Swenshuai.xi //1.1 Determine framebuffer mode, frame number, used size.
527*53ee8cc1Swenshuai.xi if(pMVDDrvContext->bCMAUsed == FALSE)
528*53ee8cc1Swenshuai.xi {
529*53ee8cc1Swenshuai.xi if (TRUE != HAL_MVD_CheckFrmBuffSize(u8HalIdx, fwCfg, memCfg))
530*53ee8cc1Swenshuai.xi {
531*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
532*53ee8cc1Swenshuai.xi }
533*53ee8cc1Swenshuai.xi }
534*53ee8cc1Swenshuai.xi
535*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("bNotReload=0x%x\n", fwCfg->bNotReload));
536*53ee8cc1Swenshuai.xi //1.2 Save the FWCfg in hal
537*53ee8cc1Swenshuai.xi HAL_MVD_SetFWCfg(u8HalIdx, fwCfg);
538*53ee8cc1Swenshuai.xi
539*53ee8cc1Swenshuai.xi MS_U32 u32StartOffset;
540*53ee8cc1Swenshuai.xi MS_U8 u8MiuSel;
541*53ee8cc1Swenshuai.xi
542*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u32StartOffset, memCfg->u32FWCodeAddr);
543*53ee8cc1Swenshuai.xi
544*53ee8cc1Swenshuai.xi memCfg->u8FWMiuSel = u8MiuSel;
545*53ee8cc1Swenshuai.xi
546*53ee8cc1Swenshuai.xi if(u8MiuSel >= 1)
547*53ee8cc1Swenshuai.xi {
548*53ee8cc1Swenshuai.xi memCfg->bFWMiuSel = 1;
549*53ee8cc1Swenshuai.xi }
550*53ee8cc1Swenshuai.xi else
551*53ee8cc1Swenshuai.xi {
552*53ee8cc1Swenshuai.xi memCfg->bFWMiuSel = 0;
553*53ee8cc1Swenshuai.xi }
554*53ee8cc1Swenshuai.xi
555*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u32StartOffset, memCfg->u32BSAddr);
556*53ee8cc1Swenshuai.xi
557*53ee8cc1Swenshuai.xi memCfg->u8HWMiuSel = u8MiuSel;
558*53ee8cc1Swenshuai.xi if(u8MiuSel >= 1)
559*53ee8cc1Swenshuai.xi {
560*53ee8cc1Swenshuai.xi memCfg->bHWMiuSel = 1;
561*53ee8cc1Swenshuai.xi }
562*53ee8cc1Swenshuai.xi else
563*53ee8cc1Swenshuai.xi {
564*53ee8cc1Swenshuai.xi memCfg->bHWMiuSel = 0;
565*53ee8cc1Swenshuai.xi }
566*53ee8cc1Swenshuai.xi
567*53ee8cc1Swenshuai.xi _phy_to_miu_offset(memCfg->u8FBMiuSel, u32StartOffset, memCfg->u32FBAddr);
568*53ee8cc1Swenshuai.xi
569*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u32StartOffset, memCfg->u32DrvBufAddr);
570*53ee8cc1Swenshuai.xi
571*53ee8cc1Swenshuai.xi u8DrvBuffMiuSel = u8MiuSel;
572*53ee8cc1Swenshuai.xi
573*53ee8cc1Swenshuai.xi _miu_offset_to_phy(E_CHIP_MIU_1,0,memCfg->u32Miu1BaseAddr);
574*53ee8cc1Swenshuai.xi _miu_offset_to_phy(E_CHIP_MIU_2,0,memCfg->u32Miu2BaseAddr);
575*53ee8cc1Swenshuai.xi _miu_offset_to_phy(E_CHIP_MIU_3,0,memCfg->u32Miu3BaseAddr);
576*53ee8cc1Swenshuai.xi
577*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MIUSEL:: FW=%x HW=%x, miu1base=0x%lx,miu2base=0x%lx,miu3base=0x%lx\n",
578*53ee8cc1Swenshuai.xi memCfg->u8FWMiuSel, memCfg->u8HWMiuSel, (unsigned long)memCfg->u32Miu1BaseAddr,(unsigned long)memCfg->u32Miu2BaseAddr,(unsigned long)memCfg->u32Miu3BaseAddr));
579*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("bDrvBuffMiuSel = %x\n", u8DrvBuffMiuSel));
580*53ee8cc1Swenshuai.xi
581*53ee8cc1Swenshuai.xi if(fwCfg->eSrcMode == E_MVD_SLQ_TBL_MODE)
582*53ee8cc1Swenshuai.xi {
583*53ee8cc1Swenshuai.xi MS_ASSERT(u8DrvBuffMiuSel == memCfg->u8FWMiuSel);
584*53ee8cc1Swenshuai.xi }
585*53ee8cc1Swenshuai.xi
586*53ee8cc1Swenshuai.xi //addr of memCfg are physical addr, except field u32FWSrcVAddr
587*53ee8cc1Swenshuai.xi if (memCfg->eFWSrcType == E_MVD_FW_SOURCE_DRAM)
588*53ee8cc1Swenshuai.xi {
589*53ee8cc1Swenshuai.xi memCfg->u32FWSrcVAddr = HAL_MVD_PA2NonCacheSeg(memCfg->u32FWBinAddr);
590*53ee8cc1Swenshuai.xi }
591*53ee8cc1Swenshuai.xi else
592*53ee8cc1Swenshuai.xi {
593*53ee8cc1Swenshuai.xi memCfg->u32FWSrcVAddr = NULL;
594*53ee8cc1Swenshuai.xi }
595*53ee8cc1Swenshuai.xi //2.2 Save the memory config in hal
596*53ee8cc1Swenshuai.xi HAL_MVD_SetMEMCfg(u8HalIdx, memCfg);
597*53ee8cc1Swenshuai.xi
598*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
599*53ee8cc1Swenshuai.xi }
600*53ee8cc1Swenshuai.xi
MDrv_MVD_RegSetBase(MS_VIRT u32RegBaseAddr)601*53ee8cc1Swenshuai.xi void MDrv_MVD_RegSetBase(MS_VIRT u32RegBaseAddr)
602*53ee8cc1Swenshuai.xi {
603*53ee8cc1Swenshuai.xi HAL_MVD_RegSetBase(u32RegBaseAddr);
604*53ee8cc1Swenshuai.xi }
605*53ee8cc1Swenshuai.xi
606*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
607*53ee8cc1Swenshuai.xi /// MVD driver initialization
608*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
609*53ee8cc1Swenshuai.xi /// - TRUE, Success
610*53ee8cc1Swenshuai.xi /// - FALSE, Failed
611*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_Init(MS_U32 u32Id,MVD_CodecType eCodecType,MS_BOOL bShareBBU)612*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_Init(MS_U32 u32Id, MVD_CodecType eCodecType, MS_BOOL bShareBBU)
613*53ee8cc1Swenshuai.xi {
614*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
615*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
616*53ee8cc1Swenshuai.xi MS_U32 u32VpuSid = MVD_GetVpuStreamId(u32Id);
617*53ee8cc1Swenshuai.xi MS_VIRT u32ShmAddr;
618*53ee8cc1Swenshuai.xi
619*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_Init:start u32Id=0x%x, sid=0x%x, halIdx=0x%x, bShareBBU=0x%x\n",
620*53ee8cc1Swenshuai.xi u32Id, _MVD_GET_HAL_SID(u32Id), u8HalIdx, bShareBBU));
621*53ee8cc1Swenshuai.xi
622*53ee8cc1Swenshuai.xi MVD_InitVar(u8DrvIdx,u8HalIdx);
623*53ee8cc1Swenshuai.xi
624*53ee8cc1Swenshuai.xi u32ShmAddr = HAL_VPU_EX_GetSHMAddr();
625*53ee8cc1Swenshuai.xi
626*53ee8cc1Swenshuai.xi HAL_VPU_EX_SetShareInfoAddr(u32Id, u32ShmAddr);
627*53ee8cc1Swenshuai.xi
628*53ee8cc1Swenshuai.xi if (!HAL_MVD_Init(u8HalIdx, eCodecType, u32VpuSid, bShareBBU))
629*53ee8cc1Swenshuai.xi {
630*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("MDrv_MVD_Init:_MVD_Init failed\n"));
631*53ee8cc1Swenshuai.xi return FALSE;
632*53ee8cc1Swenshuai.xi }
633*53ee8cc1Swenshuai.xi else
634*53ee8cc1Swenshuai.xi {
635*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_Init:_MVD_Init success\n"));
636*53ee8cc1Swenshuai.xi }
637*53ee8cc1Swenshuai.xi
638*53ee8cc1Swenshuai.xi MVD_SetIsUsed(u8DrvIdx, TRUE);
639*53ee8cc1Swenshuai.xi
640*53ee8cc1Swenshuai.xi return TRUE;
641*53ee8cc1Swenshuai.xi }
642*53ee8cc1Swenshuai.xi
643*53ee8cc1Swenshuai.xi
644*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
645*53ee8cc1Swenshuai.xi /// MVD driver exit
646*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
647*53ee8cc1Swenshuai.xi /// - TRUE, Success
648*53ee8cc1Swenshuai.xi /// - FALSE, Failed
649*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_Exit(MS_U32 u32Id)650*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_Exit(MS_U32 u32Id)
651*53ee8cc1Swenshuai.xi {
652*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
653*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
654*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_Exit:start\n"));
655*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s u8DrvIdx=0x%x u8HalIdx=0x%x u32Id=0x%x\n",__FUNCTION__, u8DrvIdx, u8HalIdx, u32Id));
656*53ee8cc1Swenshuai.xi
657*53ee8cc1Swenshuai.xi //do nothing if driver is not initialized
658*53ee8cc1Swenshuai.xi if (FALSE == MVD_GetIsUsed(u8DrvIdx))
659*53ee8cc1Swenshuai.xi {
660*53ee8cc1Swenshuai.xi HAL_VPU_EX_ReleaseFreeStream(u8HalIdx);
661*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("MDrv_MVD_Exit: not-init yet\n"));
662*53ee8cc1Swenshuai.xi goto _HW_TILE_DOWN;
663*53ee8cc1Swenshuai.xi //HAL_MVD_PowerCtrl(DISABLE);
664*53ee8cc1Swenshuai.xi //HAL_VPU_EX_PowerCtrl(DISABLE);
665*53ee8cc1Swenshuai.xi return FALSE;
666*53ee8cc1Swenshuai.xi }
667*53ee8cc1Swenshuai.xi
668*53ee8cc1Swenshuai.xi //stop and reset FW/HW
669*53ee8cc1Swenshuai.xi if (HAL_MVD_Stop(u8HalIdx) != TRUE)
670*53ee8cc1Swenshuai.xi {
671*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_Exit: stop fail\n"));
672*53ee8cc1Swenshuai.xi }
673*53ee8cc1Swenshuai.xi
674*53ee8cc1Swenshuai.xi #if 0
675*53ee8cc1Swenshuai.xi if (pMVDDrvContext->bCMAUsed == TRUE && pMVDDrvContext->bCMAAllocDone == TRUE)
676*53ee8cc1Swenshuai.xi {
677*53ee8cc1Swenshuai.xi if (MApi_CMA_Pool_PutMem(&pMVDDrvContext->cmaFreeParam[u8DrvIdx]) == FALSE)
678*53ee8cc1Swenshuai.xi {
679*53ee8cc1Swenshuai.xi return FALSE;
680*53ee8cc1Swenshuai.xi }
681*53ee8cc1Swenshuai.xi else
682*53ee8cc1Swenshuai.xi {
683*53ee8cc1Swenshuai.xi pMVDDrvContext->bCMAAllocDone = FALSE;
684*53ee8cc1Swenshuai.xi }
685*53ee8cc1Swenshuai.xi }
686*53ee8cc1Swenshuai.xi #endif
687*53ee8cc1Swenshuai.xi #ifdef MVD_ENABLE_ISR
688*53ee8cc1Swenshuai.xi //dettach isr
689*53ee8cc1Swenshuai.xi if (pMVDDrvContext->_eEventFlag[u8DrvIdx])
690*53ee8cc1Swenshuai.xi {
691*53ee8cc1Swenshuai.xi if(E_MVD_RET_OK != MDrv_MVD_SetIsrEvent(u32Id, E_MVD_EVENT_DISABLE_ALL, (MVD_InterruptCb)NULL)) //FIXME!
692*53ee8cc1Swenshuai.xi {
693*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("MDrv_MVD_Exit: dettach isr fail\n"));
694*53ee8cc1Swenshuai.xi }
695*53ee8cc1Swenshuai.xi }
696*53ee8cc1Swenshuai.xi #endif
697*53ee8cc1Swenshuai.xi
698*53ee8cc1Swenshuai.xi if (!HAL_MVD_DeleteTask(u8HalIdx, (HAL_VPU_StreamId)MVD_GetVpuStreamId(u32Id)))
699*53ee8cc1Swenshuai.xi {
700*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_Exit: fail to delete task\n"));
701*53ee8cc1Swenshuai.xi }
702*53ee8cc1Swenshuai.xi
703*53ee8cc1Swenshuai.xi _HW_TILE_DOWN:
704*53ee8cc1Swenshuai.xi if (HAL_MVD_Exit(u8HalIdx) != TRUE)
705*53ee8cc1Swenshuai.xi {
706*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("MDrv_MVD_Exit: fail\n"));
707*53ee8cc1Swenshuai.xi //return FALSE;
708*53ee8cc1Swenshuai.xi }
709*53ee8cc1Swenshuai.xi
710*53ee8cc1Swenshuai.xi //reset internal variables.
711*53ee8cc1Swenshuai.xi MVD_InitVar(u8DrvIdx,u8HalIdx);
712*53ee8cc1Swenshuai.xi
713*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s i=0x%x u32Id=0x%x\n", __FUNCTION__, u8DrvIdx, u32Id));
714*53ee8cc1Swenshuai.xi MVD_SetIsUsed(u8DrvIdx, FALSE);
715*53ee8cc1Swenshuai.xi
716*53ee8cc1Swenshuai.xi return TRUE;
717*53ee8cc1Swenshuai.xi }
718*53ee8cc1Swenshuai.xi
719*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
720*53ee8cc1Swenshuai.xi /// Reset MVD
721*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_Rst(MS_U32 u32Id,MVD_CodecType eCodecType,MS_BOOL bShareBBU)722*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_Rst(MS_U32 u32Id, MVD_CodecType eCodecType, MS_BOOL bShareBBU)
723*53ee8cc1Swenshuai.xi {
724*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
725*53ee8cc1Swenshuai.xi MVD_SrcMode eSrcMode = HAL_MVD_GetSrcMode(u8HalIdx);
726*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
727*53ee8cc1Swenshuai.xi //stop and reset FW/HW
728*53ee8cc1Swenshuai.xi if (HAL_MVD_Stop(u8HalIdx) != TRUE)
729*53ee8cc1Swenshuai.xi {
730*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_Exit: stop fail\n"));
731*53ee8cc1Swenshuai.xi }
732*53ee8cc1Swenshuai.xi
733*53ee8cc1Swenshuai.xi if (!HAL_MVD_DeleteTask(u8HalIdx, (HAL_VPU_StreamId)MVD_GetVpuStreamId(u32Id)))
734*53ee8cc1Swenshuai.xi {
735*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_Rst: fail to delete task\n"));
736*53ee8cc1Swenshuai.xi }
737*53ee8cc1Swenshuai.xi
738*53ee8cc1Swenshuai.xi //For T3&Euclid MVD4, do re-init only when SoftRst does not work.
739*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MVD_Init(u32Id, eCodecType, bShareBBU))
740*53ee8cc1Swenshuai.xi {
741*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("MDrv_MVD_Rst:_MVD_Init failed\n"));
742*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
743*53ee8cc1Swenshuai.xi }
744*53ee8cc1Swenshuai.xi else
745*53ee8cc1Swenshuai.xi {
746*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("MDrv_MVD_Rst:_MVD_Init success\n"));
747*53ee8cc1Swenshuai.xi }
748*53ee8cc1Swenshuai.xi
749*53ee8cc1Swenshuai.xi extern const MS_U8 bMvdParserDisable[5];
750*53ee8cc1Swenshuai.xi if(MDrv_MVD_SetCodecInfo(u32Id, eCodecType, eSrcMode, bMvdParserDisable[eSrcMode]) == FALSE)
751*53ee8cc1Swenshuai.xi {
752*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
753*53ee8cc1Swenshuai.xi }
754*53ee8cc1Swenshuai.xi
755*53ee8cc1Swenshuai.xi MDrv_MVD_Play(u32Id);
756*53ee8cc1Swenshuai.xi
757*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
758*53ee8cc1Swenshuai.xi }
759*53ee8cc1Swenshuai.xi
760*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
761*53ee8cc1Swenshuai.xi /// Issue Play command to MVD
762*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_Play(MS_U32 u32Id)763*53ee8cc1Swenshuai.xi void MDrv_MVD_Play(MS_U32 u32Id)
764*53ee8cc1Swenshuai.xi {
765*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
766*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
767*53ee8cc1Swenshuai.xi if (TRUE != HAL_MVD_Play(u8HalIdx))
768*53ee8cc1Swenshuai.xi {
769*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("%s fail\n", __FUNCTION__));
770*53ee8cc1Swenshuai.xi }
771*53ee8cc1Swenshuai.xi return;
772*53ee8cc1Swenshuai.xi }
773*53ee8cc1Swenshuai.xi
774*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
775*53ee8cc1Swenshuai.xi /// Set frame buffer address to MVD
776*53ee8cc1Swenshuai.xi /// @param -u32addr \b IN : start address
777*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetFrameBuffAddr(MS_U32 u32Id,MS_VIRT u32addr)778*53ee8cc1Swenshuai.xi void MDrv_MVD_SetFrameBuffAddr(MS_U32 u32Id, MS_VIRT u32addr)
779*53ee8cc1Swenshuai.xi {
780*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
781*53ee8cc1Swenshuai.xi
782*53ee8cc1Swenshuai.xi HAL_MVD_SetFrameBuffAddr(u8HalIdx, u32addr, HAL_MVD_GetFBMode(u8HalIdx));
783*53ee8cc1Swenshuai.xi }
784*53ee8cc1Swenshuai.xi
785*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
786*53ee8cc1Swenshuai.xi /// Set codec type.
787*53ee8cc1Swenshuai.xi /// @param -u8CodecType \b IN : 0: mpeg4, 1: mpeg4 with short_video_header, 2: DivX311
788*53ee8cc1Swenshuai.xi /// @param -u8BSProviderMode \b IN : TS live stream, file, SLQ, SLQ table link and TS file mode.
789*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetCodecInfo(MS_U32 u32Id,MVD_CodecType u8CodecType,MVD_SrcMode u8BSProviderMode,MS_U8 bDisablePESParsing)790*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetCodecInfo(MS_U32 u32Id, MVD_CodecType u8CodecType, MVD_SrcMode u8BSProviderMode, MS_U8 bDisablePESParsing)
791*53ee8cc1Swenshuai.xi {
792*53ee8cc1Swenshuai.xi return _MVD_Init(u32Id,u8CodecType,u8BSProviderMode,bDisablePESParsing);
793*53ee8cc1Swenshuai.xi }
794*53ee8cc1Swenshuai.xi
795*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
796*53ee8cc1Swenshuai.xi /// Set DivX patch.
797*53ee8cc1Swenshuai.xi /// @param -u8MvAdjust \b IN : chroma adjustment
798*53ee8cc1Swenshuai.xi /// @param -u8IdctSel \b IN : idct algorithm selection
799*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetDivXCfg(MS_U32 u32Id,MS_U8 u8MvAdjust,MS_U8 u8IdctSel)800*53ee8cc1Swenshuai.xi void MDrv_MVD_SetDivXCfg(MS_U32 u32Id, MS_U8 u8MvAdjust, MS_U8 u8IdctSel)
801*53ee8cc1Swenshuai.xi {
802*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
803*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
804*53ee8cc1Swenshuai.xi HAL_MVD_SetDivXCfg(u8HalIdx, u8MvAdjust, u8IdctSel);
805*53ee8cc1Swenshuai.xi return;
806*53ee8cc1Swenshuai.xi }
807*53ee8cc1Swenshuai.xi
808*53ee8cc1Swenshuai.xi
809*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
810*53ee8cc1Swenshuai.xi /// Get MVD decoded picture counter
811*53ee8cc1Swenshuai.xi /// @return -decoded picture counter
812*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetPicCounter(MS_U32 u32Id)813*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetPicCounter(MS_U32 u32Id)
814*53ee8cc1Swenshuai.xi {
815*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
816*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
817*53ee8cc1Swenshuai.xi return HAL_MVD_GetPicCounter(u8HalIdx);
818*53ee8cc1Swenshuai.xi }
819*53ee8cc1Swenshuai.xi
820*53ee8cc1Swenshuai.xi
821*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
822*53ee8cc1Swenshuai.xi /// Get MVD skipped picture counter
823*53ee8cc1Swenshuai.xi /// @return -skipped picture counter
824*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetSkipPicCounter(MS_U32 u32Id)825*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetSkipPicCounter(MS_U32 u32Id)
826*53ee8cc1Swenshuai.xi {
827*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
828*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
829*53ee8cc1Swenshuai.xi return HAL_MVD_GetSkipPicCounter(u8HalIdx);
830*53ee8cc1Swenshuai.xi }
831*53ee8cc1Swenshuai.xi
832*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
833*53ee8cc1Swenshuai.xi /// Get MVD picture type
834*53ee8cc1Swenshuai.xi /// @return - picture type
835*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetPicType(MS_U32 u32Id)836*53ee8cc1Swenshuai.xi MVD_PicType MDrv_MVD_GetPicType(MS_U32 u32Id)
837*53ee8cc1Swenshuai.xi {
838*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
839*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
840*53ee8cc1Swenshuai.xi return HAL_MVD_GetPicType(u8HalIdx);
841*53ee8cc1Swenshuai.xi }
842*53ee8cc1Swenshuai.xi
843*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
844*53ee8cc1Swenshuai.xi /// Get MVD bit rate (bits/sec)
845*53ee8cc1Swenshuai.xi /// @return -bit rate
846*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetBitsRate(MS_U32 u32Id)847*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetBitsRate(MS_U32 u32Id)
848*53ee8cc1Swenshuai.xi {
849*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
850*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
851*53ee8cc1Swenshuai.xi return HAL_MVD_GetBitsRate(u8HalIdx);
852*53ee8cc1Swenshuai.xi }
853*53ee8cc1Swenshuai.xi
854*53ee8cc1Swenshuai.xi
855*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
856*53ee8cc1Swenshuai.xi /// Get video_range flag.
857*53ee8cc1Swenshuai.xi /// Supported after MVD FW release v00720390
858*53ee8cc1Swenshuai.xi /// Color team need this information for better color quality.
859*53ee8cc1Swenshuai.xi /// When video_range = 0 gives a range of Y from 16 to 235 and Cb , Cr from 16 to 240
860*53ee8cc1Swenshuai.xi /// When video_range = 1 gives a range of Y from 0 to 255 and Cb , Cr from 0 to 255
861*53ee8cc1Swenshuai.xi /// @return -video_range
862*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetVideoRange(MS_U32 u32Id)863*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetVideoRange(MS_U32 u32Id)
864*53ee8cc1Swenshuai.xi {
865*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
866*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
867*53ee8cc1Swenshuai.xi return HAL_MVD_GetVideoRange(u8HalIdx);
868*53ee8cc1Swenshuai.xi }
869*53ee8cc1Swenshuai.xi
870*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
871*53ee8cc1Swenshuai.xi /// Get LowDelay flag
872*53ee8cc1Swenshuai.xi /// @return -True/False
873*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetLowDelayFlag(MS_U32 u32Id)874*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetLowDelayFlag(MS_U32 u32Id)
875*53ee8cc1Swenshuai.xi {
876*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
877*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
878*53ee8cc1Swenshuai.xi return HAL_MVD_GetLowDelayFlag(u8HalIdx);
879*53ee8cc1Swenshuai.xi }
880*53ee8cc1Swenshuai.xi
881*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
882*53ee8cc1Swenshuai.xi /// Get MPEG 3:2 pull down flag
883*53ee8cc1Swenshuai.xi /// @return -TRUE or FALSE
884*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetIs32PullDown(MS_U32 u32Id)885*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetIs32PullDown(MS_U32 u32Id)
886*53ee8cc1Swenshuai.xi {
887*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
888*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
889*53ee8cc1Swenshuai.xi return HAL_MVD_GetIs32PullDown(u8HalIdx);
890*53ee8cc1Swenshuai.xi }
891*53ee8cc1Swenshuai.xi
892*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
893*53ee8cc1Swenshuai.xi /// Get if Dynamic Scaling is enabled (reported by firmware)
894*53ee8cc1Swenshuai.xi /// @return -TRUE or FALSE
895*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetIsDynScalingEnabled(MS_U32 u32Id)896*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetIsDynScalingEnabled(MS_U32 u32Id)
897*53ee8cc1Swenshuai.xi {
898*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
899*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
900*53ee8cc1Swenshuai.xi MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8HalIdx);
901*53ee8cc1Swenshuai.xi MS_BOOL bEnDynScale = FALSE;
902*53ee8cc1Swenshuai.xi
903*53ee8cc1Swenshuai.xi bEnDynScale = (MS_BOOL)HAL_MVD_GetIsDynScalingEnabled(u8HalIdx);
904*53ee8cc1Swenshuai.xi if ((FALSE == pstMemCfg->bEnableDynScale) && (bEnDynScale))
905*53ee8cc1Swenshuai.xi {
906*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("bEnDynScale err: %x\n", bEnDynScale));
907*53ee8cc1Swenshuai.xi }
908*53ee8cc1Swenshuai.xi
909*53ee8cc1Swenshuai.xi //MVD_PRINT("%s bEnDS: %x, %x\n", __FUNCTION__, bEnDynScale, pstMemCfg->bEnableDynScale);
910*53ee8cc1Swenshuai.xi return bEnDynScale;
911*53ee8cc1Swenshuai.xi }
912*53ee8cc1Swenshuai.xi
913*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
914*53ee8cc1Swenshuai.xi /// Get the difference of PTS and STC
915*53ee8cc1Swenshuai.xi /// @return -(PTS-STC)
916*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetPtsStcDiff(MS_U32 u32Id)917*53ee8cc1Swenshuai.xi MS_S32 MDrv_MVD_GetPtsStcDiff(MS_U32 u32Id)
918*53ee8cc1Swenshuai.xi {
919*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
920*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
921*53ee8cc1Swenshuai.xi return HAL_MVD_GetPtsStcDiff(u8HalIdx);
922*53ee8cc1Swenshuai.xi }
923*53ee8cc1Swenshuai.xi
924*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
925*53ee8cc1Swenshuai.xi /// Get MVD SLQ read pointer
926*53ee8cc1Swenshuai.xi /// @return -SLQ read pointer
927*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetSLQReadPtr(MS_U32 u32Id)928*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetSLQReadPtr(MS_U32 u32Id)
929*53ee8cc1Swenshuai.xi {
930*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
931*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
932*53ee8cc1Swenshuai.xi return HAL_MVD_GetSLQReadPtr(u8HalIdx);
933*53ee8cc1Swenshuai.xi }
934*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
935*53ee8cc1Swenshuai.xi /// Get MVD SLQ write pointer
936*53ee8cc1Swenshuai.xi /// @return -SLQ write pointer
937*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
938*53ee8cc1Swenshuai.xi
MDrv_MVD_SetSLQWritePtr(MS_U32 u32Id,MS_BOOL bCheckData)939*53ee8cc1Swenshuai.xi void MDrv_MVD_SetSLQWritePtr(MS_U32 u32Id, MS_BOOL bCheckData)
940*53ee8cc1Swenshuai.xi {
941*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
942*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
943*53ee8cc1Swenshuai.xi HAL_MVD_SetSLQWritePtr(u8HalIdx, bCheckData);
944*53ee8cc1Swenshuai.xi return;
945*53ee8cc1Swenshuai.xi }
946*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
947*53ee8cc1Swenshuai.xi /// Get MVD decoded frame index. For debug.
948*53ee8cc1Swenshuai.xi /// @return -frame index of the decoded frame
949*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetDecodedFrameIdx(MS_U32 u32Id)950*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetDecodedFrameIdx(MS_U32 u32Id)
951*53ee8cc1Swenshuai.xi {
952*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
953*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
954*53ee8cc1Swenshuai.xi return HAL_MVD_GetDecodedFrameIdx(u8HalIdx);
955*53ee8cc1Swenshuai.xi }
956*53ee8cc1Swenshuai.xi
957*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
958*53ee8cc1Swenshuai.xi /// Get MVD VLD error count
959*53ee8cc1Swenshuai.xi /// @return -VLD error count
960*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetVldErrCount(MS_U32 u32Id)961*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetVldErrCount(MS_U32 u32Id)
962*53ee8cc1Swenshuai.xi {
963*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
964*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
965*53ee8cc1Swenshuai.xi return HAL_MVD_GetVldErrCount(u8HalIdx);
966*53ee8cc1Swenshuai.xi }
967*53ee8cc1Swenshuai.xi
968*53ee8cc1Swenshuai.xi
969*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
970*53ee8cc1Swenshuai.xi /// Get MVD error info.
971*53ee8cc1Swenshuai.xi /// This function can be used to diagnosis when the 1st DispReady doesn't occur.
972*53ee8cc1Swenshuai.xi ///
973*53ee8cc1Swenshuai.xi /// @param - errorCode \b OUT : error code
974*53ee8cc1Swenshuai.xi /// @param - errorStatus \b OUT : error status
975*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetErrInfo(MS_U32 u32Id,MVD_ErrCode * errCode,MVD_ErrStatus * errStatus)976*53ee8cc1Swenshuai.xi void MDrv_MVD_GetErrInfo(MS_U32 u32Id, MVD_ErrCode *errCode, MVD_ErrStatus *errStatus)
977*53ee8cc1Swenshuai.xi {
978*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
979*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
980*53ee8cc1Swenshuai.xi HAL_MVD_GetErrInfo(u8HalIdx, errCode, errStatus);
981*53ee8cc1Swenshuai.xi return;
982*53ee8cc1Swenshuai.xi }
983*53ee8cc1Swenshuai.xi
984*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
985*53ee8cc1Swenshuai.xi /// Get valid MVD stream detected flag
986*53ee8cc1Swenshuai.xi /// For MPEG2/4,
987*53ee8cc1Swenshuai.xi /// 1. width<16(1 macroblock), height<16, width>1920, or height>1080
988*53ee8cc1Swenshuai.xi /// 2. next start code not found
989*53ee8cc1Swenshuai.xi /// the stream would be considered as invalid.
990*53ee8cc1Swenshuai.xi /// For VC1/RCV, not impelment, default: valid
991*53ee8cc1Swenshuai.xi /// @return -decoded flag
992*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetValidStreamFlag(MS_U32 u32Id)993*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetValidStreamFlag(MS_U32 u32Id)
994*53ee8cc1Swenshuai.xi {
995*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
996*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
997*53ee8cc1Swenshuai.xi return HAL_MVD_GetValidStreamFlag(u8HalIdx);
998*53ee8cc1Swenshuai.xi }
999*53ee8cc1Swenshuai.xi
1000*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1001*53ee8cc1Swenshuai.xi /// Get video frame information from MVD
1002*53ee8cc1Swenshuai.xi /// (SourceW * ParH) : (SourceH * ParW) = DarW : DarH
1003*53ee8cc1Swenshuai.xi /// E.g. Source PAL 704x576, Par(Pixel aspect ratio)=12/11,
1004*53ee8cc1Swenshuai.xi /// Dar(Display AR) = (704x12):(576x11) = 4:3
1005*53ee8cc1Swenshuai.xi /// @param -pinfo \b IN : pointer to video frame information
1006*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetFrameInfo(MS_U32 u32Id,MVD_FrameInfo * pinfo)1007*53ee8cc1Swenshuai.xi void MDrv_MVD_GetFrameInfo(MS_U32 u32Id, MVD_FrameInfo *pinfo)
1008*53ee8cc1Swenshuai.xi {
1009*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1010*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1011*53ee8cc1Swenshuai.xi HAL_MVD_GetFrameInfo(u8HalIdx, pinfo);
1012*53ee8cc1Swenshuai.xi }
1013*53ee8cc1Swenshuai.xi
1014*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1015*53ee8cc1Swenshuai.xi /// Set video frame information from MVD
1016*53ee8cc1Swenshuai.xi /// @param -pinfo \b IN : pointer to video frame information
1017*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetFrameInfo(MS_U32 u32Id,MVD_FrameInfo * pinfo)1018*53ee8cc1Swenshuai.xi void MDrv_MVD_SetFrameInfo(MS_U32 u32Id, MVD_FrameInfo *pinfo )
1019*53ee8cc1Swenshuai.xi {
1020*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1021*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1022*53ee8cc1Swenshuai.xi HAL_MVD_SetFrameInfo(u8HalIdx, pinfo);
1023*53ee8cc1Swenshuai.xi return;
1024*53ee8cc1Swenshuai.xi }
1025*53ee8cc1Swenshuai.xi
1026*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1027*53ee8cc1Swenshuai.xi /// Reset for I-frame decoding
1028*53ee8cc1Swenshuai.xi /// @return -none
1029*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_RstIFrameDec(MS_U32 u32Id,MVD_CodecType eCodecType,MS_BOOL bShareBBU)1030*53ee8cc1Swenshuai.xi void MDrv_MVD_RstIFrameDec(MS_U32 u32Id, MVD_CodecType eCodecType, MS_BOOL bShareBBU)
1031*53ee8cc1Swenshuai.xi {
1032*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1033*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1034*53ee8cc1Swenshuai.xi if (HAL_MVD_Stop(u8HalIdx) == FALSE)
1035*53ee8cc1Swenshuai.xi {
1036*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("%s fail!!\n", __FUNCTION__));
1037*53ee8cc1Swenshuai.xi }
1038*53ee8cc1Swenshuai.xi
1039*53ee8cc1Swenshuai.xi MDrv_MVD_Rst(u32Id, eCodecType, bShareBBU);
1040*53ee8cc1Swenshuai.xi return;
1041*53ee8cc1Swenshuai.xi }
1042*53ee8cc1Swenshuai.xi
1043*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1044*53ee8cc1Swenshuai.xi /// Decode I-frame
1045*53ee8cc1Swenshuai.xi /// @param -u32FrameBufAddr \b IN : start address of frame buffer
1046*53ee8cc1Swenshuai.xi /// @param -u32StreamBufAddr \b IN : start address of stream buffer
1047*53ee8cc1Swenshuai.xi /// @return -return decode I-frame success or not
1048*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DecodeIFrame(MS_U32 u32Id,MS_PHY u32FrameBufAddr,MS_PHY u32StreamBufAddr,MS_PHY u32StreamBufEndAddr)1049*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_DecodeIFrame(MS_U32 u32Id, MS_PHY u32FrameBufAddr, MS_PHY u32StreamBufAddr, MS_PHY u32StreamBufEndAddr )
1050*53ee8cc1Swenshuai.xi {
1051*53ee8cc1Swenshuai.xi MS_BOOL bRet = FALSE;
1052*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1053*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s input FBAdd=0x%lx streamStart=0x%lx streamEnd=0x%lx\n",
1054*53ee8cc1Swenshuai.xi __FUNCTION__, (unsigned long)u32FrameBufAddr, (unsigned long)u32StreamBufAddr, (unsigned long)u32StreamBufEndAddr));
1055*53ee8cc1Swenshuai.xi u32FrameBufAddr = HAL_MVD_GetMemOffset(u32FrameBufAddr);
1056*53ee8cc1Swenshuai.xi u32StreamBufAddr = HAL_MVD_GetMemOffset(u32StreamBufAddr);
1057*53ee8cc1Swenshuai.xi u32StreamBufEndAddr = HAL_MVD_GetMemOffset(u32StreamBufEndAddr);
1058*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s offset FBAdd=0x%lx streamStart=0x%lx streamEnd=0x%lx\n",
1059*53ee8cc1Swenshuai.xi __FUNCTION__, (unsigned long)u32FrameBufAddr, (unsigned long)u32StreamBufAddr, (unsigned long)u32StreamBufEndAddr));
1060*53ee8cc1Swenshuai.xi
1061*53ee8cc1Swenshuai.xi bRet = HAL_MVD_DecodeIFrame(u8HalIdx, u32FrameBufAddr, u32StreamBufAddr, u32StreamBufEndAddr);
1062*53ee8cc1Swenshuai.xi return bRet;
1063*53ee8cc1Swenshuai.xi }
1064*53ee8cc1Swenshuai.xi
1065*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1066*53ee8cc1Swenshuai.xi /// Query if MVD is decoding frame
1067*53ee8cc1Swenshuai.xi /// @return -MVD is decoding frame or not
1068*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetIsIFrameDecoding(MS_U32 u32Id)1069*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetIsIFrameDecoding(MS_U32 u32Id)
1070*53ee8cc1Swenshuai.xi {
1071*53ee8cc1Swenshuai.xi MS_BOOL bDecodeIFrame = FALSE;
1072*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1073*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1074*53ee8cc1Swenshuai.xi if (pCtrlCfg)
1075*53ee8cc1Swenshuai.xi {
1076*53ee8cc1Swenshuai.xi bDecodeIFrame = pCtrlCfg->bDecodeIFrame;
1077*53ee8cc1Swenshuai.xi }
1078*53ee8cc1Swenshuai.xi return bDecodeIFrame;
1079*53ee8cc1Swenshuai.xi }
1080*53ee8cc1Swenshuai.xi
1081*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1082*53ee8cc1Swenshuai.xi /// Get MVD active format
1083*53ee8cc1Swenshuai.xi /// @return -active format
1084*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetActiveFormat(MS_U32 u32Id)1085*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetActiveFormat(MS_U32 u32Id)
1086*53ee8cc1Swenshuai.xi {
1087*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1088*53ee8cc1Swenshuai.xi //set default as invalid AFD that is ignored by AP.
1089*53ee8cc1Swenshuai.xi //static MS_U8 u8Afd[MVD_MAX_STREAMS] = { 0xff, 0xff};
1090*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
1091*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1092*53ee8cc1Swenshuai.xi #if (MVD_TURBO_INIT)
1093*53ee8cc1Swenshuai.xi //static MS_U32 u32FrmCnt[MVD_MAX_STREAMS] = { 0, 0};
1094*53ee8cc1Swenshuai.xi
1095*53ee8cc1Swenshuai.xi if (pMVDDrvContext->u32FrmCnt[u8DrvIdx] == HAL_MVD_GetPicCounter(u8HalIdx))
1096*53ee8cc1Swenshuai.xi {
1097*53ee8cc1Swenshuai.xi return pMVDDrvContext->u8Afd[u8DrvIdx];
1098*53ee8cc1Swenshuai.xi }
1099*53ee8cc1Swenshuai.xi pMVDDrvContext->u32FrmCnt[u8DrvIdx] = HAL_MVD_GetPicCounter(u8HalIdx);
1100*53ee8cc1Swenshuai.xi #endif
1101*53ee8cc1Swenshuai.xi pMVDDrvContext->u8Afd[u8DrvIdx] = HAL_MVD_GetActiveFormat(u8HalIdx);
1102*53ee8cc1Swenshuai.xi return pMVDDrvContext->u8Afd[u8DrvIdx];
1103*53ee8cc1Swenshuai.xi }
1104*53ee8cc1Swenshuai.xi
1105*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1106*53ee8cc1Swenshuai.xi /// Enable or disable AV synchronization.
1107*53ee8cc1Swenshuai.xi /// Delay u32Delay ms if AVSync is enabled.
1108*53ee8cc1Swenshuai.xi /// @return -none
1109*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetAVSync(MS_U32 u32Id,MS_BOOL bEnable,MS_U32 u32Delay)1110*53ee8cc1Swenshuai.xi void MDrv_MVD_SetAVSync(MS_U32 u32Id, MS_BOOL bEnable, MS_U32 u32Delay)
1111*53ee8cc1Swenshuai.xi {
1112*53ee8cc1Swenshuai.xi //MVD_PRINT("%s bEnable=%d u32Delay=%ld\n",__FUNCTION__,bEnable,u32Delay);
1113*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1114*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
1115*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1116*53ee8cc1Swenshuai.xi if (TRUE != HAL_MVD_EnableAVSync(u8HalIdx, bEnable))
1117*53ee8cc1Swenshuai.xi {
1118*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("%s: fail to set avsync on\n", __FUNCTION__));
1119*53ee8cc1Swenshuai.xi return;
1120*53ee8cc1Swenshuai.xi }
1121*53ee8cc1Swenshuai.xi //bAVSyncOn = bEnable; //for IsAVSyncOn
1122*53ee8cc1Swenshuai.xi
1123*53ee8cc1Swenshuai.xi if (bEnable && (u32Delay != 0))
1124*53ee8cc1Swenshuai.xi {
1125*53ee8cc1Swenshuai.xi if (TRUE != HAL_MVD_SetAVSyncDelay(u8HalIdx, u32Delay))
1126*53ee8cc1Swenshuai.xi {
1127*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("%s: fail to set avsync delay\n", __FUNCTION__));
1128*53ee8cc1Swenshuai.xi return;
1129*53ee8cc1Swenshuai.xi }
1130*53ee8cc1Swenshuai.xi }
1131*53ee8cc1Swenshuai.xi
1132*53ee8cc1Swenshuai.xi pMVDDrvContext->stSyncCfg[u8DrvIdx].bEnable = bEnable;
1133*53ee8cc1Swenshuai.xi pMVDDrvContext->stSyncCfg[u8DrvIdx].u32Delay = u32Delay;
1134*53ee8cc1Swenshuai.xi return;
1135*53ee8cc1Swenshuai.xi }
1136*53ee8cc1Swenshuai.xi
1137*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1138*53ee8cc1Swenshuai.xi /// Set the maximum repeat times for one frame when av is not sync.
1139*53ee8cc1Swenshuai.xi /// E.g. Arg5=0x01 mean that frame will be repeated once if av is not sync.
1140*53ee8cc1Swenshuai.xi /// Arg5=0xff mean that frame will be always repeated when av is not sync.
1141*53ee8cc1Swenshuai.xi /// And customer can re-define the avsync skip behavior,
1142*53ee8cc1Swenshuai.xi /// i.e., Arg4 = 1 for skip-b-frame only and 0 for skip display(default)
1143*53ee8cc1Swenshuai.xi /// @return -none
1144*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetAVSyncThreshold(MS_U32 u32Id,MS_U32 u32Th)1145*53ee8cc1Swenshuai.xi void MDrv_MVD_SetAVSyncThreshold(MS_U32 u32Id, MS_U32 u32Th)
1146*53ee8cc1Swenshuai.xi {
1147*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1148*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1149*53ee8cc1Swenshuai.xi HAL_MVD_SetAVSyncThreshold(u8HalIdx, u32Th);
1150*53ee8cc1Swenshuai.xi return;
1151*53ee8cc1Swenshuai.xi }
1152*53ee8cc1Swenshuai.xi
1153*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1154*53ee8cc1Swenshuai.xi /// Set the threshold for VC1 avsync (live mode & file mode). Unit: 90K
1155*53ee8cc1Swenshuai.xi /// @return -none
1156*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetAVSyncFreerunThreshold(MS_U32 u32Id,MS_U32 u32Th)1157*53ee8cc1Swenshuai.xi void MDrv_MVD_SetAVSyncFreerunThreshold(MS_U32 u32Id, MS_U32 u32Th)
1158*53ee8cc1Swenshuai.xi {
1159*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1160*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1161*53ee8cc1Swenshuai.xi HAL_MVD_SetAVSyncFreerunThreshold(u8HalIdx, u32Th);
1162*53ee8cc1Swenshuai.xi return;
1163*53ee8cc1Swenshuai.xi }
1164*53ee8cc1Swenshuai.xi
1165*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1166*53ee8cc1Swenshuai.xi /// Get MVD AVSync delay (ms)
1167*53ee8cc1Swenshuai.xi /// @return -avsync delay
1168*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetAVSyncDelay(MS_U32 u32Id)1169*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetAVSyncDelay(MS_U32 u32Id)
1170*53ee8cc1Swenshuai.xi {
1171*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
1172*53ee8cc1Swenshuai.xi return (pMVDDrvContext->stSyncCfg[u8DrvIdx].u32Delay);
1173*53ee8cc1Swenshuai.xi }
1174*53ee8cc1Swenshuai.xi
1175*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1176*53ee8cc1Swenshuai.xi /// Get if AVSync is turned on
1177*53ee8cc1Swenshuai.xi /// @return -TRUE for yes or FALSE for no
1178*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetIsAVSyncOn(MS_U32 u32Id)1179*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetIsAVSyncOn(MS_U32 u32Id)
1180*53ee8cc1Swenshuai.xi {
1181*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1182*53ee8cc1Swenshuai.xi return HAL_MVD_GetIsAVSyncOn(u8HalIdx);
1183*53ee8cc1Swenshuai.xi }
1184*53ee8cc1Swenshuai.xi
1185*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1186*53ee8cc1Swenshuai.xi /// Get if firmware is repeating frame for AVSync.
1187*53ee8cc1Swenshuai.xi /// @return -TRUE for yes or FALSE for no
1188*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetIsSyncRep(MS_U32 u32Id)1189*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetIsSyncRep(MS_U32 u32Id)
1190*53ee8cc1Swenshuai.xi {
1191*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1192*53ee8cc1Swenshuai.xi return HAL_MVD_GetIsSyncRep(u8HalIdx);
1193*53ee8cc1Swenshuai.xi }
1194*53ee8cc1Swenshuai.xi
1195*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1196*53ee8cc1Swenshuai.xi /// Get if firmware is skipping frame for AVSync.
1197*53ee8cc1Swenshuai.xi /// @return -TRUE for yes or FALSE for no
1198*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetIsSyncSkip(MS_U32 u32Id)1199*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetIsSyncSkip(MS_U32 u32Id)
1200*53ee8cc1Swenshuai.xi {
1201*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1202*53ee8cc1Swenshuai.xi return HAL_MVD_GetIsSyncSkip(u8HalIdx);
1203*53ee8cc1Swenshuai.xi }
1204*53ee8cc1Swenshuai.xi
1205*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1206*53ee8cc1Swenshuai.xi /// Change PTS threshold for doing AVSync.
1207*53ee8cc1Swenshuai.xi /// Scenario: When disable black screen earlier than normal case, use this function
1208*53ee8cc1Swenshuai.xi /// to avoid frame skip too fast or video lag.
1209*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : enable this configuration
1210*53ee8cc1Swenshuai.xi /// @param -u16PTS \b IN : PTS threshold (unit: 90k counter, i.e. x/90 ms, max 728ms)
1211*53ee8cc1Swenshuai.xi /// @return -TRUE for success or FALSE for failure.
1212*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_ChangeAVsync(MS_U32 u32Id,MS_BOOL bEnable,MS_U16 u16PTS)1213*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_ChangeAVsync(MS_U32 u32Id, MS_BOOL bEnable, MS_U16 u16PTS)
1214*53ee8cc1Swenshuai.xi {
1215*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
1216*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1217*53ee8cc1Swenshuai.xi if (HAL_MVD_ChangeAVsync(u8HalIdx, bEnable, u16PTS) == TRUE)
1218*53ee8cc1Swenshuai.xi {
1219*53ee8cc1Swenshuai.xi pMVDDrvContext->stSyncCfg[u8DrvIdx].u16Tolerance = u16PTS;
1220*53ee8cc1Swenshuai.xi return TRUE;
1221*53ee8cc1Swenshuai.xi }
1222*53ee8cc1Swenshuai.xi return FALSE;
1223*53ee8cc1Swenshuai.xi }
1224*53ee8cc1Swenshuai.xi
1225*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1226*53ee8cc1Swenshuai.xi /// Get address of the first I-frame.
1227*53ee8cc1Swenshuai.xi /// @return -address of the first I-frame
1228*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetIsIPicFound(MS_U32 u32Id)1229*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetIsIPicFound(MS_U32 u32Id)
1230*53ee8cc1Swenshuai.xi {
1231*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1232*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1233*53ee8cc1Swenshuai.xi return HAL_MVD_GetIsIPicFound(u8HalIdx);
1234*53ee8cc1Swenshuai.xi }
1235*53ee8cc1Swenshuai.xi
1236*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1237*53ee8cc1Swenshuai.xi /// Get sync status to know whether sync is complete or not
1238*53ee8cc1Swenshuai.xi /// @return - 1 : sync complete
1239*53ee8cc1Swenshuai.xi //// - otherwise: sync not complete
1240*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetSyncStatus(MS_U32 u32Id)1241*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetSyncStatus(MS_U32 u32Id)
1242*53ee8cc1Swenshuai.xi {
1243*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1244*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1245*53ee8cc1Swenshuai.xi return HAL_MVD_GetIsSyncReach(u8HalIdx);
1246*53ee8cc1Swenshuai.xi }
1247*53ee8cc1Swenshuai.xi
1248*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1249*53ee8cc1Swenshuai.xi /// Report if decoder is freerun or not
1250*53ee8cc1Swenshuai.xi /// @return - TRUE : freerun
1251*53ee8cc1Swenshuai.xi //// - FALSE : not freerun
1252*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetIsFreerun(MS_U32 u32Id)1253*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetIsFreerun(MS_U32 u32Id)
1254*53ee8cc1Swenshuai.xi {
1255*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1256*53ee8cc1Swenshuai.xi return (HAL_MVD_GetAVSyncStatus(u8HalIdx) == 0);
1257*53ee8cc1Swenshuai.xi }
1258*53ee8cc1Swenshuai.xi
1259*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1260*53ee8cc1Swenshuai.xi /// Get PTS (Presentation Time Stamp)
1261*53ee8cc1Swenshuai.xi /// @return -PTS (unit: ms)
1262*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetPTS(MS_U32 u32Id)1263*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetPTS(MS_U32 u32Id)
1264*53ee8cc1Swenshuai.xi {
1265*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1266*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1267*53ee8cc1Swenshuai.xi return HAL_MVD_GetPTS(u8HalIdx);
1268*53ee8cc1Swenshuai.xi }
1269*53ee8cc1Swenshuai.xi
1270*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1271*53ee8cc1Swenshuai.xi /// Get 33 bits PTS (Presentation Time Stamp)
1272*53ee8cc1Swenshuai.xi /// @return -PTS (unit: ms)
1273*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetU64PTS(MS_U32 u32Id,MVD_PtsType eType)1274*53ee8cc1Swenshuai.xi MS_U64 MDrv_MVD_GetU64PTS(MS_U32 u32Id,MVD_PtsType eType)
1275*53ee8cc1Swenshuai.xi {
1276*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1277*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1278*53ee8cc1Swenshuai.xi return HAL_MVD_GetU64PTS(u8HalIdx,eType);
1279*53ee8cc1Swenshuai.xi }
1280*53ee8cc1Swenshuai.xi
1281*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1282*53ee8cc1Swenshuai.xi /// Get Next PTS (Presentation Time Stamp)
1283*53ee8cc1Swenshuai.xi /// @return -Next PTS (unit: ms)
1284*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetNextPTS(MS_U32 u32Id)1285*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetNextPTS(MS_U32 u32Id)
1286*53ee8cc1Swenshuai.xi {
1287*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1288*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1289*53ee8cc1Swenshuai.xi return HAL_MVD_GetNextPTS(u8HalIdx);
1290*53ee8cc1Swenshuai.xi }
1291*53ee8cc1Swenshuai.xi
1292*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1293*53ee8cc1Swenshuai.xi /// Get Chroma format (MDrv_MVD_GetChromaFormat)
1294*53ee8cc1Swenshuai.xi /// @return -Chroma format ()
1295*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetChromaFormat(MS_U32 u32Id)1296*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetChromaFormat(MS_U32 u32Id)
1297*53ee8cc1Swenshuai.xi {
1298*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1299*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1300*53ee8cc1Swenshuai.xi return HAL_MVD_GetChromaFormat(u8HalIdx);
1301*53ee8cc1Swenshuai.xi }
1302*53ee8cc1Swenshuai.xi
1303*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1304*53ee8cc1Swenshuai.xi /// Query if MVD is ready to display
1305*53ee8cc1Swenshuai.xi /// @return -MS_U8 0: not ready, !0: ready.
1306*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetDispRdy(MS_U32 u32Id)1307*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetDispRdy(MS_U32 u32Id)
1308*53ee8cc1Swenshuai.xi {
1309*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1310*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1311*53ee8cc1Swenshuai.xi MS_BOOL bDispRdy = HAL_MVD_GetDispRdy(u8HalIdx);
1312*53ee8cc1Swenshuai.xi MS_BOOL bIFound = HAL_MVD_GetIsIPicFound(u8HalIdx);
1313*53ee8cc1Swenshuai.xi
1314*53ee8cc1Swenshuai.xi #ifndef DONT_USE_CMA
1315*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
1316*53ee8cc1Swenshuai.xi if(pMVDDrvContext->bCMAUsed == TRUE && pMVDDrvContext->bCMAAllocDone == FALSE)
1317*53ee8cc1Swenshuai.xi {
1318*53ee8cc1Swenshuai.xi MS_U64 u64Addr;
1319*53ee8cc1Swenshuai.xi MS_SIZE u64Size;
1320*53ee8cc1Swenshuai.xi MS_BOOL bAllocateDone;
1321*53ee8cc1Swenshuai.xi struct CMA_Pool_Alloc_Param alloc_param;
1322*53ee8cc1Swenshuai.xi HAL_MVD_GetCMAInformation(u8HalIdx,&u64Addr,&u64Size,&bAllocateDone);
1323*53ee8cc1Swenshuai.xi
1324*53ee8cc1Swenshuai.xi if(u64Addr == 0 || u64Size == 0)
1325*53ee8cc1Swenshuai.xi {
1326*53ee8cc1Swenshuai.xi return FALSE;
1327*53ee8cc1Swenshuai.xi }
1328*53ee8cc1Swenshuai.xi else
1329*53ee8cc1Swenshuai.xi {
1330*53ee8cc1Swenshuai.xi alloc_param.pool_handle_id = pMVDDrvContext->cmaInitParam.pool_handle_id;
1331*53ee8cc1Swenshuai.xi alloc_param.offset_in_pool = u64Addr - pMVDDrvContext->cmaInitParam.heap_miu_start_offset;
1332*53ee8cc1Swenshuai.xi alloc_param.length = u64Size;
1333*53ee8cc1Swenshuai.xi alloc_param.flags = CMA_FLAG_VIRT_ADDR;
1334*53ee8cc1Swenshuai.xi
1335*53ee8cc1Swenshuai.xi if (MApi_CMA_Pool_GetMem(&alloc_param) == FALSE)
1336*53ee8cc1Swenshuai.xi {
1337*53ee8cc1Swenshuai.xi return FALSE;
1338*53ee8cc1Swenshuai.xi }
1339*53ee8cc1Swenshuai.xi
1340*53ee8cc1Swenshuai.xi VPRINTF("[VDEC][%d]MApi_CMA_Pool_GetMem in mvd: alloc_param.pool_handle_id=%x, alloc_param.flags=%x, alloc_param.offset_in_pool=%llx, alloc_param.length=%x\n",
1341*53ee8cc1Swenshuai.xi (unsigned int)u8DrvIdx,
1342*53ee8cc1Swenshuai.xi (unsigned int)alloc_param.pool_handle_id,
1343*53ee8cc1Swenshuai.xi (unsigned int)alloc_param.flags,
1344*53ee8cc1Swenshuai.xi (unsigned long long int)alloc_param.offset_in_pool,
1345*53ee8cc1Swenshuai.xi (unsigned int)alloc_param.length);
1346*53ee8cc1Swenshuai.xi
1347*53ee8cc1Swenshuai.xi pMVDDrvContext->cmaFreeParam[u8DrvIdx].pool_handle_id = alloc_param.pool_handle_id;
1348*53ee8cc1Swenshuai.xi pMVDDrvContext->cmaFreeParam[u8DrvIdx].offset_in_pool = alloc_param.offset_in_pool;
1349*53ee8cc1Swenshuai.xi pMVDDrvContext->cmaFreeParam[u8DrvIdx].length = alloc_param.length;
1350*53ee8cc1Swenshuai.xi
1351*53ee8cc1Swenshuai.xi //Run time set frame buffer miu client
1352*53ee8cc1Swenshuai.xi HAL_MVD_SetFrameBufferMiu(u8HalIdx,pMVDDrvContext->cmaInitParam.miu);
1353*53ee8cc1Swenshuai.xi
1354*53ee8cc1Swenshuai.xi HAL_MVD_SetCMAAllocateDone(u8HalIdx);
1355*53ee8cc1Swenshuai.xi
1356*53ee8cc1Swenshuai.xi pMVDDrvContext->bCMAAllocDone = TRUE;
1357*53ee8cc1Swenshuai.xi }
1358*53ee8cc1Swenshuai.xi }
1359*53ee8cc1Swenshuai.xi #endif
1360*53ee8cc1Swenshuai.xi return (bDispRdy || bIFound);
1361*53ee8cc1Swenshuai.xi }
1362*53ee8cc1Swenshuai.xi
1363*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1364*53ee8cc1Swenshuai.xi /// Query if the first frame is showed after play function is called.
1365*53ee8cc1Swenshuai.xi /// Whenever the first display frame is displayed, f/w will set this flag to 1.
1366*53ee8cc1Swenshuai.xi /// @return VDEC_Result
1367*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_Is1stFrmRdy(MS_U32 u32Id)1368*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_Is1stFrmRdy(MS_U32 u32Id)
1369*53ee8cc1Swenshuai.xi {
1370*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1371*53ee8cc1Swenshuai.xi return HAL_MVD_Is1stFrmRdy(u8HalIdx);
1372*53ee8cc1Swenshuai.xi }
1373*53ee8cc1Swenshuai.xi
1374*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1375*53ee8cc1Swenshuai.xi /// Get picture count of current GOP (Group of Picture)
1376*53ee8cc1Swenshuai.xi /// @return -picture count of GOP
1377*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetGOPCount(MS_U32 u32Id)1378*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetGOPCount(MS_U32 u32Id)
1379*53ee8cc1Swenshuai.xi {
1380*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1381*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1382*53ee8cc1Swenshuai.xi return HAL_MVD_GetGOPCount(u8HalIdx);
1383*53ee8cc1Swenshuai.xi }
1384*53ee8cc1Swenshuai.xi
1385*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1386*53ee8cc1Swenshuai.xi /// Enable or disable dropping error frames
1387*53ee8cc1Swenshuai.xi /// @return -command is set successfully or not
1388*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DropErrorFrame(MS_U32 u32Id,MS_BOOL bDrop)1389*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_DropErrorFrame(MS_U32 u32Id, MS_BOOL bDrop)
1390*53ee8cc1Swenshuai.xi {
1391*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1392*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1393*53ee8cc1Swenshuai.xi if (HAL_MVD_DropErrorFrame(u8HalIdx, bDrop) == FALSE)
1394*53ee8cc1Swenshuai.xi {
1395*53ee8cc1Swenshuai.xi MVD_DEBUGERROR( MVD_ERR( "%s fail!!\n", __FUNCTION__));
1396*53ee8cc1Swenshuai.xi return FALSE;
1397*53ee8cc1Swenshuai.xi }
1398*53ee8cc1Swenshuai.xi pstCtrlCfg->bDropErrFrm = bDrop;
1399*53ee8cc1Swenshuai.xi return TRUE;
1400*53ee8cc1Swenshuai.xi }
1401*53ee8cc1Swenshuai.xi
1402*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1403*53ee8cc1Swenshuai.xi /// Get byte count of parser.
1404*53ee8cc1Swenshuai.xi /// @return -byte count of parser
1405*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetParserByteCnt(MS_U32 u32Id)1406*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetParserByteCnt(MS_U32 u32Id)
1407*53ee8cc1Swenshuai.xi {
1408*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1409*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1410*53ee8cc1Swenshuai.xi return HAL_MVD_GetParserByteCnt(u8HalIdx);
1411*53ee8cc1Swenshuai.xi }
1412*53ee8cc1Swenshuai.xi
1413*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1414*53ee8cc1Swenshuai.xi /// Get the decode status.
1415*53ee8cc1Swenshuai.xi /// @return -the decode status
1416*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetDecodeStatus(MS_U32 u32Id)1417*53ee8cc1Swenshuai.xi MVD_DecStat MDrv_MVD_GetDecodeStatus(MS_U32 u32Id)
1418*53ee8cc1Swenshuai.xi {
1419*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1420*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1421*53ee8cc1Swenshuai.xi return HAL_MVD_GetDecodeStatus(u8HalIdx);
1422*53ee8cc1Swenshuai.xi }
1423*53ee8cc1Swenshuai.xi
1424*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1425*53ee8cc1Swenshuai.xi /// Get the last command to firmware.
1426*53ee8cc1Swenshuai.xi /// @return -the last command
1427*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetLastCmd(MS_U32 u32Id)1428*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetLastCmd(MS_U32 u32Id)
1429*53ee8cc1Swenshuai.xi {
1430*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1431*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1432*53ee8cc1Swenshuai.xi return HAL_MVD_GetLastCmd(u8HalIdx);
1433*53ee8cc1Swenshuai.xi }
1434*53ee8cc1Swenshuai.xi
1435*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1436*53ee8cc1Swenshuai.xi /// Skip data in ES buffer. It is used for flushing ES buffer.
1437*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1438*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SkipData(MS_U32 u32Id)1439*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SkipData(MS_U32 u32Id)
1440*53ee8cc1Swenshuai.xi {
1441*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1442*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1443*53ee8cc1Swenshuai.xi return HAL_MVD_SkipData(u8HalIdx);
1444*53ee8cc1Swenshuai.xi }
1445*53ee8cc1Swenshuai.xi
1446*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1447*53ee8cc1Swenshuai.xi /// Skip to I frame.
1448*53ee8cc1Swenshuai.xi /// Used for MediaCodec when input data is not continuous or in the beginning of
1449*53ee8cc1Swenshuai.xi /// streams.
1450*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1451*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SkipToIFrame(MS_U32 u32Id)1452*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SkipToIFrame(MS_U32 u32Id)
1453*53ee8cc1Swenshuai.xi {
1454*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1455*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1456*53ee8cc1Swenshuai.xi return HAL_MVD_SkipToIFrame(u8HalIdx);
1457*53ee8cc1Swenshuai.xi }
1458*53ee8cc1Swenshuai.xi
1459*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1460*53ee8cc1Swenshuai.xi /// Display control for decoding order, enabling drop error frame, dropping
1461*53ee8cc1Swenshuai.xi /// display and setting FRC (frame rate conversion) mode.
1462*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1463*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DispCtrl(MS_U32 u32Id,MS_BOOL bDecOrder,MS_BOOL bDropErr,MS_BOOL bDropDisp,MVD_FrcMode eFrcMode)1464*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_DispCtrl(MS_U32 u32Id, MS_BOOL bDecOrder, MS_BOOL bDropErr, MS_BOOL bDropDisp, MVD_FrcMode eFrcMode)
1465*53ee8cc1Swenshuai.xi {
1466*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1467*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1468*53ee8cc1Swenshuai.xi return HAL_MVD_DispCtrl(u8HalIdx, bDecOrder, bDropErr, bDropDisp, eFrcMode);
1469*53ee8cc1Swenshuai.xi }
1470*53ee8cc1Swenshuai.xi
1471*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1472*53ee8cc1Swenshuai.xi /// Enable/Disable to repeat the last field when repeat for avsync or display pause.
1473*53ee8cc1Swenshuai.xi /// E.g. Top field first: T-B-B-B-...; Bottom field first: B-T-T-T-...
1474*53ee8cc1Swenshuai.xi /// Usage scenario: scaler framebufferless mode to avoid frame flicker
1475*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1476*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DispRepeatField(MS_U32 u32Id,MS_BOOL bEnable)1477*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_DispRepeatField(MS_U32 u32Id, MS_BOOL bEnable)
1478*53ee8cc1Swenshuai.xi {
1479*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1480*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1481*53ee8cc1Swenshuai.xi return HAL_MVD_DispRepeatField(u8HalIdx, bEnable);
1482*53ee8cc1Swenshuai.xi }
1483*53ee8cc1Swenshuai.xi
1484*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1485*53ee8cc1Swenshuai.xi /// Get color format.
1486*53ee8cc1Swenshuai.xi /// @return - value (0~8)
1487*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetColorFormat(MS_U32 u32Id)1488*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetColorFormat(MS_U32 u32Id)
1489*53ee8cc1Swenshuai.xi {
1490*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1491*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1492*53ee8cc1Swenshuai.xi return HAL_MVD_GetColorFormat(u8HalIdx);
1493*53ee8cc1Swenshuai.xi }
1494*53ee8cc1Swenshuai.xi
1495*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1496*53ee8cc1Swenshuai.xi /// Get matrix coefficients in 13818-2 sequence_display_extension().
1497*53ee8cc1Swenshuai.xi /// @return - value (0~255)
1498*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetMatrixCoef(MS_U32 u32Id)1499*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetMatrixCoef(MS_U32 u32Id)
1500*53ee8cc1Swenshuai.xi {
1501*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1502*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1503*53ee8cc1Swenshuai.xi return HAL_MVD_GetMatrixCoef(u8HalIdx);
1504*53ee8cc1Swenshuai.xi }
1505*53ee8cc1Swenshuai.xi
1506*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1507*53ee8cc1Swenshuai.xi /// Issue PauseDisplay command.
1508*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_Pause(MS_U32 u32Id)1509*53ee8cc1Swenshuai.xi void MDrv_MVD_Pause(MS_U32 u32Id)
1510*53ee8cc1Swenshuai.xi {
1511*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1512*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1513*53ee8cc1Swenshuai.xi HAL_MVD_PauseDisp(u8HalIdx);
1514*53ee8cc1Swenshuai.xi return;
1515*53ee8cc1Swenshuai.xi }
1516*53ee8cc1Swenshuai.xi
1517*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1518*53ee8cc1Swenshuai.xi /// Issue Resume command.
1519*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_Resume(MS_U32 u32Id)1520*53ee8cc1Swenshuai.xi void MDrv_MVD_Resume(MS_U32 u32Id)
1521*53ee8cc1Swenshuai.xi {
1522*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1523*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1524*53ee8cc1Swenshuai.xi if (HAL_MVD_Resume(u8HalIdx) == FALSE)
1525*53ee8cc1Swenshuai.xi {
1526*53ee8cc1Swenshuai.xi MVD_DEBUGERROR( MVD_ERR( "Command: HAL_MVD_Resume fail!!\r\n" ) );
1527*53ee8cc1Swenshuai.xi }
1528*53ee8cc1Swenshuai.xi
1529*53ee8cc1Swenshuai.xi return;
1530*53ee8cc1Swenshuai.xi }
1531*53ee8cc1Swenshuai.xi
1532*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1533*53ee8cc1Swenshuai.xi /// Is MVD step decode done after step decode command.
1534*53ee8cc1Swenshuai.xi /// @return - TRUE/FALSE
1535*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): decoding, or user did not send step decode command.
1536*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): decode done
1537*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_IsStepDecodeDone(MS_U32 u32Id)1538*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_IsStepDecodeDone(MS_U32 u32Id)
1539*53ee8cc1Swenshuai.xi {
1540*53ee8cc1Swenshuai.xi MS_BOOL bRet = FALSE;
1541*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1542*53ee8cc1Swenshuai.xi
1543*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1544*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1545*53ee8cc1Swenshuai.xi if (pCtrlCfg->bStepDecode)
1546*53ee8cc1Swenshuai.xi {
1547*53ee8cc1Swenshuai.xi if (HAL_MVD_IsCmdFinished(u8HalIdx, MVD_HANDSHAKE_SINGLE_STEP))
1548*53ee8cc1Swenshuai.xi {
1549*53ee8cc1Swenshuai.xi MVD_PRINT( "MVD_HANDSHAKE_SINGLE_STEP -------: 0x%x \n", HAL_MVD_IsCmdFinished(u8HalIdx, MVD_HANDSHAKE_SINGLE_STEP));
1550*53ee8cc1Swenshuai.xi pCtrlCfg->bStepDecode = FALSE;
1551*53ee8cc1Swenshuai.xi bRet = TRUE;
1552*53ee8cc1Swenshuai.xi }
1553*53ee8cc1Swenshuai.xi }
1554*53ee8cc1Swenshuai.xi return bRet;
1555*53ee8cc1Swenshuai.xi }
1556*53ee8cc1Swenshuai.xi
1557*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1558*53ee8cc1Swenshuai.xi /// Issue StepPlay command.
1559*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1560*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_StepDecode(MS_U32 u32Id)1561*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_StepDecode(MS_U32 u32Id)
1562*53ee8cc1Swenshuai.xi {
1563*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1564*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1565*53ee8cc1Swenshuai.xi HAL_MVD_ResetHandShake(u8HalIdx, MVD_HANDSHAKE_SINGLE_STEP);
1566*53ee8cc1Swenshuai.xi if (HAL_MVD_StepDecode(u8HalIdx) == FALSE)
1567*53ee8cc1Swenshuai.xi {
1568*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("Command: HAL_MVD_StepDecode fail!!\r\n"));
1569*53ee8cc1Swenshuai.xi return FALSE;
1570*53ee8cc1Swenshuai.xi }
1571*53ee8cc1Swenshuai.xi
1572*53ee8cc1Swenshuai.xi if (HAL_MVD_Resume(u8HalIdx) == FALSE)
1573*53ee8cc1Swenshuai.xi {
1574*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("Command: HAL_MVD_Resume fail!!\r\n"));
1575*53ee8cc1Swenshuai.xi return FALSE;
1576*53ee8cc1Swenshuai.xi }
1577*53ee8cc1Swenshuai.xi
1578*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1579*53ee8cc1Swenshuai.xi if (pCtrlCfg)
1580*53ee8cc1Swenshuai.xi {
1581*53ee8cc1Swenshuai.xi pCtrlCfg->bStepDecode = TRUE;
1582*53ee8cc1Swenshuai.xi }
1583*53ee8cc1Swenshuai.xi return TRUE;
1584*53ee8cc1Swenshuai.xi }
1585*53ee8cc1Swenshuai.xi
1586*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1587*53ee8cc1Swenshuai.xi /// Is MVD step display done after step display command.
1588*53ee8cc1Swenshuai.xi /// @return - TRUE/FALSE
1589*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): decoding, or user did not send step decode command.
1590*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): decode done
1591*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_IsStepDispDone(MS_U32 u32Id)1592*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_IsStepDispDone(MS_U32 u32Id)
1593*53ee8cc1Swenshuai.xi {
1594*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1595*53ee8cc1Swenshuai.xi MS_BOOL bRet = FALSE;
1596*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1597*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1598*53ee8cc1Swenshuai.xi
1599*53ee8cc1Swenshuai.xi if (FALSE == pCtrlCfg->bStepDisp)
1600*53ee8cc1Swenshuai.xi {
1601*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("%s err: hasn't issue StepDisp\n", __FUNCTION__));
1602*53ee8cc1Swenshuai.xi return FALSE;
1603*53ee8cc1Swenshuai.xi }
1604*53ee8cc1Swenshuai.xi
1605*53ee8cc1Swenshuai.xi bRet = HAL_MVD_IsStepDispDone(u8HalIdx);
1606*53ee8cc1Swenshuai.xi if (bRet)
1607*53ee8cc1Swenshuai.xi {
1608*53ee8cc1Swenshuai.xi pCtrlCfg->bStepDisp = FALSE;
1609*53ee8cc1Swenshuai.xi }
1610*53ee8cc1Swenshuai.xi return bRet;
1611*53ee8cc1Swenshuai.xi }
1612*53ee8cc1Swenshuai.xi
1613*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1614*53ee8cc1Swenshuai.xi /// Issue StepDisplay command.
1615*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1616*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_StepDisp(MS_U32 u32Id)1617*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_StepDisp(MS_U32 u32Id)
1618*53ee8cc1Swenshuai.xi {
1619*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1620*53ee8cc1Swenshuai.xi MDrv_MVD_SetSpeed(u32Id, E_MVD_SPEED_DEFAULT, 1);
1621*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1622*53ee8cc1Swenshuai.xi if (HAL_MVD_StepDisp(u8HalIdx) == FALSE)
1623*53ee8cc1Swenshuai.xi {
1624*53ee8cc1Swenshuai.xi MVD_DEBUGERROR( MVD_ERR( "%s fail!!\n", __FUNCTION__ ) );
1625*53ee8cc1Swenshuai.xi return FALSE;
1626*53ee8cc1Swenshuai.xi }
1627*53ee8cc1Swenshuai.xi
1628*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1629*53ee8cc1Swenshuai.xi if (pCtrlCfg)
1630*53ee8cc1Swenshuai.xi {
1631*53ee8cc1Swenshuai.xi pCtrlCfg->bStepDisp = TRUE;
1632*53ee8cc1Swenshuai.xi }
1633*53ee8cc1Swenshuai.xi return TRUE;
1634*53ee8cc1Swenshuai.xi }
1635*53ee8cc1Swenshuai.xi
1636*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1637*53ee8cc1Swenshuai.xi /// Is MVD step display done after step display command.
1638*53ee8cc1Swenshuai.xi /// @return - TRUE/FALSE
1639*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): decoding, or user did not send step decode command.
1640*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): decode done
1641*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_IsStep2PtsDone(MS_U32 u32Id)1642*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_IsStep2PtsDone(MS_U32 u32Id)
1643*53ee8cc1Swenshuai.xi {
1644*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1645*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1646*53ee8cc1Swenshuai.xi return HAL_MVD_IsStep2PtsDone(u8HalIdx);
1647*53ee8cc1Swenshuai.xi }
1648*53ee8cc1Swenshuai.xi
1649*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1650*53ee8cc1Swenshuai.xi /// Step to the specific PTS (u32Pts ms)
1651*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1652*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SeekToPTS(MS_U32 u32Id,MS_U32 u32Pts)1653*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SeekToPTS(MS_U32 u32Id, MS_U32 u32Pts)
1654*53ee8cc1Swenshuai.xi {
1655*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1656*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1657*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1658*53ee8cc1Swenshuai.xi
1659*53ee8cc1Swenshuai.xi MDrv_MVD_SetSpeed(u32Id, E_MVD_SPEED_DEFAULT, 1);
1660*53ee8cc1Swenshuai.xi pCtrlCfg->bStep2Pts = HAL_MVD_SeekToPTS(u8HalIdx, _MS_TO_90K(u32Pts));
1661*53ee8cc1Swenshuai.xi return (pCtrlCfg->bStep2Pts);
1662*53ee8cc1Swenshuai.xi }
1663*53ee8cc1Swenshuai.xi
1664*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1665*53ee8cc1Swenshuai.xi /// Skip to the specific PTS (u32Pts ms)
1666*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1667*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SkipToPTS(MS_U32 u32Id,MS_U32 u32Pts)1668*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SkipToPTS(MS_U32 u32Id, MS_U32 u32Pts)
1669*53ee8cc1Swenshuai.xi {
1670*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1671*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1672*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1673*53ee8cc1Swenshuai.xi
1674*53ee8cc1Swenshuai.xi pCtrlCfg->bSkip2Pts = HAL_MVD_SkipToPTS(u8HalIdx, _MS_TO_90K(u32Pts));
1675*53ee8cc1Swenshuai.xi return (pCtrlCfg->bSkip2Pts);
1676*53ee8cc1Swenshuai.xi }
1677*53ee8cc1Swenshuai.xi
1678*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1679*53ee8cc1Swenshuai.xi /// Issue TrickPlay command.
1680*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1681*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_TrickPlay(MS_U32 u32Id,MVD_TrickDec trickDec,MS_U8 u8DispDuration)1682*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_TrickPlay(MS_U32 u32Id, MVD_TrickDec trickDec, MS_U8 u8DispDuration)
1683*53ee8cc1Swenshuai.xi {
1684*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1685*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1686*53ee8cc1Swenshuai.xi //eTrickMode = trickDec; //for MDrv_MVD_GetTrickMode
1687*53ee8cc1Swenshuai.xi if (HAL_MVD_TrickPlay(u8HalIdx, trickDec, u8DispDuration) == FALSE)
1688*53ee8cc1Swenshuai.xi {
1689*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("HAL_MVD_TrickPlay fail!!\r\n"));
1690*53ee8cc1Swenshuai.xi return FALSE;
1691*53ee8cc1Swenshuai.xi }
1692*53ee8cc1Swenshuai.xi // MDrv_MVD_SetAVSync(u32Id, FALSE, 0);
1693*53ee8cc1Swenshuai.xi return TRUE;
1694*53ee8cc1Swenshuai.xi }
1695*53ee8cc1Swenshuai.xi
1696*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1697*53ee8cc1Swenshuai.xi /// Get the trick mode which has been set.
1698*53ee8cc1Swenshuai.xi /// @return MVD_TrickDec
1699*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetTrickMode(MS_U32 u32Id)1700*53ee8cc1Swenshuai.xi MVD_TrickDec MDrv_MVD_GetTrickMode(MS_U32 u32Id)
1701*53ee8cc1Swenshuai.xi {
1702*53ee8cc1Swenshuai.xi MVD_TrickDec eTrickMode = E_MVD_TRICK_DEC_UNKNOWN;
1703*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1704*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1705*53ee8cc1Swenshuai.xi if (pCtrlCfg)
1706*53ee8cc1Swenshuai.xi {
1707*53ee8cc1Swenshuai.xi eTrickMode = pCtrlCfg->eTrickMode;
1708*53ee8cc1Swenshuai.xi }
1709*53ee8cc1Swenshuai.xi
1710*53ee8cc1Swenshuai.xi return eTrickMode;
1711*53ee8cc1Swenshuai.xi }
1712*53ee8cc1Swenshuai.xi
1713*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1714*53ee8cc1Swenshuai.xi /// Flush display buffer.
1715*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1716*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_FlushDisplayBuf(MS_U32 u32Id)1717*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_FlushDisplayBuf(MS_U32 u32Id)
1718*53ee8cc1Swenshuai.xi {
1719*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1720*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1721*53ee8cc1Swenshuai.xi return HAL_MVD_FlushDisplayBuf(u8HalIdx);
1722*53ee8cc1Swenshuai.xi }
1723*53ee8cc1Swenshuai.xi
1724*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1725*53ee8cc1Swenshuai.xi /// Get capabilities of MPEG Video Decoder.
1726*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
1727*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetCaps(MVD_Caps * pCaps)1728*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetCaps(MVD_Caps* pCaps)
1729*53ee8cc1Swenshuai.xi {
1730*53ee8cc1Swenshuai.xi MS_U8 caps = HAL_MVD_GetCaps();
1731*53ee8cc1Swenshuai.xi if (!pCaps)
1732*53ee8cc1Swenshuai.xi return FALSE;
1733*53ee8cc1Swenshuai.xi
1734*53ee8cc1Swenshuai.xi pCaps->bMPEG2 = ((caps & MVD_SUPPORT_MPEG2) == MVD_SUPPORT_MPEG2);
1735*53ee8cc1Swenshuai.xi pCaps->bMPEG4 = ((caps & MVD_SUPPORT_MPEG4) == MVD_SUPPORT_MPEG4);
1736*53ee8cc1Swenshuai.xi pCaps->bVC1 = ((caps & MVD_SUPPORT_VC1) == MVD_SUPPORT_VC1);
1737*53ee8cc1Swenshuai.xi
1738*53ee8cc1Swenshuai.xi //MVD_PRINT("MP2=%d, MP4=%d, VC1=%d\n", pCaps->bMPEG2, pCaps->bMPEG4, pCaps->bVC1);
1739*53ee8cc1Swenshuai.xi return TRUE;
1740*53ee8cc1Swenshuai.xi }
1741*53ee8cc1Swenshuai.xi
1742*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1743*53ee8cc1Swenshuai.xi /// Get max pixels of MPEG Video Decoder.
1744*53ee8cc1Swenshuai.xi /// @return -max pixel supportted .
1745*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetMaxPixel(MS_U32 u32Id)1746*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetMaxPixel(MS_U32 u32Id)
1747*53ee8cc1Swenshuai.xi {
1748*53ee8cc1Swenshuai.xi return (MS_U32)HAL_MVD_GetMaxPixel(u32Id);
1749*53ee8cc1Swenshuai.xi }
1750*53ee8cc1Swenshuai.xi
1751*53ee8cc1Swenshuai.xi
1752*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1753*53ee8cc1Swenshuai.xi /// Get if MVD decoder is playing.
1754*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
1755*53ee8cc1Swenshuai.xi /// - TRUE, Yes
1756*53ee8cc1Swenshuai.xi /// - FALSE, No
1757*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_IsPlaying(MS_U32 u32Id)1758*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_IsPlaying(MS_U32 u32Id)
1759*53ee8cc1Swenshuai.xi {
1760*53ee8cc1Swenshuai.xi MS_BOOL bIsPlaying = FALSE;
1761*53ee8cc1Swenshuai.xi bIsPlaying = ( MDrv_MVD_GetDecodeStatus(u32Id) == E_MVD_STAT_WAIT_DECODEDONE );
1762*53ee8cc1Swenshuai.xi
1763*53ee8cc1Swenshuai.xi return bIsPlaying;
1764*53ee8cc1Swenshuai.xi }
1765*53ee8cc1Swenshuai.xi
1766*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1767*53ee8cc1Swenshuai.xi /// Get if MVD decoder is in idle state.
1768*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
1769*53ee8cc1Swenshuai.xi /// - TRUE, Yes
1770*53ee8cc1Swenshuai.xi /// - FALSE, No
1771*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_IsIdle(MS_U32 u32Id)1772*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_IsIdle(MS_U32 u32Id)
1773*53ee8cc1Swenshuai.xi {
1774*53ee8cc1Swenshuai.xi return (MDrv_MVD_GetDecodeStatus(u32Id) == E_MVD_STAT_IDLE);
1775*53ee8cc1Swenshuai.xi }
1776*53ee8cc1Swenshuai.xi
1777*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1778*53ee8cc1Swenshuai.xi /// Enable/Disable error concealment function
1779*53ee8cc1Swenshuai.xi /// @param -bDisable \b IN : enable/disable this function
1780*53ee8cc1Swenshuai.xi /// @return -return E_MVD_Result success/fail to enable/disable
1781*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DisableErrConceal(MS_U32 u32Id,MS_BOOL bDisable)1782*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_DisableErrConceal(MS_U32 u32Id, MS_BOOL bDisable)
1783*53ee8cc1Swenshuai.xi {
1784*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
1785*53ee8cc1Swenshuai.xi }
1786*53ee8cc1Swenshuai.xi
1787*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1788*53ee8cc1Swenshuai.xi /// Push queue.
1789*53ee8cc1Swenshuai.xi /// @param -u32StAddr \b IN : the start address of the queue
1790*53ee8cc1Swenshuai.xi /// @param -u32Size \b IN : the data size to be pushed
1791*53ee8cc1Swenshuai.xi /// @param -u32TimeStamp \b IN : the corresponding PTS
1792*53ee8cc1Swenshuai.xi /// @return -return E_MVD_Result success/fail to push queue
1793*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_PushQueue(MS_U32 u32Id,MVD_PacketInfo * pInfo)1794*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_PushQueue(MS_U32 u32Id, MVD_PacketInfo* pInfo)
1795*53ee8cc1Swenshuai.xi {
1796*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1797*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1798*53ee8cc1Swenshuai.xi
1799*53ee8cc1Swenshuai.xi //check input parameters
1800*53ee8cc1Swenshuai.xi if (pInfo == NULL)
1801*53ee8cc1Swenshuai.xi {
1802*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("PushQueue NULL pInfo\n"));
1803*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
1804*53ee8cc1Swenshuai.xi }
1805*53ee8cc1Swenshuai.xi
1806*53ee8cc1Swenshuai.xi return HAL_MVD_PushQueue(u8HalIdx, pInfo);
1807*53ee8cc1Swenshuai.xi }
1808*53ee8cc1Swenshuai.xi
1809*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1810*53ee8cc1Swenshuai.xi /// Flush queue: flush ES buffer, reset SLQ TABLE, flush decoded frame, and
1811*53ee8cc1Swenshuai.xi /// keep the display frame.
1812*53ee8cc1Swenshuai.xi /// @return -return E_MVD_Result success/fail to flush queue
1813*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_FlushQueue(MS_U32 u32Id)1814*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_FlushQueue(MS_U32 u32Id)
1815*53ee8cc1Swenshuai.xi {
1816*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1817*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1818*53ee8cc1Swenshuai.xi return HAL_MVD_FlushQueue(u8HalIdx);
1819*53ee8cc1Swenshuai.xi }
1820*53ee8cc1Swenshuai.xi
1821*53ee8cc1Swenshuai.xi
1822*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1823*53ee8cc1Swenshuai.xi /// Get the queue vacancy (unit in slq entry).
1824*53ee8cc1Swenshuai.xi /// @param -pQueueVacancy \b IN : pointer to the queue vacancy
1825*53ee8cc1Swenshuai.xi /// @return -return E_MVD_Result success/fail to get the queue vacancy
1826*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetQueueVacancy(MS_U32 u32Id,MS_BOOL bCached)1827*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetQueueVacancy(MS_U32 u32Id, MS_BOOL bCached)
1828*53ee8cc1Swenshuai.xi {
1829*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1830*53ee8cc1Swenshuai.xi MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
1831*53ee8cc1Swenshuai.xi #ifdef VDEC3
1832*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
1833*53ee8cc1Swenshuai.xi
1834*53ee8cc1Swenshuai.xi if(pMVDDrvContext->u32FrameBaseMode[u8DrvIdx] == TRUE)
1835*53ee8cc1Swenshuai.xi {
1836*53ee8cc1Swenshuai.xi MS_VIRT u32VBBUAddr = HAL_MVD_GetVBBUTableAddr(u8VPUIdx);
1837*53ee8cc1Swenshuai.xi return HAL_VPU_EX_GetVBBUVacancy(u32VBBUAddr);
1838*53ee8cc1Swenshuai.xi }
1839*53ee8cc1Swenshuai.xi else
1840*53ee8cc1Swenshuai.xi #endif
1841*53ee8cc1Swenshuai.xi {
1842*53ee8cc1Swenshuai.xi return HAL_MVD_GetQueueVacancy(u8HalIdx, bCached);
1843*53ee8cc1Swenshuai.xi }
1844*53ee8cc1Swenshuai.xi
1845*53ee8cc1Swenshuai.xi }
1846*53ee8cc1Swenshuai.xi
1847*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1848*53ee8cc1Swenshuai.xi /// Get read pointer in ElementaryStream buffer
1849*53ee8cc1Swenshuai.xi /// @return -the read pointer
1850*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetESReadPtr(MS_U32 u32Id)1851*53ee8cc1Swenshuai.xi MS_VIRT MDrv_MVD_GetESReadPtr(MS_U32 u32Id)
1852*53ee8cc1Swenshuai.xi {
1853*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1854*53ee8cc1Swenshuai.xi MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
1855*53ee8cc1Swenshuai.xi #ifdef VDEC3
1856*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
1857*53ee8cc1Swenshuai.xi
1858*53ee8cc1Swenshuai.xi if(pMVDDrvContext->u32FrameBaseMode[u8DrvIdx] == TRUE)
1859*53ee8cc1Swenshuai.xi {
1860*53ee8cc1Swenshuai.xi MS_VIRT u32VBBUAddr = HAL_MVD_GetVBBUTableAddr(u8VPUIdx);
1861*53ee8cc1Swenshuai.xi MS_VIRT u32Rptr = HAL_VPU_EX_GetESReadPtr(u32Id, u32VBBUAddr);
1862*53ee8cc1Swenshuai.xi return u32Rptr;
1863*53ee8cc1Swenshuai.xi }
1864*53ee8cc1Swenshuai.xi else
1865*53ee8cc1Swenshuai.xi #endif
1866*53ee8cc1Swenshuai.xi {
1867*53ee8cc1Swenshuai.xi MS_U32 u32ESR = 0;
1868*53ee8cc1Swenshuai.xi MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8HalIdx);
1869*53ee8cc1Swenshuai.xi
1870*53ee8cc1Swenshuai.xi if (E_MVD_SLQ_TBL_MODE == curSrcMode)
1871*53ee8cc1Swenshuai.xi {
1872*53ee8cc1Swenshuai.xi u32ESR = MVD_GetSlqTblESReadPtr(u8HalIdx);
1873*53ee8cc1Swenshuai.xi }
1874*53ee8cc1Swenshuai.xi else if (E_MVD_TS_FILE_MODE == curSrcMode || E_MVD_TS_MODE == curSrcMode)
1875*53ee8cc1Swenshuai.xi {
1876*53ee8cc1Swenshuai.xi u32ESR = HAL_MVD_GetTsFileESReadPtr(u8HalIdx);
1877*53ee8cc1Swenshuai.xi }
1878*53ee8cc1Swenshuai.xi return u32ESR;
1879*53ee8cc1Swenshuai.xi }
1880*53ee8cc1Swenshuai.xi }
1881*53ee8cc1Swenshuai.xi
1882*53ee8cc1Swenshuai.xi
1883*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1884*53ee8cc1Swenshuai.xi /// Get write pointer in ElementaryStream buffer
1885*53ee8cc1Swenshuai.xi /// @return -the read pointer
1886*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetESWritePtr(MS_U32 u32Id)1887*53ee8cc1Swenshuai.xi MS_VIRT MDrv_MVD_GetESWritePtr(MS_U32 u32Id)
1888*53ee8cc1Swenshuai.xi {
1889*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1890*53ee8cc1Swenshuai.xi MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
1891*53ee8cc1Swenshuai.xi #ifdef VDEC3
1892*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
1893*53ee8cc1Swenshuai.xi
1894*53ee8cc1Swenshuai.xi if(pMVDDrvContext->u32FrameBaseMode[u8DrvIdx] == TRUE)
1895*53ee8cc1Swenshuai.xi {
1896*53ee8cc1Swenshuai.xi MS_U32 u32VBBUAddr = HAL_MVD_GetVBBUTableAddr(u8VPUIdx);
1897*53ee8cc1Swenshuai.xi MS_U32 u32Wptr = HAL_VPU_EX_GetESWritePtr(u32Id, u32VBBUAddr);
1898*53ee8cc1Swenshuai.xi return u32Wptr;
1899*53ee8cc1Swenshuai.xi }
1900*53ee8cc1Swenshuai.xi else
1901*53ee8cc1Swenshuai.xi #endif
1902*53ee8cc1Swenshuai.xi {
1903*53ee8cc1Swenshuai.xi MS_U32 u32ESW = 0;
1904*53ee8cc1Swenshuai.xi MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8HalIdx);
1905*53ee8cc1Swenshuai.xi
1906*53ee8cc1Swenshuai.xi if (E_MVD_SLQ_TBL_MODE == curSrcMode)
1907*53ee8cc1Swenshuai.xi {
1908*53ee8cc1Swenshuai.xi u32ESW = MVD_GetSlqTblESWritePtr(u8HalIdx);
1909*53ee8cc1Swenshuai.xi }
1910*53ee8cc1Swenshuai.xi else if (E_MVD_TS_FILE_MODE == curSrcMode || E_MVD_TS_MODE == curSrcMode)
1911*53ee8cc1Swenshuai.xi {
1912*53ee8cc1Swenshuai.xi u32ESW = HAL_MVD_GetTsFileESWritePtr(u8HalIdx);
1913*53ee8cc1Swenshuai.xi }
1914*53ee8cc1Swenshuai.xi return u32ESW;
1915*53ee8cc1Swenshuai.xi }
1916*53ee8cc1Swenshuai.xi }
1917*53ee8cc1Swenshuai.xi
1918*53ee8cc1Swenshuai.xi
1919*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1920*53ee8cc1Swenshuai.xi /// Enable/Disable driver to show the last frame
1921*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : enable/disable this function
1922*53ee8cc1Swenshuai.xi /// @return -return E_MVD_Result success/fail to enable/disable
1923*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_EnableLastFrameShow(MS_U32 u32Id,MS_BOOL bEnable)1924*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_EnableLastFrameShow(MS_U32 u32Id, MS_BOOL bEnable)
1925*53ee8cc1Swenshuai.xi {
1926*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1927*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1928*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1929*53ee8cc1Swenshuai.xi if (HAL_MVD_EnableLastFrameShow(u8HalIdx, bEnable) == FALSE)
1930*53ee8cc1Swenshuai.xi {
1931*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("%s fail!!\n", __FUNCTION__));
1932*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
1933*53ee8cc1Swenshuai.xi }
1934*53ee8cc1Swenshuai.xi pCtrlCfg->bEnableLastFrmShow = bEnable;
1935*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
1936*53ee8cc1Swenshuai.xi }
1937*53ee8cc1Swenshuai.xi
1938*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1939*53ee8cc1Swenshuai.xi /// Get if MVD decoder finish display.
1940*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
1941*53ee8cc1Swenshuai.xi /// - TRUE, Yes
1942*53ee8cc1Swenshuai.xi /// - FALSE, No
1943*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_IsDispFinish(MS_U32 u32Id)1944*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_IsDispFinish(MS_U32 u32Id)
1945*53ee8cc1Swenshuai.xi {
1946*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
1947*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1948*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1949*53ee8cc1Swenshuai.xi if (pCtrlCfg->bEnableLastFrmShow != TRUE)
1950*53ee8cc1Swenshuai.xi {
1951*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s: bEnableLastFrmShow!=TRUE\n", __FUNCTION__));
1952*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
1953*53ee8cc1Swenshuai.xi }
1954*53ee8cc1Swenshuai.xi return HAL_MVD_IsDispFinish(u8HalIdx);
1955*53ee8cc1Swenshuai.xi }
1956*53ee8cc1Swenshuai.xi
1957*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1958*53ee8cc1Swenshuai.xi /// Set speed.
1959*53ee8cc1Swenshuai.xi /// @param -eSpeedType \b IN : specify the speed
1960*53ee8cc1Swenshuai.xi /// @param -u8Multiple \b IN :
1961*53ee8cc1Swenshuai.xi /// @return -return E_MVD_Result success/fail to set the speed
1962*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetSpeed(MS_U32 u32Id,MVD_SpeedType eSpeedType,MS_U8 u8Multiple)1963*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetSpeed(MS_U32 u32Id, MVD_SpeedType eSpeedType, MS_U8 u8Multiple)
1964*53ee8cc1Swenshuai.xi {
1965*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
1966*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
1967*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
1968*53ee8cc1Swenshuai.xi MVD_AVSyncCfg* pstNFPSyncCfg = &(pMVDDrvContext->stNFPSyncCfg[u8DrvIdx]);
1969*53ee8cc1Swenshuai.xi
1970*53ee8cc1Swenshuai.xi if ((u8Multiple > 32) || (eSpeedType==E_MVD_SPEED_TYPE_UNKNOWN))
1971*53ee8cc1Swenshuai.xi {
1972*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s: invalid para!\n", __FUNCTION__));
1973*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
1974*53ee8cc1Swenshuai.xi }
1975*53ee8cc1Swenshuai.xi
1976*53ee8cc1Swenshuai.xi if (pstCtrlCfg->ePreSpeedType == E_MVD_SPEED_DEFAULT)
1977*53ee8cc1Swenshuai.xi { //save avsync config when normal play for restoring it later
1978*53ee8cc1Swenshuai.xi memcpy(pstNFPSyncCfg, &(pMVDDrvContext->stSyncCfg[u8DrvIdx]), sizeof(MVD_AVSyncCfg));
1979*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_SetSpeed save avsync: bEnable=0x%x u32Delay=0x%x u16Tolerance=0x%x\n",
1980*53ee8cc1Swenshuai.xi pstNFPSyncCfg->bEnable, pstNFPSyncCfg->u32Delay, pstNFPSyncCfg->u16Tolerance));
1981*53ee8cc1Swenshuai.xi }
1982*53ee8cc1Swenshuai.xi
1983*53ee8cc1Swenshuai.xi if((eSpeedType == E_MVD_SPEED_FAST && u8Multiple == 2 && pMVDDrvContext->bTrickPlay2xAVSync[u8DrvIdx] == TRUE) == FALSE && E_MVD_SPEED_DEFAULT != eSpeedType)
1984*53ee8cc1Swenshuai.xi {
1985*53ee8cc1Swenshuai.xi //disable avsyn when fast/slow forward
1986*53ee8cc1Swenshuai.xi MDrv_MVD_SetAVSync(u32Id, FALSE, 0);
1987*53ee8cc1Swenshuai.xi }
1988*53ee8cc1Swenshuai.xi
1989*53ee8cc1Swenshuai.xi if (HAL_MVD_SetSpeed(u8HalIdx, eSpeedType, u8Multiple) == TRUE)
1990*53ee8cc1Swenshuai.xi {
1991*53ee8cc1Swenshuai.xi if ((E_MVD_SPEED_DEFAULT == eSpeedType) || (eSpeedType == E_MVD_SPEED_FAST && u8Multiple == 2 && pMVDDrvContext->bTrickPlay2xAVSync[u8DrvIdx] == TRUE))
1992*53ee8cc1Swenshuai.xi {
1993*53ee8cc1Swenshuai.xi if (pstCtrlCfg->ePreSpeedType != E_MVD_SPEED_DEFAULT)
1994*53ee8cc1Swenshuai.xi {
1995*53ee8cc1Swenshuai.xi //set AVSync again for firmware doesn't remember AVSync settings after FF
1996*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_SetSpeed reset avsync: bEnable=0x%x u32Delay=0x%x u16Tolerance=0x%x\n",
1997*53ee8cc1Swenshuai.xi pstNFPSyncCfg->bEnable, pstNFPSyncCfg->u32Delay, pstNFPSyncCfg->u16Tolerance));
1998*53ee8cc1Swenshuai.xi
1999*53ee8cc1Swenshuai.xi MDrv_MVD_SetAVSync(u32Id, pstNFPSyncCfg->bEnable, pstNFPSyncCfg->u32Delay);
2000*53ee8cc1Swenshuai.xi if ((pstNFPSyncCfg->u16Tolerance!=0) &&
2001*53ee8cc1Swenshuai.xi (FALSE == MDrv_MVD_ChangeAVsync(u32Id, pstNFPSyncCfg->bEnable, pstNFPSyncCfg->u16Tolerance)))
2002*53ee8cc1Swenshuai.xi {
2003*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
2004*53ee8cc1Swenshuai.xi }
2005*53ee8cc1Swenshuai.xi }
2006*53ee8cc1Swenshuai.xi }
2007*53ee8cc1Swenshuai.xi
2008*53ee8cc1Swenshuai.xi pstCtrlCfg->ePreSpeedType = eSpeedType;
2009*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
2010*53ee8cc1Swenshuai.xi }
2011*53ee8cc1Swenshuai.xi else
2012*53ee8cc1Swenshuai.xi {
2013*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
2014*53ee8cc1Swenshuai.xi }
2015*53ee8cc1Swenshuai.xi }
2016*53ee8cc1Swenshuai.xi
2017*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2018*53ee8cc1Swenshuai.xi /// Reset Presentation Time Stamp according to u32PtsBase
2019*53ee8cc1Swenshuai.xi /// @param -u32PtsBase \b IN : the PTS base specified by user
2020*53ee8cc1Swenshuai.xi /// @return -return E_MVD_Result success/fail to reset PTS base
2021*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_ResetPTS(MS_U32 u32Id,MS_U32 u32PtsBase)2022*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_ResetPTS(MS_U32 u32Id, MS_U32 u32PtsBase)
2023*53ee8cc1Swenshuai.xi {
2024*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2025*53ee8cc1Swenshuai.xi MS_U32 u32PtsBaseIn90K = 0;
2026*53ee8cc1Swenshuai.xi u32PtsBaseIn90K = _MS_TO_90K(u32PtsBase);
2027*53ee8cc1Swenshuai.xi HAL_MVD_SetPTSBase(u8HalIdx, u32PtsBaseIn90K);
2028*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
2029*53ee8cc1Swenshuai.xi }
2030*53ee8cc1Swenshuai.xi
2031*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2032*53ee8cc1Swenshuai.xi /// Get if sequence change (width/height/framerate/interlace) occurs.
2033*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
2034*53ee8cc1Swenshuai.xi /// - TRUE, Yes
2035*53ee8cc1Swenshuai.xi /// - FALSE, No
2036*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_IsSeqChg(MS_U32 u32Id)2037*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_IsSeqChg(MS_U32 u32Id)
2038*53ee8cc1Swenshuai.xi {
2039*53ee8cc1Swenshuai.xi MVD_FrameInfo stFrmInfo;
2040*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
2041*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2042*53ee8cc1Swenshuai.xi MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8HalIdx);
2043*53ee8cc1Swenshuai.xi MVD_FrameInfo* pPreInfo = &(pMVDDrvContext->stPreFrmInfo[u8DrvIdx]);
2044*53ee8cc1Swenshuai.xi MS_BOOL bRet = FALSE;
2045*53ee8cc1Swenshuai.xi MS_BOOL bResolutionChange = FALSE;
2046*53ee8cc1Swenshuai.xi memset(&stFrmInfo, 0, sizeof(stFrmInfo));
2047*53ee8cc1Swenshuai.xi
2048*53ee8cc1Swenshuai.xi if (
2049*53ee8cc1Swenshuai.xi #ifdef MVD_ENABLE_ISR
2050*53ee8cc1Swenshuai.xi (MDrv_MVD_GetIsrEvent(u32Id) & E_MVD_EVENT_SEQ_FOUND) ||
2051*53ee8cc1Swenshuai.xi #endif
2052*53ee8cc1Swenshuai.xi (MDrv_MVD_GetDispRdy(u32Id))
2053*53ee8cc1Swenshuai.xi )
2054*53ee8cc1Swenshuai.xi {
2055*53ee8cc1Swenshuai.xi MDrv_MVD_GetFrameInfo(u32Id, &stFrmInfo);
2056*53ee8cc1Swenshuai.xi
2057*53ee8cc1Swenshuai.xi if(pMVDDrvContext->bSelf_SeqChange[u8DrvIdx]==FALSE)
2058*53ee8cc1Swenshuai.xi {
2059*53ee8cc1Swenshuai.xi if (FALSE == pstMemCfg->bEnableDynScale)
2060*53ee8cc1Swenshuai.xi {
2061*53ee8cc1Swenshuai.xi if((pPreInfo->u16HorSize != stFrmInfo.u16HorSize) ||
2062*53ee8cc1Swenshuai.xi (pPreInfo->u16VerSize != stFrmInfo.u16VerSize) ||
2063*53ee8cc1Swenshuai.xi (pPreInfo->u32FrameRate != stFrmInfo.u32FrameRate) ||
2064*53ee8cc1Swenshuai.xi (pPreInfo->u8Interlace != stFrmInfo.u8Interlace))
2065*53ee8cc1Swenshuai.xi {
2066*53ee8cc1Swenshuai.xi #if 0
2067*53ee8cc1Swenshuai.xi (MVD_PRINT( "MDrv_MVD_IsSeqChg::Previous\n" ));
2068*53ee8cc1Swenshuai.xi (MVD_PRINT( "H=%u\n", pPreInfo->u16HorSize ));
2069*53ee8cc1Swenshuai.xi (MVD_PRINT( "V=%u\n", pPreInfo->u16VerSize ));
2070*53ee8cc1Swenshuai.xi (MVD_PRINT( "F=%lu\n", pPreInfo->u32FrameRate ));
2071*53ee8cc1Swenshuai.xi (MVD_PRINT( "A=%u\n", pPreInfo->u8AspectRate ));
2072*53ee8cc1Swenshuai.xi (MVD_PRINT( "I=%u\n", pPreInfo->u8Interlace ));
2073*53ee8cc1Swenshuai.xi #endif
2074*53ee8cc1Swenshuai.xi #if 0
2075*53ee8cc1Swenshuai.xi (MVD_PRINT( "MDrv_MVD_IsSeqChg\n" ));
2076*53ee8cc1Swenshuai.xi (MVD_PRINT( "H=%u\n", stFrmInfo.u16HorSize ));
2077*53ee8cc1Swenshuai.xi (MVD_PRINT( "V=%u\n", stFrmInfo.u16VerSize ));
2078*53ee8cc1Swenshuai.xi (MVD_PRINT( "F=%lu\n", stFrmInfo.u32FrameRate ));
2079*53ee8cc1Swenshuai.xi (MVD_PRINT( "A=%u\n", stFrmInfo.u8AspectRate ));
2080*53ee8cc1Swenshuai.xi (MVD_PRINT( "I=%u\n", stFrmInfo.u8Interlace ));
2081*53ee8cc1Swenshuai.xi #endif
2082*53ee8cc1Swenshuai.xi
2083*53ee8cc1Swenshuai.xi //memcpy(&(pMVDDrvContext->stPreFrmInfo), &stFrmInfo, sizeof(MVD_FrameInfo));
2084*53ee8cc1Swenshuai.xi pPreInfo->u16HorSize = stFrmInfo.u16HorSize;
2085*53ee8cc1Swenshuai.xi pPreInfo->u16VerSize = stFrmInfo.u16VerSize;
2086*53ee8cc1Swenshuai.xi pPreInfo->u8AspectRate = stFrmInfo.u8AspectRate;
2087*53ee8cc1Swenshuai.xi pPreInfo->u32FrameRate = stFrmInfo.u32FrameRate;
2088*53ee8cc1Swenshuai.xi pPreInfo->u8Interlace = stFrmInfo.u8Interlace;
2089*53ee8cc1Swenshuai.xi #if 0
2090*53ee8cc1Swenshuai.xi (MVD_PRINT( "MDrv_MVD_IsSeqChg===>\n" ));
2091*53ee8cc1Swenshuai.xi (MVD_PRINT( "H=%u\n", stFrmInfo.u16HorSize ));
2092*53ee8cc1Swenshuai.xi (MVD_PRINT( "V=%u\n", stFrmInfo.u16VerSize ));
2093*53ee8cc1Swenshuai.xi (MVD_PRINT( "F=%u\n", stFrmInfo.u32FrameRate ));
2094*53ee8cc1Swenshuai.xi (MVD_PRINT( "A=%u\n", stFrmInfo.u8AspectRate ));
2095*53ee8cc1Swenshuai.xi (MVD_PRINT( "I=%u\n", stFrmInfo.u8Interlace ));
2096*53ee8cc1Swenshuai.xi #endif
2097*53ee8cc1Swenshuai.xi bRet = TRUE;
2098*53ee8cc1Swenshuai.xi }
2099*53ee8cc1Swenshuai.xi }
2100*53ee8cc1Swenshuai.xi else
2101*53ee8cc1Swenshuai.xi {
2102*53ee8cc1Swenshuai.xi //When dynamic scaling is enabled, f/w will handle the width/height change.
2103*53ee8cc1Swenshuai.xi //Therefore, only report SeqChg if framerate or interlace flag changes.
2104*53ee8cc1Swenshuai.xi if((pPreInfo->u32FrameRate != stFrmInfo.u32FrameRate) ||
2105*53ee8cc1Swenshuai.xi (pPreInfo->u8Interlace != stFrmInfo.u8Interlace))
2106*53ee8cc1Swenshuai.xi {
2107*53ee8cc1Swenshuai.xi pPreInfo->u8AspectRate = stFrmInfo.u8AspectRate;
2108*53ee8cc1Swenshuai.xi pPreInfo->u32FrameRate = stFrmInfo.u32FrameRate;
2109*53ee8cc1Swenshuai.xi pPreInfo->u8Interlace = stFrmInfo.u8Interlace;
2110*53ee8cc1Swenshuai.xi bRet = TRUE;
2111*53ee8cc1Swenshuai.xi }
2112*53ee8cc1Swenshuai.xi }
2113*53ee8cc1Swenshuai.xi }
2114*53ee8cc1Swenshuai.xi else
2115*53ee8cc1Swenshuai.xi {
2116*53ee8cc1Swenshuai.xi
2117*53ee8cc1Swenshuai.xi if((pPreInfo->u16HorSize != stFrmInfo.u16HorSize) ||
2118*53ee8cc1Swenshuai.xi (pPreInfo->u16VerSize != stFrmInfo.u16VerSize) ||
2119*53ee8cc1Swenshuai.xi (pPreInfo->u32FrameRate != stFrmInfo.u32FrameRate) ||
2120*53ee8cc1Swenshuai.xi (pPreInfo->u8Interlace != stFrmInfo.u8Interlace) )
2121*53ee8cc1Swenshuai.xi {
2122*53ee8cc1Swenshuai.xi pPreInfo->u16HorSize = stFrmInfo.u16HorSize;
2123*53ee8cc1Swenshuai.xi pPreInfo->u16VerSize = stFrmInfo.u16VerSize;
2124*53ee8cc1Swenshuai.xi pPreInfo->u8AspectRate = stFrmInfo.u8AspectRate;
2125*53ee8cc1Swenshuai.xi pPreInfo->u32FrameRate = stFrmInfo.u32FrameRate;
2126*53ee8cc1Swenshuai.xi pPreInfo->u8Interlace = stFrmInfo.u8Interlace;
2127*53ee8cc1Swenshuai.xi bRet = TRUE;
2128*53ee8cc1Swenshuai.xi }
2129*53ee8cc1Swenshuai.xi }
2130*53ee8cc1Swenshuai.xi }
2131*53ee8cc1Swenshuai.xi
2132*53ee8cc1Swenshuai.xi bResolutionChange = bRet;
2133*53ee8cc1Swenshuai.xi
2134*53ee8cc1Swenshuai.xi if(HAL_MVD_GetSuspendDynamicScale(u8HalIdx) == TRUE)
2135*53ee8cc1Swenshuai.xi {
2136*53ee8cc1Swenshuai.xi if(pMVDDrvContext->bSuspendDS_Ftime[u8DrvIdx] ==TRUE) //happen in first time suspend ds
2137*53ee8cc1Swenshuai.xi {
2138*53ee8cc1Swenshuai.xi pMVDDrvContext->bSuspendDS_Ftime[u8DrvIdx] = FALSE;
2139*53ee8cc1Swenshuai.xi if(pMVDDrvContext->bSelf_SeqChange[u8DrvIdx]==TRUE)
2140*53ee8cc1Swenshuai.xi {
2141*53ee8cc1Swenshuai.xi bRet = bResolutionChange;
2142*53ee8cc1Swenshuai.xi }
2143*53ee8cc1Swenshuai.xi else
2144*53ee8cc1Swenshuai.xi {
2145*53ee8cc1Swenshuai.xi bRet = TRUE;
2146*53ee8cc1Swenshuai.xi }
2147*53ee8cc1Swenshuai.xi }
2148*53ee8cc1Swenshuai.xi else
2149*53ee8cc1Swenshuai.xi {
2150*53ee8cc1Swenshuai.xi if(bResolutionChange == TRUE) //happen in suspend ds and resolution change
2151*53ee8cc1Swenshuai.xi {
2152*53ee8cc1Swenshuai.xi bRet = TRUE;
2153*53ee8cc1Swenshuai.xi }
2154*53ee8cc1Swenshuai.xi else
2155*53ee8cc1Swenshuai.xi {
2156*53ee8cc1Swenshuai.xi bRet = FALSE;
2157*53ee8cc1Swenshuai.xi }
2158*53ee8cc1Swenshuai.xi }
2159*53ee8cc1Swenshuai.xi }
2160*53ee8cc1Swenshuai.xi else //normal case
2161*53ee8cc1Swenshuai.xi {
2162*53ee8cc1Swenshuai.xi if(pMVDDrvContext->bSuspendDS_Ftime[u8DrvIdx] == FALSE)//happen in close suspend ds,it will reset bSuspendDS_Ftime flag
2163*53ee8cc1Swenshuai.xi {
2164*53ee8cc1Swenshuai.xi pMVDDrvContext->bSuspendDS_Ftime[u8DrvIdx] = TRUE;
2165*53ee8cc1Swenshuai.xi bRet = TRUE;
2166*53ee8cc1Swenshuai.xi }
2167*53ee8cc1Swenshuai.xi else
2168*53ee8cc1Swenshuai.xi {
2169*53ee8cc1Swenshuai.xi bRet = bResolutionChange;
2170*53ee8cc1Swenshuai.xi }
2171*53ee8cc1Swenshuai.xi }
2172*53ee8cc1Swenshuai.xi
2173*53ee8cc1Swenshuai.xi if (TRUE == bRet)
2174*53ee8cc1Swenshuai.xi {
2175*53ee8cc1Swenshuai.xi //Update bFrmRateSupported when IsSeqChg
2176*53ee8cc1Swenshuai.xi pMVDDrvContext->bFrmRateSupported[u8DrvIdx] = HAL_MVD_GetFrmRateIsSupported(stFrmInfo.u16HorSize, stFrmInfo.u16VerSize, stFrmInfo.u32FrameRate);
2177*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s bFrmRateSupported[0x%x]=%x\n", __FUNCTION__, u8DrvIdx, pMVDDrvContext->bFrmRateSupported[u8DrvIdx]));
2178*53ee8cc1Swenshuai.xi }
2179*53ee8cc1Swenshuai.xi
2180*53ee8cc1Swenshuai.xi return bRet;
2181*53ee8cc1Swenshuai.xi }
2182*53ee8cc1Swenshuai.xi
2183*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2184*53ee8cc1Swenshuai.xi /// Set Debug Data which will be queried by MDrv_MVD_DbgGetData()
2185*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : address of debug data
2186*53ee8cc1Swenshuai.xi /// @param -u32Data \b IN : the debug data
2187*53ee8cc1Swenshuai.xi /// @return -return E_MVD_Result success/fail to set debug data
2188*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DbgSetData(MS_U32 u32Id,MS_VIRT u32Addr,MS_U32 u32Data)2189*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_DbgSetData(MS_U32 u32Id, MS_VIRT u32Addr, MS_U32 u32Data)
2190*53ee8cc1Swenshuai.xi {
2191*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
2192*53ee8cc1Swenshuai.xi }
2193*53ee8cc1Swenshuai.xi
2194*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2195*53ee8cc1Swenshuai.xi /// Get Debug Data
2196*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : address of debug data
2197*53ee8cc1Swenshuai.xi /// @param -u32Data \b IN : pointer to the debug data
2198*53ee8cc1Swenshuai.xi /// @return -return E_MVD_Result success/fail to get debug data
2199*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DbgGetData(MS_U32 u32Id,MS_VIRT u32Addr,MS_U32 * u32Data)2200*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_DbgGetData(MS_U32 u32Id, MS_VIRT u32Addr, MS_U32* u32Data)
2201*53ee8cc1Swenshuai.xi {
2202*53ee8cc1Swenshuai.xi if (!u32Data)
2203*53ee8cc1Swenshuai.xi {
2204*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
2205*53ee8cc1Swenshuai.xi }
2206*53ee8cc1Swenshuai.xi return HAL_MVD_DbgGetData(u32Addr, u32Data);
2207*53ee8cc1Swenshuai.xi }
2208*53ee8cc1Swenshuai.xi
2209*53ee8cc1Swenshuai.xi
2210*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2211*53ee8cc1Swenshuai.xi /// Set MVD firmware command
2212*53ee8cc1Swenshuai.xi /// @param -u8cmd \b IN : MVD command
2213*53ee8cc1Swenshuai.xi /// @param -pstCmdArg \b IN : pointer to command argument
2214*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_MVDCommand(MS_U8 u8cmd,MVD_CmdArg * pstCmdArg)2215*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_MVDCommand ( MS_U8 u8cmd, MVD_CmdArg *pstCmdArg )
2216*53ee8cc1Swenshuai.xi {
2217*53ee8cc1Swenshuai.xi return HAL_MVD_MVDCommand(u8cmd, pstCmdArg);
2218*53ee8cc1Swenshuai.xi }
2219*53ee8cc1Swenshuai.xi
2220*53ee8cc1Swenshuai.xi
2221*53ee8cc1Swenshuai.xi #ifdef MVD_ENABLE_ISR
2222*53ee8cc1Swenshuai.xi ///Notice: This function only works when being called by fnHandler, which was
2223*53ee8cc1Swenshuai.xi ///registered by AP using MDrv_MVD_SetIsrEvent()
MDrv_MVD_GetIsrEvent(MS_U32 u32Id)2224*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetIsrEvent(MS_U32 u32Id)
2225*53ee8cc1Swenshuai.xi {
2226*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
2227*53ee8cc1Swenshuai.xi return pMVDDrvContext->_eCurEvent[u8DrvIdx];
2228*53ee8cc1Swenshuai.xi }
2229*53ee8cc1Swenshuai.xi
MVD_IsrProc(void)2230*53ee8cc1Swenshuai.xi void MVD_IsrProc(void)
2231*53ee8cc1Swenshuai.xi {
2232*53ee8cc1Swenshuai.xi MS_U32 u32IntStat = 0;
2233*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = 0xff;
2234*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = 0;
2235*53ee8cc1Swenshuai.xi MS_U32* pu32EventFlag;
2236*53ee8cc1Swenshuai.xi MS_U32* pu32CurEvent;
2237*53ee8cc1Swenshuai.xi MVD_InterruptCb pfnCb = NULL;
2238*53ee8cc1Swenshuai.xi MS_U32 u32CbData = MVD_U32_MAX;
2239*53ee8cc1Swenshuai.xi MS_U32 u32Id = 0;
2240*53ee8cc1Swenshuai.xi
2241*53ee8cc1Swenshuai.xi //we can attach only one ISR, so we need to check the INT is from which decoder.
2242*53ee8cc1Swenshuai.xi for (u8DrvIdx=0; u8DrvIdx<MVD_MAX_STREAMS; u8DrvIdx++)
2243*53ee8cc1Swenshuai.xi {
2244*53ee8cc1Swenshuai.xi if(MVD_GetIsUsed(u8DrvIdx) == FALSE)
2245*53ee8cc1Swenshuai.xi {
2246*53ee8cc1Swenshuai.xi continue;
2247*53ee8cc1Swenshuai.xi }
2248*53ee8cc1Swenshuai.xi
2249*53ee8cc1Swenshuai.xi pu32EventFlag = &(pMVDDrvContext->_eEventFlag[u8DrvIdx]);
2250*53ee8cc1Swenshuai.xi if (*pu32EventFlag == E_MVD_EVENT_DISABLE_ALL)
2251*53ee8cc1Swenshuai.xi {
2252*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s skip 0x%x for no registered events.\n", __FUNCTION__, u8DrvIdx));
2253*53ee8cc1Swenshuai.xi continue;
2254*53ee8cc1Swenshuai.xi }
2255*53ee8cc1Swenshuai.xi
2256*53ee8cc1Swenshuai.xi u8HalIdx = pMVDDrvContext->gMVDCtrl_EX[u8DrvIdx].u8HalIdx;
2257*53ee8cc1Swenshuai.xi
2258*53ee8cc1Swenshuai.xi if (FALSE == HAL_MVD_GetHasInt(u8HalIdx))
2259*53ee8cc1Swenshuai.xi {
2260*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s no INT for %x\n", __FUNCTION__, u8DrvIdx));
2261*53ee8cc1Swenshuai.xi continue;
2262*53ee8cc1Swenshuai.xi }
2263*53ee8cc1Swenshuai.xi
2264*53ee8cc1Swenshuai.xi pu32CurEvent = &(pMVDDrvContext->_eCurEvent[u8DrvIdx]);
2265*53ee8cc1Swenshuai.xi pfnCb = pMVDDrvContext->_pfnCallback[u8DrvIdx];
2266*53ee8cc1Swenshuai.xi u32CbData = pMVDDrvContext->_u32CallbackPara[u8DrvIdx];
2267*53ee8cc1Swenshuai.xi
2268*53ee8cc1Swenshuai.xi u32IntStat = HAL_MVD_GetIntState(u8HalIdx);
2269*53ee8cc1Swenshuai.xi
2270*53ee8cc1Swenshuai.xi u32Id = MVD_GetStreamId(u8DrvIdx);
2271*53ee8cc1Swenshuai.xi
2272*53ee8cc1Swenshuai.xi if (u32IntStat != 0)
2273*53ee8cc1Swenshuai.xi {
2274*53ee8cc1Swenshuai.xi //MVD_DEBUGINFO(MVD_PRINT("MVD_IsrProc u32IntStat=%lx\n", u32IntStat));
2275*53ee8cc1Swenshuai.xi *pu32CurEvent = E_MVD_EVENT_DISABLE_ALL;
2276*53ee8cc1Swenshuai.xi
2277*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_USER_DATA) == E_MVD_EVENT_USER_DATA)
2278*53ee8cc1Swenshuai.xi {
2279*53ee8cc1Swenshuai.xi if (MVD_IntHasUsrData(u32IntStat))
2280*53ee8cc1Swenshuai.xi {
2281*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_USER_DATA;
2282*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> UsrData!!!\n"));
2283*53ee8cc1Swenshuai.xi }
2284*53ee8cc1Swenshuai.xi }
2285*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_USER_DATA_DISP) == E_MVD_EVENT_USER_DATA_DISP)
2286*53ee8cc1Swenshuai.xi {
2287*53ee8cc1Swenshuai.xi if (MVD_IntHasUsrDataDisp(u32IntStat))
2288*53ee8cc1Swenshuai.xi {
2289*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_USER_DATA_DISP;
2290*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> DispUsrData!!!\n"));
2291*53ee8cc1Swenshuai.xi }
2292*53ee8cc1Swenshuai.xi }
2293*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_DISP_RDY) == E_MVD_EVENT_DISP_RDY)
2294*53ee8cc1Swenshuai.xi {
2295*53ee8cc1Swenshuai.xi if (MVD_IntIsDispRdy(u32IntStat))
2296*53ee8cc1Swenshuai.xi {
2297*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_DISP_RDY;
2298*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> DispRdy!!!\n"));
2299*53ee8cc1Swenshuai.xi }
2300*53ee8cc1Swenshuai.xi }
2301*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_SEQ_FOUND) == E_MVD_EVENT_SEQ_FOUND)
2302*53ee8cc1Swenshuai.xi {
2303*53ee8cc1Swenshuai.xi if (MVD_IntHasSeqHdr(u32IntStat))
2304*53ee8cc1Swenshuai.xi {
2305*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_SEQ_FOUND;
2306*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> SeqHdrFound!!!\n"));
2307*53ee8cc1Swenshuai.xi }
2308*53ee8cc1Swenshuai.xi }
2309*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_FIRST_FRAME) == E_MVD_EVENT_FIRST_FRAME)
2310*53ee8cc1Swenshuai.xi {
2311*53ee8cc1Swenshuai.xi if (MVD_IntHas1stFrame(u32IntStat))
2312*53ee8cc1Swenshuai.xi {
2313*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_FIRST_FRAME;
2314*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> 1stFrame!!!\n"));
2315*53ee8cc1Swenshuai.xi }
2316*53ee8cc1Swenshuai.xi }
2317*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_XC_LOW_DEALY) == E_MVD_EVENT_XC_LOW_DEALY)
2318*53ee8cc1Swenshuai.xi {
2319*53ee8cc1Swenshuai.xi if (MVD_IntHasXcLowDelay(u32IntStat))
2320*53ee8cc1Swenshuai.xi {
2321*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_XC_LOW_DEALY;
2322*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> E_MVD_EVENT_XC_LOW_DEALY!!!\n"));
2323*53ee8cc1Swenshuai.xi }
2324*53ee8cc1Swenshuai.xi }
2325*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_DEC_I) == E_MVD_EVENT_DEC_I)
2326*53ee8cc1Swenshuai.xi {
2327*53ee8cc1Swenshuai.xi if (MVD_IntHasDecodeIframe(u32IntStat))
2328*53ee8cc1Swenshuai.xi {
2329*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_DEC_I;
2330*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> E_MVD_EVENT_DEC_I!!!\n"));
2331*53ee8cc1Swenshuai.xi }
2332*53ee8cc1Swenshuai.xi }
2333*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_DISP_VSYNC) == E_MVD_EVENT_DISP_VSYNC)
2334*53ee8cc1Swenshuai.xi {
2335*53ee8cc1Swenshuai.xi if (MVD_IntVSyncInt(u32IntStat))
2336*53ee8cc1Swenshuai.xi {
2337*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_DISP_VSYNC;
2338*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> VSyncInt!!!\n"));
2339*53ee8cc1Swenshuai.xi }
2340*53ee8cc1Swenshuai.xi }
2341*53ee8cc1Swenshuai.xi
2342*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_DEC_ONE_FRAME) == E_MVD_EVENT_DEC_ONE_FRAME)
2343*53ee8cc1Swenshuai.xi {
2344*53ee8cc1Swenshuai.xi if (MVD_IntDecOneFrmInt(u32IntStat))
2345*53ee8cc1Swenshuai.xi {
2346*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_DEC_ONE_FRAME;
2347*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> DecOneFrameInt!!!\n"));
2348*53ee8cc1Swenshuai.xi }
2349*53ee8cc1Swenshuai.xi }
2350*53ee8cc1Swenshuai.xi
2351*53ee8cc1Swenshuai.xi
2352*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_UNMUTE) == E_MVD_EVENT_UNMUTE)
2353*53ee8cc1Swenshuai.xi {
2354*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("E_MVD_EVENT_UNMUTE...\n"));
2355*53ee8cc1Swenshuai.xi if (MVD_IntVSyncInt(u32IntStat))
2356*53ee8cc1Swenshuai.xi {
2357*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> UNMUTE?!\n"));
2358*53ee8cc1Swenshuai.xi if (HAL_MVD_GetIsIPicFound(u8HalIdx) != NULL)
2359*53ee8cc1Swenshuai.xi {
2360*53ee8cc1Swenshuai.xi (pMVDDrvContext->u32VSyncCnt[u8DrvIdx])++;
2361*53ee8cc1Swenshuai.xi if ((HAL_MVD_GetIsSyncReach(u8HalIdx)==1) ||
2362*53ee8cc1Swenshuai.xi (pMVDDrvContext->u32VSyncCnt[u8DrvIdx] > 60) ||
2363*53ee8cc1Swenshuai.xi (HAL_MVD_GetIsAVSyncOn(u8HalIdx) == FALSE))
2364*53ee8cc1Swenshuai.xi {
2365*53ee8cc1Swenshuai.xi pMVDDrvContext->u32VSyncCnt[u8DrvIdx] = 0;
2366*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_UNMUTE;
2367*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("UnMute!!!\n"));
2368*53ee8cc1Swenshuai.xi *pu32EventFlag &= (~E_MVD_EVENT_UNMUTE);
2369*53ee8cc1Swenshuai.xi HAL_MVD_EnableInt(u8HalIdx, *pu32EventFlag);
2370*53ee8cc1Swenshuai.xi }
2371*53ee8cc1Swenshuai.xi }
2372*53ee8cc1Swenshuai.xi else // for P/B frame only stream
2373*53ee8cc1Swenshuai.xi {
2374*53ee8cc1Swenshuai.xi if (HAL_MVD_GetIsSyncReach(u8HalIdx) == 1) //sync done
2375*53ee8cc1Swenshuai.xi {
2376*53ee8cc1Swenshuai.xi (pMVDDrvContext->u32SyncDoneCnt[u8DrvIdx])++;
2377*53ee8cc1Swenshuai.xi }
2378*53ee8cc1Swenshuai.xi
2379*53ee8cc1Swenshuai.xi if (pMVDDrvContext->u32SyncDoneCnt[u8DrvIdx] > PB_ONLY_UNMUTE_VSYNC_COUNT) //sync done
2380*53ee8cc1Swenshuai.xi {
2381*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("UnMute after %d vsync!!!\n", PB_ONLY_UNMUTE_VSYNC_COUNT));
2382*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_UNMUTE;
2383*53ee8cc1Swenshuai.xi *pu32EventFlag &= (~E_MVD_EVENT_UNMUTE);
2384*53ee8cc1Swenshuai.xi HAL_MVD_EnableInt(u8HalIdx, *pu32EventFlag);
2385*53ee8cc1Swenshuai.xi pMVDDrvContext->u32SyncDoneCnt[u8DrvIdx] = 0;
2386*53ee8cc1Swenshuai.xi }
2387*53ee8cc1Swenshuai.xi }
2388*53ee8cc1Swenshuai.xi }
2389*53ee8cc1Swenshuai.xi }
2390*53ee8cc1Swenshuai.xi
2391*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_DEC_ERR) == E_MVD_EVENT_DEC_ERR)
2392*53ee8cc1Swenshuai.xi {
2393*53ee8cc1Swenshuai.xi if (MVD_IntHasDecodeErr(u32IntStat))
2394*53ee8cc1Swenshuai.xi {
2395*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_DEC_ERR;
2396*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> Decode error!!!\n"));
2397*53ee8cc1Swenshuai.xi }
2398*53ee8cc1Swenshuai.xi }
2399*53ee8cc1Swenshuai.xi
2400*53ee8cc1Swenshuai.xi if ((*pu32EventFlag & E_MVD_EVENT_DEC_DATA_ERR) == E_MVD_EVENT_DEC_DATA_ERR)
2401*53ee8cc1Swenshuai.xi {
2402*53ee8cc1Swenshuai.xi if (MVD_IntHasESDataInvalid(u32IntStat))
2403*53ee8cc1Swenshuai.xi {
2404*53ee8cc1Swenshuai.xi *pu32CurEvent |= E_MVD_EVENT_DEC_DATA_ERR;
2405*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("===> ES data invaild!!!\n"));
2406*53ee8cc1Swenshuai.xi }
2407*53ee8cc1Swenshuai.xi }
2408*53ee8cc1Swenshuai.xi
2409*53ee8cc1Swenshuai.xi //Events that user registered occurred, call user's callback function
2410*53ee8cc1Swenshuai.xi if ((*pu32CurEvent!=E_MVD_EVENT_DISABLE_ALL) && (pfnCb!=NULL))
2411*53ee8cc1Swenshuai.xi {
2412*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s Callback for *pu32CurEvent=0x%x, cbData=0x%x\n",
2413*53ee8cc1Swenshuai.xi __FUNCTION__, *pu32CurEvent, u32CbData));
2414*53ee8cc1Swenshuai.xi #ifdef VDEC3
2415*53ee8cc1Swenshuai.xi pfnCb(u32Id);
2416*53ee8cc1Swenshuai.xi #else
2417*53ee8cc1Swenshuai.xi pfnCb(u32CbData);
2418*53ee8cc1Swenshuai.xi #endif
2419*53ee8cc1Swenshuai.xi }
2420*53ee8cc1Swenshuai.xi }
2421*53ee8cc1Swenshuai.xi
2422*53ee8cc1Swenshuai.xi //clear events
2423*53ee8cc1Swenshuai.xi *pu32CurEvent = E_MVD_EVENT_DISABLE_ALL;
2424*53ee8cc1Swenshuai.xi }
2425*53ee8cc1Swenshuai.xi
2426*53ee8cc1Swenshuai.xi HAL_MVD_ClearIRQ(); //clear interrupt
2427*53ee8cc1Swenshuai.xi if(TRUE == OSAL_MVD_IntEnable())//enable cpu interrupt mask
2428*53ee8cc1Swenshuai.xi {
2429*53ee8cc1Swenshuai.xi _bDisableFlag = FALSE;
2430*53ee8cc1Swenshuai.xi }
2431*53ee8cc1Swenshuai.xi }
2432*53ee8cc1Swenshuai.xi
2433*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2434*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetISREvent()
2435*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the ISR event type sended by HVD fw.
2436*53ee8cc1Swenshuai.xi /// @param -eEvent \b IN : event types
2437*53ee8cc1Swenshuai.xi /// @param -fnISRHandler \b IN : function pointer to a interrupt handler.
2438*53ee8cc1Swenshuai.xi /// @return -The result of command set ISR event.
2439*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_SetIsrEvent(MS_U32 u32Id,MS_U32 eEvent,MVD_InterruptCb fnHandler)2440*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetIsrEvent(MS_U32 u32Id, MS_U32 eEvent, MVD_InterruptCb fnHandler)
2441*53ee8cc1Swenshuai.xi {
2442*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
2443*53ee8cc1Swenshuai.xi
2444*53ee8cc1Swenshuai.xi if (FALSE == MVD_GetIsUsed(u8DrvIdx))
2445*53ee8cc1Swenshuai.xi {
2446*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("Call %s before Init\n", __FUNCTION__));
2447*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
2448*53ee8cc1Swenshuai.xi }
2449*53ee8cc1Swenshuai.xi
2450*53ee8cc1Swenshuai.xi if (eEvent == E_MVD_EVENT_DISABLE_ALL)
2451*53ee8cc1Swenshuai.xi {
2452*53ee8cc1Swenshuai.xi MS_U32 i = 0;
2453*53ee8cc1Swenshuai.xi MS_BOOL bUsed = FALSE;
2454*53ee8cc1Swenshuai.xi for(i = 0; i < MVD_MAX_STREAMS; i++)
2455*53ee8cc1Swenshuai.xi {
2456*53ee8cc1Swenshuai.xi if((i != u8DrvIdx)
2457*53ee8cc1Swenshuai.xi && (TRUE == pMVDDrvContext->gMVDCtrl_EX[i].bUsed))
2458*53ee8cc1Swenshuai.xi {
2459*53ee8cc1Swenshuai.xi bUsed = TRUE;
2460*53ee8cc1Swenshuai.xi break;
2461*53ee8cc1Swenshuai.xi }
2462*53ee8cc1Swenshuai.xi }
2463*53ee8cc1Swenshuai.xi // Fix the ISR imbalance of Enable and Disable
2464*53ee8cc1Swenshuai.xi // this is the rootcase of MVD ISR fail.
2465*53ee8cc1Swenshuai.xi if((_bDisableFlag != TRUE) && (FALSE == bUsed))
2466*53ee8cc1Swenshuai.xi {
2467*53ee8cc1Swenshuai.xi _bDisableFlag = OSAL_MVD_IntDisable();
2468*53ee8cc1Swenshuai.xi if(_bDisableFlag == FALSE)
2469*53ee8cc1Swenshuai.xi {
2470*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(VPRINTF("%s Disable Interrupt Fail\n", __FUNCTION__));
2471*53ee8cc1Swenshuai.xi }
2472*53ee8cc1Swenshuai.xi #if !defined(SUPPORT_X_MODEL_FEATURE) && !defined(DISABLE_ISR_DETACH)
2473*53ee8cc1Swenshuai.xi if(TRUE == bMVDIsrAttached)
2474*53ee8cc1Swenshuai.xi {
2475*53ee8cc1Swenshuai.xi OSAL_MVD_IsrDetach();
2476*53ee8cc1Swenshuai.xi bMVDIsrAttached = FALSE;
2477*53ee8cc1Swenshuai.xi }
2478*53ee8cc1Swenshuai.xi #endif
2479*53ee8cc1Swenshuai.xi }
2480*53ee8cc1Swenshuai.xi pMVDDrvContext->_pfnCallback[u8DrvIdx] = NULL;
2481*53ee8cc1Swenshuai.xi pMVDDrvContext->_u32CallbackPara[u8DrvIdx] = MVD_U32_MAX;
2482*53ee8cc1Swenshuai.xi pMVDDrvContext->_eEventFlag[u8DrvIdx] = E_MVD_EVENT_DISABLE_ALL;
2483*53ee8cc1Swenshuai.xi }
2484*53ee8cc1Swenshuai.xi else
2485*53ee8cc1Swenshuai.xi {
2486*53ee8cc1Swenshuai.xi if(fnHandler != NULL)
2487*53ee8cc1Swenshuai.xi {
2488*53ee8cc1Swenshuai.xi //disable int & dettach isr?
2489*53ee8cc1Swenshuai.xi
2490*53ee8cc1Swenshuai.xi pMVDDrvContext->_pfnCallback[u8DrvIdx] = (MVD_InterruptCb)fnHandler;
2491*53ee8cc1Swenshuai.xi pMVDDrvContext->_u32CallbackPara[u8DrvIdx] = u32Id;
2492*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s Hook callback u32Id=0x%x u8HalIdx=0x%x eEvent=0x%x\n",
2493*53ee8cc1Swenshuai.xi __FUNCTION__, u32Id, u8DrvIdx, eEvent));
2494*53ee8cc1Swenshuai.xi pMVDDrvContext->_eEventFlag[u8DrvIdx] = eEvent;
2495*53ee8cc1Swenshuai.xi
2496*53ee8cc1Swenshuai.xi #if !defined(SUPPORT_X_MODEL_FEATURE) && !defined(DISABLE_ISR_DETACH)
2497*53ee8cc1Swenshuai.xi if (FALSE == bMVDIsrAttached)
2498*53ee8cc1Swenshuai.xi {
2499*53ee8cc1Swenshuai.xi if (OSAL_MVD_IsrAttach((void*)MVD_IsrProc) != TRUE)
2500*53ee8cc1Swenshuai.xi {
2501*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("fail to attach MVD_IsrProc!\n"));
2502*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
2503*53ee8cc1Swenshuai.xi }
2504*53ee8cc1Swenshuai.xi bMVDIsrAttached = TRUE;
2505*53ee8cc1Swenshuai.xi if (OSAL_MVD_IntEnable() != TRUE)
2506*53ee8cc1Swenshuai.xi {
2507*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("fail to OSAL_MVD_IntEnable!\n"));
2508*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
2509*53ee8cc1Swenshuai.xi }
2510*53ee8cc1Swenshuai.xi _bDisableFlag = FALSE;
2511*53ee8cc1Swenshuai.xi }
2512*53ee8cc1Swenshuai.xi #else
2513*53ee8cc1Swenshuai.xi if (FALSE == bMVDIsrAttached)
2514*53ee8cc1Swenshuai.xi {
2515*53ee8cc1Swenshuai.xi if (OSAL_MVD_IsrAttach((void*)MVD_IsrProc) != TRUE)
2516*53ee8cc1Swenshuai.xi {
2517*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("fail to attach MVD_IsrProc!\n"));
2518*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
2519*53ee8cc1Swenshuai.xi }
2520*53ee8cc1Swenshuai.xi bMVDIsrAttached = TRUE;
2521*53ee8cc1Swenshuai.xi }
2522*53ee8cc1Swenshuai.xi
2523*53ee8cc1Swenshuai.xi if (OSAL_MVD_IntEnable() != TRUE)
2524*53ee8cc1Swenshuai.xi {
2525*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("fail to OSAL_MVD_IntEnable!\n"));
2526*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
2527*53ee8cc1Swenshuai.xi }
2528*53ee8cc1Swenshuai.xi _bDisableFlag = FALSE;
2529*53ee8cc1Swenshuai.xi #endif
2530*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_SetIsrEvent eEventFlag=0x%x\n", pMVDDrvContext->_eEventFlag[u8DrvIdx]));
2531*53ee8cc1Swenshuai.xi MDrv_MVD_EnableInt(u32Id, pMVDDrvContext->_eEventFlag[u8DrvIdx]);
2532*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("attach ISR number:%d\n" , E_INT_IRQ_MVD));
2533*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
2534*53ee8cc1Swenshuai.xi }
2535*53ee8cc1Swenshuai.xi else
2536*53ee8cc1Swenshuai.xi {
2537*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR( "SetISREvent with NULL pointer. ISR type:%u\n", (MS_U32)eEvent));
2538*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
2539*53ee8cc1Swenshuai.xi }
2540*53ee8cc1Swenshuai.xi }
2541*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
2542*53ee8cc1Swenshuai.xi }
2543*53ee8cc1Swenshuai.xi
2544*53ee8cc1Swenshuai.xi #endif //MVD_ENABLE_ISR
2545*53ee8cc1Swenshuai.xi
2546*53ee8cc1Swenshuai.xi
2547*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2548*53ee8cc1Swenshuai.xi /// Set AVSync mode for file mode.
2549*53ee8cc1Swenshuai.xi /// @param -eSyncMode: avsync mode for file mode
2550*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetFileModeAVSync(MS_U32 u32Id,MVD_TIMESTAMP_TYPE eSyncMode)2551*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetFileModeAVSync(MS_U32 u32Id, MVD_TIMESTAMP_TYPE eSyncMode)
2552*53ee8cc1Swenshuai.xi {
2553*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2554*53ee8cc1Swenshuai.xi return HAL_MVD_SetFileModeAVSync(u8HalIdx, eSyncMode);
2555*53ee8cc1Swenshuai.xi }
2556*53ee8cc1Swenshuai.xi
2557*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2558*53ee8cc1Swenshuai.xi /// @brief Check if all of the buffers(display, decoded, bitstream) are empty.
2559*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
2560*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): Not Empty.
2561*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): Empty.
2562*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_IsAllBufferEmpty(MS_U32 u32Id)2563*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_IsAllBufferEmpty(MS_U32 u32Id)
2564*53ee8cc1Swenshuai.xi {
2565*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2566*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s stat=0x%x, cmd=0x%x\n", __FUNCTION__,
2567*53ee8cc1Swenshuai.xi MDrv_MVD_GetDecodeStatus(u32Id), MDrv_MVD_GetLastCmd(u32Id)));
2568*53ee8cc1Swenshuai.xi return HAL_MVD_IsAllBufferEmpty(u8HalIdx);
2569*53ee8cc1Swenshuai.xi }
2570*53ee8cc1Swenshuai.xi
2571*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2572*53ee8cc1Swenshuai.xi /// @brief Generate specific pattern to support some special function.
2573*53ee8cc1Swenshuai.xi /// @param -u32VAddr \b IN : the virtual address of specific pattern
2574*53ee8cc1Swenshuai.xi /// @param -u32Size \b IN, OUT :
2575*53ee8cc1Swenshuai.xi /// IN: the input array size.
2576*53ee8cc1Swenshuai.xi /// OUT: the used array size.
2577*53ee8cc1Swenshuai.xi /// @return -The result of command generate specific pattern
2578*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_GenPattern(MS_U32 u32Id,MVD_PatternType ePattern,MS_PHY u32PAddr,MS_U32 * pu32Size)2579*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GenPattern(MS_U32 u32Id, MVD_PatternType ePattern, MS_PHY u32PAddr, MS_U32* pu32Size)
2580*53ee8cc1Swenshuai.xi {
2581*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2582*53ee8cc1Swenshuai.xi if (!pu32Size)
2583*53ee8cc1Swenshuai.xi {
2584*53ee8cc1Swenshuai.xi return FALSE;
2585*53ee8cc1Swenshuai.xi }
2586*53ee8cc1Swenshuai.xi return HAL_MVD_GenPattern(u8HalIdx, ePattern, u32PAddr, pu32Size);
2587*53ee8cc1Swenshuai.xi }
2588*53ee8cc1Swenshuai.xi
2589*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2590*53ee8cc1Swenshuai.xi /// @brief Get driver specific data information
2591*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
2592*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_GetPatternInfo(void)2593*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetPatternInfo(void)
2594*53ee8cc1Swenshuai.xi {
2595*53ee8cc1Swenshuai.xi return MVD_U32_MAX;
2596*53ee8cc1Swenshuai.xi }
2597*53ee8cc1Swenshuai.xi
2598*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2599*53ee8cc1Swenshuai.xi /// @brief Pass scalar parameters to f/w
2600*53ee8cc1Swenshuai.xi /// @return -The result of command.
2601*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_SetDynScalingParam(MS_U32 u32Id,MS_PHY u32StAddr,MS_SIZE u32Size)2602*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetDynScalingParam(MS_U32 u32Id, MS_PHY u32StAddr, MS_SIZE u32Size)
2603*53ee8cc1Swenshuai.xi {
2604*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2605*53ee8cc1Swenshuai.xi if ((u32StAddr==NULL) || (u32Size==0))
2606*53ee8cc1Swenshuai.xi {
2607*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("%s invalid para u32StAddr=0x%lx, u32Size=0x%lx\n",
2608*53ee8cc1Swenshuai.xi __FUNCTION__, (unsigned long)u32StAddr, (unsigned long)u32Size));
2609*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
2610*53ee8cc1Swenshuai.xi }
2611*53ee8cc1Swenshuai.xi return HAL_MVD_SetDynScalingParam(u8HalIdx, u32StAddr, u32Size);
2612*53ee8cc1Swenshuai.xi }
2613*53ee8cc1Swenshuai.xi
2614*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2615*53ee8cc1Swenshuai.xi /// Set virtual box width/height to F/W.
2616*53ee8cc1Swenshuai.xi /// F/W will use the same w/h as scaler to calculate scaling factor.
2617*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2618*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetVirtualBox(MS_U32 u32Id,MS_U16 u16Width,MS_U16 u16Height)2619*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetVirtualBox(MS_U32 u32Id, MS_U16 u16Width, MS_U16 u16Height)
2620*53ee8cc1Swenshuai.xi {
2621*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2622*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s: w=0x%x h=0x%x\n", __FUNCTION__, u16Width, u16Height));
2623*53ee8cc1Swenshuai.xi return HAL_MVD_SetVirtualBox(u8HalIdx, u16Width, u16Height);
2624*53ee8cc1Swenshuai.xi }
2625*53ee8cc1Swenshuai.xi
2626*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2627*53ee8cc1Swenshuai.xi /// Set blue screen
2628*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2629*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetBlueScreen(MS_U32 u32Id,MS_BOOL bEn)2630*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetBlueScreen(MS_U32 u32Id, MS_BOOL bEn)
2631*53ee8cc1Swenshuai.xi {
2632*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2633*53ee8cc1Swenshuai.xi return HAL_MVD_SetBlueScreen(u8HalIdx, bEn);
2634*53ee8cc1Swenshuai.xi }
2635*53ee8cc1Swenshuai.xi
MDrv_MVD_TrickPlay2xAVSync(MS_U32 u32Id,MS_BOOL bEnable)2636*53ee8cc1Swenshuai.xi void MDrv_MVD_TrickPlay2xAVSync(MS_U32 u32Id,MS_BOOL bEnable)
2637*53ee8cc1Swenshuai.xi {
2638*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
2639*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2640*53ee8cc1Swenshuai.xi pMVDDrvContext->bTrickPlay2xAVSync[u8DrvIdx] = bEnable;
2641*53ee8cc1Swenshuai.xi return HAL_MVD_TrickPlay2xAVSync(u8HalIdx,bEnable);
2642*53ee8cc1Swenshuai.xi }
2643*53ee8cc1Swenshuai.xi
2644*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2645*53ee8cc1Swenshuai.xi /// Set FRC Only Show TopField
2646*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2647*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_FRC_OnlyShowTopField(MS_U32 u32Id,MS_BOOL bEnable)2648*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_FRC_OnlyShowTopField(MS_U32 u32Id, MS_BOOL bEnable)
2649*53ee8cc1Swenshuai.xi {
2650*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2651*53ee8cc1Swenshuai.xi return HAL_MVD_FRC_OnlyShowTopField(u8HalIdx, bEnable);
2652*53ee8cc1Swenshuai.xi }
2653*53ee8cc1Swenshuai.xi
2654*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2655*53ee8cc1Swenshuai.xi /// Enable/Disable VSync interrupt
2656*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2657*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_EnableInt(MS_U32 u32Id,MS_U32 bEn)2658*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_EnableInt(MS_U32 u32Id, MS_U32 bEn)
2659*53ee8cc1Swenshuai.xi {
2660*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2661*53ee8cc1Swenshuai.xi return HAL_MVD_EnableInt(u8HalIdx, bEn);
2662*53ee8cc1Swenshuai.xi }
2663*53ee8cc1Swenshuai.xi
2664*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2665*53ee8cc1Swenshuai.xi /// Enable FW only show one field.
2666*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2667*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_EnableDispOneField(MS_U32 u32Id,MS_BOOL bEn)2668*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_EnableDispOneField(MS_U32 u32Id, MS_BOOL bEn)
2669*53ee8cc1Swenshuai.xi {
2670*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
2671*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2672*53ee8cc1Swenshuai.xi return HAL_MVD_EnableDispOneField(u8HalIdx, bEn);
2673*53ee8cc1Swenshuai.xi }
2674*53ee8cc1Swenshuai.xi
2675*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2676*53ee8cc1Swenshuai.xi /// Get extension info of the display .
2677*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2678*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetExtDispInfo(MS_U32 u32Id,MVD_ExtDispInfo * pInfo)2679*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_GetExtDispInfo(MS_U32 u32Id, MVD_ExtDispInfo* pInfo)
2680*53ee8cc1Swenshuai.xi {
2681*53ee8cc1Swenshuai.xi E_MVD_Result eRet = E_MVD_RET_OK;
2682*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2683*53ee8cc1Swenshuai.xi if (NULL == pInfo)
2684*53ee8cc1Swenshuai.xi {
2685*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("GetExtDispInfo NULL pInfo!\n"));
2686*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
2687*53ee8cc1Swenshuai.xi }
2688*53ee8cc1Swenshuai.xi
2689*53ee8cc1Swenshuai.xi HAL_MVD_GetExtDispInfo(u8HalIdx, pInfo);
2690*53ee8cc1Swenshuai.xi return eRet;
2691*53ee8cc1Swenshuai.xi }
2692*53ee8cc1Swenshuai.xi
2693*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2694*53ee8cc1Swenshuai.xi /// Get info of the decoded/displaying frame.
2695*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2696*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetFrmInfo(MS_U32 u32Id,MVD_FrmInfoType eType,MVD_FrmInfo * pInfo)2697*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_GetFrmInfo(MS_U32 u32Id, MVD_FrmInfoType eType, MVD_FrmInfo* pInfo)
2698*53ee8cc1Swenshuai.xi {
2699*53ee8cc1Swenshuai.xi E_MVD_Result eRet = E_MVD_RET_OK;
2700*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2701*53ee8cc1Swenshuai.xi if (NULL == pInfo)
2702*53ee8cc1Swenshuai.xi {
2703*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("GetFrmInfo NULL pInfo!\n"));
2704*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
2705*53ee8cc1Swenshuai.xi }
2706*53ee8cc1Swenshuai.xi eRet = HAL_MVD_GetFrmInfo(u8HalIdx, eType, pInfo);
2707*53ee8cc1Swenshuai.xi //MVD_DumpFrmInfo(pInfo);
2708*53ee8cc1Swenshuai.xi return eRet;
2709*53ee8cc1Swenshuai.xi }
2710*53ee8cc1Swenshuai.xi
2711*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2712*53ee8cc1Swenshuai.xi /// Get Color info of the decoded/displaying frame.
2713*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2714*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetColorInfo(MS_U32 u32Id,MVD_Color_Info * pstColorInfo)2715*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetColorInfo(MS_U32 u32Id, MVD_Color_Info* pstColorInfo)
2716*53ee8cc1Swenshuai.xi {
2717*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2718*53ee8cc1Swenshuai.xi if (NULL == pstColorInfo)
2719*53ee8cc1Swenshuai.xi {
2720*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("GetColorInfo NULL pInfo!\n"));
2721*53ee8cc1Swenshuai.xi return FALSE;
2722*53ee8cc1Swenshuai.xi }
2723*53ee8cc1Swenshuai.xi return HAL_MVD_GetColorInfo(u8HalIdx, pstColorInfo);
2724*53ee8cc1Swenshuai.xi }
2725*53ee8cc1Swenshuai.xi
2726*53ee8cc1Swenshuai.xi
2727*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2728*53ee8cc1Swenshuai.xi /// Get time_code of the decoded/displaying frame.
2729*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2730*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetTimeCode(MS_U32 u32Id,MVD_FrmInfoType eType,MVD_TimeCode * pInfo)2731*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_GetTimeCode(MS_U32 u32Id, MVD_FrmInfoType eType, MVD_TimeCode* pInfo)
2732*53ee8cc1Swenshuai.xi {
2733*53ee8cc1Swenshuai.xi E_MVD_Result eRet = E_MVD_RET_OK;
2734*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2735*53ee8cc1Swenshuai.xi if (NULL == pInfo)
2736*53ee8cc1Swenshuai.xi {
2737*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
2738*53ee8cc1Swenshuai.xi }
2739*53ee8cc1Swenshuai.xi
2740*53ee8cc1Swenshuai.xi if (TRUE != HAL_MVD_GetTimeCode(u8HalIdx, eType, pInfo))
2741*53ee8cc1Swenshuai.xi {
2742*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("MDrv_MVD_GetTimeCode fail\n"));
2743*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
2744*53ee8cc1Swenshuai.xi }
2745*53ee8cc1Swenshuai.xi
2746*53ee8cc1Swenshuai.xi if ((E_MVD_FRMINFO_DECODE != eType) || (E_MVD_FRMINFO_DISPLAY == eType))
2747*53ee8cc1Swenshuai.xi {
2748*53ee8cc1Swenshuai.xi eRet = E_MVD_RET_INVALID_PARAM;
2749*53ee8cc1Swenshuai.xi }
2750*53ee8cc1Swenshuai.xi
2751*53ee8cc1Swenshuai.xi return eRet;
2752*53ee8cc1Swenshuai.xi }
2753*53ee8cc1Swenshuai.xi
MDrv_MVD_GetUsrDataIsAvailable(MS_U32 u32Id)2754*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetUsrDataIsAvailable(MS_U32 u32Id)
2755*53ee8cc1Swenshuai.xi {
2756*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2757*53ee8cc1Swenshuai.xi return HAL_MVD_GetUsrDataIsAvailable(u8HalIdx);
2758*53ee8cc1Swenshuai.xi }
2759*53ee8cc1Swenshuai.xi
2760*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2761*53ee8cc1Swenshuai.xi /// Get info of user data
2762*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetUsrDataInfo(MS_U32 u32Id,MVD_UsrDataInfo * pUsrInfo)2763*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetUsrDataInfo(MS_U32 u32Id, MVD_UsrDataInfo* pUsrInfo)
2764*53ee8cc1Swenshuai.xi {
2765*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2766*53ee8cc1Swenshuai.xi if (!pUsrInfo)
2767*53ee8cc1Swenshuai.xi {
2768*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("%s: NULL ptr.\n", __FUNCTION__));
2769*53ee8cc1Swenshuai.xi return FALSE;
2770*53ee8cc1Swenshuai.xi }
2771*53ee8cc1Swenshuai.xi return HAL_MVD_GetUsrDataInfo(u8HalIdx, pUsrInfo);
2772*53ee8cc1Swenshuai.xi }
2773*53ee8cc1Swenshuai.xi
2774*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2775*53ee8cc1Swenshuai.xi /// Enable/Disable freezing display
2776*53ee8cc1Swenshuai.xi /// Once this flag is set, firmware continue decode new frame
2777*53ee8cc1Swenshuai.xi /// but not to push this frame into display queue.
2778*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2779*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetFreezeDisp(MS_U32 u32Id,MS_BOOL bEn)2780*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetFreezeDisp(MS_U32 u32Id, MS_BOOL bEn)
2781*53ee8cc1Swenshuai.xi {
2782*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2783*53ee8cc1Swenshuai.xi
2784*53ee8cc1Swenshuai.xi MDrv_MVD_SetSpeed(u32Id, E_MVD_SPEED_DEFAULT, 1);
2785*53ee8cc1Swenshuai.xi if (TRUE == HAL_MVD_SetFreezeDisp(u8HalIdx, bEn))
2786*53ee8cc1Swenshuai.xi {
2787*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
2788*53ee8cc1Swenshuai.xi }
2789*53ee8cc1Swenshuai.xi else
2790*53ee8cc1Swenshuai.xi {
2791*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
2792*53ee8cc1Swenshuai.xi }
2793*53ee8cc1Swenshuai.xi }
2794*53ee8cc1Swenshuai.xi
2795*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2796*53ee8cc1Swenshuai.xi /// Get MVD displayed picture counter
2797*53ee8cc1Swenshuai.xi /// @return - displayed picture counter
2798*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetDispCount(MS_U32 u32Id)2799*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetDispCount(MS_U32 u32Id)
2800*53ee8cc1Swenshuai.xi {
2801*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
2802*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2803*53ee8cc1Swenshuai.xi return HAL_MVD_GetDispCnt(u8HalIdx);
2804*53ee8cc1Swenshuai.xi }
2805*53ee8cc1Swenshuai.xi
2806*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2807*53ee8cc1Swenshuai.xi /// Get MVD displayed picture counter
2808*53ee8cc1Swenshuai.xi /// @return - displayed picture counter
2809*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetDropCount(MS_U32 u32Id)2810*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetDropCount(MS_U32 u32Id)
2811*53ee8cc1Swenshuai.xi {
2812*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
2813*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2814*53ee8cc1Swenshuai.xi return HAL_MVD_GetDropCnt(u8HalIdx);
2815*53ee8cc1Swenshuai.xi }
2816*53ee8cc1Swenshuai.xi
2817*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2818*53ee8cc1Swenshuai.xi /// Set MVD fd mask delay count
2819*53ee8cc1Swenshuai.xi /// 16bits and unit in vsync for mute the fd_mask
2820*53ee8cc1Swenshuai.xi /// @return -E_MVD_RET_OK for success; E_MVD_RET_FAIL for failure.
2821*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetFdMaskDelayCount(MS_U32 u32Id,MS_U16 u16Cnt)2822*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetFdMaskDelayCount(MS_U32 u32Id, MS_U16 u16Cnt)
2823*53ee8cc1Swenshuai.xi {
2824*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
2825*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2826*53ee8cc1Swenshuai.xi return HAL_MVD_SetFdMaskDelayCount(u8HalIdx, u16Cnt);
2827*53ee8cc1Swenshuai.xi }
2828*53ee8cc1Swenshuai.xi
2829*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2830*53ee8cc1Swenshuai.xi /// Set MVD fd mask delay count
2831*53ee8cc1Swenshuai.xi /// 16bits and unit in vsync for mute the fd_mask
2832*53ee8cc1Swenshuai.xi /// @return -E_MVD_RET_OK for success; E_MVD_RET_FAIL for failure.
2833*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetXcLowDelayIntState(MS_U32 u32Id)2834*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_GetXcLowDelayIntState(MS_U32 u32Id)
2835*53ee8cc1Swenshuai.xi {
2836*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
2837*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2838*53ee8cc1Swenshuai.xi return HAL_MVD_GetXcLowDelayIntState(u8HalIdx);
2839*53ee8cc1Swenshuai.xi }
2840*53ee8cc1Swenshuai.xi
2841*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2842*53ee8cc1Swenshuai.xi /// Set MVD output frame rate convert
2843*53ee8cc1Swenshuai.xi /// @param u8FrameRate \b IN : output frame rate of 8bits and unit in vsync
2844*53ee8cc1Swenshuai.xi /// @param u8Interlace \b IN : scan style 0:progress, 1:interlace
2845*53ee8cc1Swenshuai.xi /// @return -E_MVD_RET_OK for success; E_MVD_RET_FAIL for failure.
2846*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetOutputFRCMode(MS_U32 u32Id,MS_U8 u8FrameRate,MS_U8 u8Interlace)2847*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetOutputFRCMode(MS_U32 u32Id, MS_U8 u8FrameRate, MS_U8 u8Interlace)
2848*53ee8cc1Swenshuai.xi {
2849*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
2850*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2851*53ee8cc1Swenshuai.xi return HAL_MVD_SetOutputFRCMode(u8HalIdx, u8FrameRate, u8Interlace);
2852*53ee8cc1Swenshuai.xi }
2853*53ee8cc1Swenshuai.xi
2854*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2855*53ee8cc1Swenshuai.xi /// Set MVD FRC drop type.
2856*53ee8cc1Swenshuai.xi /// @param u8DropType \b IN : drop type. 0:drop frame, 1:drop field. default:0
2857*53ee8cc1Swenshuai.xi /// @return -E_MVD_RET_OK for success; E_MVD_RET_FAIL for failure.
2858*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetFRCDropType(MS_U32 u32Id,MS_U8 u8DropType)2859*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetFRCDropType(MS_U32 u32Id, MS_U8 u8DropType)
2860*53ee8cc1Swenshuai.xi {
2861*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
2862*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2863*53ee8cc1Swenshuai.xi return HAL_MVD_SetFRCDropType(u8HalIdx, u8DropType);
2864*53ee8cc1Swenshuai.xi }
2865*53ee8cc1Swenshuai.xi
2866*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2867*53ee8cc1Swenshuai.xi /// Set disable resolution change.
2868*53ee8cc1Swenshuai.xi /// @return -E_MVD_RET_OK for success; E_MVD_RET_FAIL for failure.
2869*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetDisableSeqChange(MS_U32 u32Id,MS_BOOL bEnable)2870*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetDisableSeqChange(MS_U32 u32Id, MS_BOOL bEnable)
2871*53ee8cc1Swenshuai.xi {
2872*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
2873*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2874*53ee8cc1Swenshuai.xi return HAL_MVD_SetDisableSeqChange(u8HalIdx, bEnable);
2875*53ee8cc1Swenshuai.xi }
2876*53ee8cc1Swenshuai.xi
2877*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2878*53ee8cc1Swenshuai.xi /// Force Enable/Disable Es Full stop
2879*53ee8cc1Swenshuai.xi /// @param bDisable- 0: force enable es full stop mode in ts/dtv 1: force disable es full stop mode in ts/dtv
2880*53ee8cc1Swenshuai.xi /// @return -E_MVD_RET_OK for success; E_MVD_RET_FAIL for failure.
2881*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DisableEsFullStop(MS_U32 u32Id,MS_BOOL bDisable)2882*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_DisableEsFullStop(MS_U32 u32Id, MS_BOOL bDisable)
2883*53ee8cc1Swenshuai.xi {
2884*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
2885*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2886*53ee8cc1Swenshuai.xi return HAL_MVD_DisableESFullStop(u8HalIdx, bDisable);
2887*53ee8cc1Swenshuai.xi }
2888*53ee8cc1Swenshuai.xi
MDrv_MVD_PUSI_Control(MS_U32 u32Id,MS_BOOL bEnable)2889*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_PUSI_Control(MS_U32 u32Id, MS_BOOL bEnable)
2890*53ee8cc1Swenshuai.xi {
2891*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
2892*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2893*53ee8cc1Swenshuai.xi return HAL_MVD_PUSI_Control(u8HalIdx, bEnable);
2894*53ee8cc1Swenshuai.xi }
2895*53ee8cc1Swenshuai.xi
2896*53ee8cc1Swenshuai.xi
2897*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2898*53ee8cc1Swenshuai.xi /// Debug function to dump useful info.
2899*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DbgDump(MS_U32 u32Id)2900*53ee8cc1Swenshuai.xi void MDrv_MVD_DbgDump(MS_U32 u32Id)
2901*53ee8cc1Swenshuai.xi {
2902*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
2903*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2904*53ee8cc1Swenshuai.xi MVD_FrameInfo* pPreInfo = &(pMVDDrvContext->stPreFrmInfo[u8DrvIdx]);
2905*53ee8cc1Swenshuai.xi MVD_AVSyncCfg* pAVSyncCfg = &(pMVDDrvContext->stSyncCfg[u8DrvIdx]);
2906*53ee8cc1Swenshuai.xi
2907*53ee8cc1Swenshuai.xi if (FALSE == MVD_GetIsUsed(u8DrvIdx))
2908*53ee8cc1Swenshuai.xi {
2909*53ee8cc1Swenshuai.xi MVD_PRINT("%s: _bDrvInit false!\n", __FUNCTION__);
2910*53ee8cc1Swenshuai.xi return;
2911*53ee8cc1Swenshuai.xi }
2912*53ee8cc1Swenshuai.xi
2913*53ee8cc1Swenshuai.xi HAL_MVD_DbgDump(u8HalIdx);
2914*53ee8cc1Swenshuai.xi MVD_PRINT("avsync on=%x, delay=%d, tolerance=%d, done=%x, skip=%x, repeat=%x, pts=%dms\n",
2915*53ee8cc1Swenshuai.xi pAVSyncCfg->bEnable, pAVSyncCfg->u32Delay, pAVSyncCfg->u16Tolerance, (MDrv_MVD_GetSyncStatus(u32Id)==1),
2916*53ee8cc1Swenshuai.xi MDrv_MVD_GetIsSyncSkip(u32Id), MDrv_MVD_GetIsSyncRep(u32Id), MDrv_MVD_GetPTS(u32Id));
2917*53ee8cc1Swenshuai.xi MVD_PRINT("seq(%d): w=%d, h=%d, i/p=%x, fps=%d\n", MDrv_MVD_GetDispRdy(u32Id),
2918*53ee8cc1Swenshuai.xi pPreInfo->u16HorSize, pPreInfo->u16VerSize,
2919*53ee8cc1Swenshuai.xi pPreInfo->u8Interlace, pPreInfo->u32FrameRate);
2920*53ee8cc1Swenshuai.xi }
2921*53ee8cc1Swenshuai.xi
2922*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2923*53ee8cc1Swenshuai.xi /// Dump the bitstream to predefined buffer address.
2924*53ee8cc1Swenshuai.xi /// Before PLAY command, set the bitstream base & bitstream length, and then
2925*53ee8cc1Swenshuai.xi /// CPU would continue to dump bitstream at the base address.
2926*53ee8cc1Swenshuai.xi /// @param -u32base \b IN : start address (MIU offset, e.g. 128M==>0MB)
2927*53ee8cc1Swenshuai.xi /// @param -u32size \b IN : size (bytes)
2928*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DbgDumpBits(MS_U32 u32Id,MS_PHY u32base,MS_U32 u32size)2929*53ee8cc1Swenshuai.xi void MDrv_MVD_DbgDumpBits(MS_U32 u32Id, MS_PHY u32base, MS_U32 u32size)
2930*53ee8cc1Swenshuai.xi {
2931*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2932*53ee8cc1Swenshuai.xi HAL_MVD_DbgDumpBits(u8HalIdx, u32base, u32size);
2933*53ee8cc1Swenshuai.xi return;
2934*53ee8cc1Swenshuai.xi }
2935*53ee8cc1Swenshuai.xi
2936*53ee8cc1Swenshuai.xi // only for VDEC internal link patch
MDrv_MVD_LinkWeakSymbolPatch(void)2937*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_LinkWeakSymbolPatch(void)
2938*53ee8cc1Swenshuai.xi {
2939*53ee8cc1Swenshuai.xi return TRUE;
2940*53ee8cc1Swenshuai.xi }
2941*53ee8cc1Swenshuai.xi
2942*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2943*53ee8cc1Swenshuai.xi /// Set firmware as MStreamer mode
2944*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2945*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetMStreamerMode(MS_U32 u32Id,MS_U8 u8Mode)2946*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetMStreamerMode(MS_U32 u32Id, MS_U8 u8Mode)
2947*53ee8cc1Swenshuai.xi {
2948*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2949*53ee8cc1Swenshuai.xi return HAL_MVD_SetMStreamerMode(u8HalIdx, u8Mode);
2950*53ee8cc1Swenshuai.xi }
2951*53ee8cc1Swenshuai.xi
2952*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2953*53ee8cc1Swenshuai.xi /// set firmware as MCU mode
2954*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2955*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_SetMcuMode(MS_U32 u32Id,MS_U8 u8Mode)2956*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetMcuMode(MS_U32 u32Id, MS_U8 u8Mode)
2957*53ee8cc1Swenshuai.xi {
2958*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2959*53ee8cc1Swenshuai.xi #ifdef VDEC3
2960*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
2961*53ee8cc1Swenshuai.xi pMVDDrvContext->u32FrameBaseMode[u8DrvIdx] = u8Mode;
2962*53ee8cc1Swenshuai.xi #endif
2963*53ee8cc1Swenshuai.xi return HAL_MVD_SetMcuMode(u8HalIdx, u8Mode);
2964*53ee8cc1Swenshuai.xi }
2965*53ee8cc1Swenshuai.xi
2966*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2967*53ee8cc1Swenshuai.xi /// set firmware as ForceInterlace mode
2968*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2969*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_ForceInterlaceMode(MS_U32 u32Id,MS_U8 u8Mode)2970*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_ForceInterlaceMode(MS_U32 u32Id, MS_U8 u8Mode)
2971*53ee8cc1Swenshuai.xi {
2972*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2973*53ee8cc1Swenshuai.xi return HAL_MVD_ForceInterlaceMode(u8HalIdx, u8Mode);
2974*53ee8cc1Swenshuai.xi }
2975*53ee8cc1Swenshuai.xi
2976*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2977*53ee8cc1Swenshuai.xi /// set firmware as Progressive mode
2978*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2979*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_ForceProgressiveMode(MS_U32 u32Id,MS_U8 u8Mode)2980*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_ForceProgressiveMode(MS_U32 u32Id, MS_U8 u8Mode)
2981*53ee8cc1Swenshuai.xi {
2982*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2983*53ee8cc1Swenshuai.xi return HAL_MVD_ForceProgressiveMode(u8HalIdx, u8Mode);
2984*53ee8cc1Swenshuai.xi }
2985*53ee8cc1Swenshuai.xi
2986*53ee8cc1Swenshuai.xi
2987*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2988*53ee8cc1Swenshuai.xi /// set firmware as I/P clip mode mode
2989*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
2990*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_ShowDecodeOrder(MS_U32 u32Id,MS_U8 u8Mode)2991*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_ShowDecodeOrder(MS_U32 u32Id, MS_U8 u8Mode)
2992*53ee8cc1Swenshuai.xi {
2993*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
2994*53ee8cc1Swenshuai.xi return HAL_MVD_ShowDecodeOrder(u8HalIdx, u8Mode);
2995*53ee8cc1Swenshuai.xi }
2996*53ee8cc1Swenshuai.xi
2997*53ee8cc1Swenshuai.xi
2998*53ee8cc1Swenshuai.xi
2999*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3000*53ee8cc1Swenshuai.xi /// Flip the specified frame
3001*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3002*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_FrameFlip(MS_U32 u32Id,MS_U8 u8FrmIdx)3003*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_FrameFlip(MS_U32 u32Id, MS_U8 u8FrmIdx)
3004*53ee8cc1Swenshuai.xi {
3005*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3006*53ee8cc1Swenshuai.xi if (TRUE != HAL_MVD_IsMStreamerMode(u8HalIdx))
3007*53ee8cc1Swenshuai.xi {
3008*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("Need to SetMStreamerMode before using this function\n"));
3009*53ee8cc1Swenshuai.xi return FALSE;
3010*53ee8cc1Swenshuai.xi }
3011*53ee8cc1Swenshuai.xi
3012*53ee8cc1Swenshuai.xi if (TRUE == HAL_MVD_IsMcuMode(u8HalIdx))
3013*53ee8cc1Swenshuai.xi {
3014*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("It's MCU mode, doesn't need to using this fuction\n"));
3015*53ee8cc1Swenshuai.xi return FALSE;
3016*53ee8cc1Swenshuai.xi }
3017*53ee8cc1Swenshuai.xi
3018*53ee8cc1Swenshuai.xi return HAL_MVD_FrameOpt(u8HalIdx, u8FrmIdx, E_MVD_FRAME_FLIP);
3019*53ee8cc1Swenshuai.xi }
3020*53ee8cc1Swenshuai.xi
3021*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3022*53ee8cc1Swenshuai.xi /// Release the specified frame
3023*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3024*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_FrameRelease(MS_U32 u32Id,MS_U8 u8FrmIdx)3025*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_FrameRelease(MS_U32 u32Id, MS_U8 u8FrmIdx)
3026*53ee8cc1Swenshuai.xi {
3027*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3028*53ee8cc1Swenshuai.xi if (TRUE != (HAL_MVD_IsMStreamerMode(u8HalIdx) || HAL_MVD_IsMcuMode(u8HalIdx)) )
3029*53ee8cc1Swenshuai.xi {
3030*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("Need to SetMStreamerMode or SetMcuMode before using this function\n"));
3031*53ee8cc1Swenshuai.xi return FALSE;
3032*53ee8cc1Swenshuai.xi }
3033*53ee8cc1Swenshuai.xi return HAL_MVD_FrameOpt(u8HalIdx, u8FrmIdx, E_MVD_FRAME_RELEASE);
3034*53ee8cc1Swenshuai.xi }
3035*53ee8cc1Swenshuai.xi
3036*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3037*53ee8cc1Swenshuai.xi /// Enable/Disable to capture the specified frame
3038*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3039*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_FrameCapture(MS_U32 u32Id,MS_U8 u8FrmIdx,MS_BOOL bEnable)3040*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_FrameCapture(MS_U32 u32Id, MS_U8 u8FrmIdx, MS_BOOL bEnable)
3041*53ee8cc1Swenshuai.xi {
3042*53ee8cc1Swenshuai.xi MS_BOOL ret = FALSE;
3043*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3044*53ee8cc1Swenshuai.xi
3045*53ee8cc1Swenshuai.xi if (TRUE != HAL_MVD_IsMStreamerMode(u8HalIdx))
3046*53ee8cc1Swenshuai.xi {
3047*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("Need to SetMStreamerMode before using this function\n"));
3048*53ee8cc1Swenshuai.xi return FALSE;
3049*53ee8cc1Swenshuai.xi }
3050*53ee8cc1Swenshuai.xi
3051*53ee8cc1Swenshuai.xi ret = HAL_MVD_FrameCapture(u8HalIdx, u8FrmIdx, bEnable);
3052*53ee8cc1Swenshuai.xi
3053*53ee8cc1Swenshuai.xi //firmware will keep this frame until we release it.
3054*53ee8cc1Swenshuai.xi if (ret && !bEnable)
3055*53ee8cc1Swenshuai.xi {
3056*53ee8cc1Swenshuai.xi ret = MDrv_MVD_FrameRelease(u32Id, u8FrmIdx);
3057*53ee8cc1Swenshuai.xi }
3058*53ee8cc1Swenshuai.xi
3059*53ee8cc1Swenshuai.xi return ret;
3060*53ee8cc1Swenshuai.xi }
3061*53ee8cc1Swenshuai.xi
3062*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3063*53ee8cc1Swenshuai.xi /// Allocate share memory from MSOS for Drv MVD
3064*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3065*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_Init_Share_Mem(void)3066*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_Init_Share_Mem(void)
3067*53ee8cc1Swenshuai.xi {
3068*53ee8cc1Swenshuai.xi #if ((defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL) || defined(MSOS_TYPE_ECOS)) && (!defined(SUPPORT_X_MODEL_FEATURE)))
3069*53ee8cc1Swenshuai.xi MS_U32 u32ShmId;
3070*53ee8cc1Swenshuai.xi MS_VIRT u32Addr;
3071*53ee8cc1Swenshuai.xi MS_U32 u32BufSize;
3072*53ee8cc1Swenshuai.xi
3073*53ee8cc1Swenshuai.xi
3074*53ee8cc1Swenshuai.xi if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux MVD driver",
3075*53ee8cc1Swenshuai.xi sizeof(MVD_Drv_CTX),
3076*53ee8cc1Swenshuai.xi &u32ShmId,
3077*53ee8cc1Swenshuai.xi &u32Addr,
3078*53ee8cc1Swenshuai.xi &u32BufSize,
3079*53ee8cc1Swenshuai.xi MSOS_SHM_QUERY))
3080*53ee8cc1Swenshuai.xi {
3081*53ee8cc1Swenshuai.xi if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux MVD driver",
3082*53ee8cc1Swenshuai.xi sizeof(MVD_Drv_CTX),
3083*53ee8cc1Swenshuai.xi &u32ShmId,
3084*53ee8cc1Swenshuai.xi &u32Addr,
3085*53ee8cc1Swenshuai.xi &u32BufSize,
3086*53ee8cc1Swenshuai.xi MSOS_SHM_CREATE))
3087*53ee8cc1Swenshuai.xi {
3088*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("[%s]SHM allocation failed!!! use global structure instead!!!\n",__FUNCTION__));
3089*53ee8cc1Swenshuai.xi if(pMVDDrvContext == NULL)
3090*53ee8cc1Swenshuai.xi {
3091*53ee8cc1Swenshuai.xi pMVDDrvContext = &gMVDDrvContext;
3092*53ee8cc1Swenshuai.xi memset(pMVDDrvContext,0,sizeof(MVD_Drv_CTX));
3093*53ee8cc1Swenshuai.xi MVD_Context_Init();
3094*53ee8cc1Swenshuai.xi MVD_PRINT("[%s]Global structure init Success!!!\n",__FUNCTION__);
3095*53ee8cc1Swenshuai.xi }
3096*53ee8cc1Swenshuai.xi else
3097*53ee8cc1Swenshuai.xi {
3098*53ee8cc1Swenshuai.xi MVD_PRINT("[%s]Global structure exists!!!\n",__FUNCTION__);
3099*53ee8cc1Swenshuai.xi }
3100*53ee8cc1Swenshuai.xi //return E_MVD_RET_FAIL;
3101*53ee8cc1Swenshuai.xi }
3102*53ee8cc1Swenshuai.xi else
3103*53ee8cc1Swenshuai.xi {
3104*53ee8cc1Swenshuai.xi memset((MS_U8*)u32Addr,0,sizeof(MVD_Drv_CTX));
3105*53ee8cc1Swenshuai.xi pMVDDrvContext = (MVD_Drv_CTX*)u32Addr; // for one process
3106*53ee8cc1Swenshuai.xi MVD_Context_Init();
3107*53ee8cc1Swenshuai.xi }
3108*53ee8cc1Swenshuai.xi }
3109*53ee8cc1Swenshuai.xi else
3110*53ee8cc1Swenshuai.xi {
3111*53ee8cc1Swenshuai.xi pMVDDrvContext = (MVD_Drv_CTX*)u32Addr; // for another process
3112*53ee8cc1Swenshuai.xi }
3113*53ee8cc1Swenshuai.xi #else
3114*53ee8cc1Swenshuai.xi if(pMVDDrvContext == NULL)
3115*53ee8cc1Swenshuai.xi {
3116*53ee8cc1Swenshuai.xi pMVDDrvContext = &gMVDDrvContext;
3117*53ee8cc1Swenshuai.xi memset(pMVDDrvContext,0,sizeof(MVD_Drv_CTX));
3118*53ee8cc1Swenshuai.xi MVD_Context_Init();
3119*53ee8cc1Swenshuai.xi }
3120*53ee8cc1Swenshuai.xi #endif
3121*53ee8cc1Swenshuai.xi
3122*53ee8cc1Swenshuai.xi if(HAL_MVD_Init_Share_Mem() != TRUE)
3123*53ee8cc1Swenshuai.xi {
3124*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3125*53ee8cc1Swenshuai.xi }
3126*53ee8cc1Swenshuai.xi
3127*53ee8cc1Swenshuai.xi if(HAL_VPU_EX_Init_Share_Mem() != TRUE)
3128*53ee8cc1Swenshuai.xi {
3129*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3130*53ee8cc1Swenshuai.xi }
3131*53ee8cc1Swenshuai.xi
3132*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
3133*53ee8cc1Swenshuai.xi }
3134*53ee8cc1Swenshuai.xi
3135*53ee8cc1Swenshuai.xi
3136*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3137*53ee8cc1Swenshuai.xi /// Get the available streamID for the specified stream type
3138*53ee8cc1Swenshuai.xi /// @return u32ID as (drvIdx << 16 | u32MVDStreamId << 8 | u32VPUStreamId)
3139*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetFreeStream(MS_U32 * pu32Id,MVD_DRV_StreamType eStreamType)3140*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_GetFreeStream(MS_U32 *pu32Id, MVD_DRV_StreamType eStreamType)
3141*53ee8cc1Swenshuai.xi {
3142*53ee8cc1Swenshuai.xi MS_U8 i = 0xff;
3143*53ee8cc1Swenshuai.xi MS_U32 u32VPUStreamId = 0;
3144*53ee8cc1Swenshuai.xi MS_U32 u32MVDStreamId = 0;
3145*53ee8cc1Swenshuai.xi HAL_VPU_StreamType eVpuStreamType = E_HAL_VPU_MAIN_STREAM;
3146*53ee8cc1Swenshuai.xi HAL_MVD_StreamType eHalStreamType = E_HAL_MVD_MAIN_STREAM;
3147*53ee8cc1Swenshuai.xi
3148*53ee8cc1Swenshuai.xi if(pu32Id == NULL)
3149*53ee8cc1Swenshuai.xi {
3150*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("%s err: NULL pu32Id\n", __FUNCTION__));
3151*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
3152*53ee8cc1Swenshuai.xi }
3153*53ee8cc1Swenshuai.xi else
3154*53ee8cc1Swenshuai.xi {
3155*53ee8cc1Swenshuai.xi *pu32Id = 0;
3156*53ee8cc1Swenshuai.xi }
3157*53ee8cc1Swenshuai.xi
3158*53ee8cc1Swenshuai.xi #ifndef VDEC3
3159*53ee8cc1Swenshuai.xi switch (eStreamType)
3160*53ee8cc1Swenshuai.xi {
3161*53ee8cc1Swenshuai.xi case E_MVD_DRV_MAIN_STREAM:
3162*53ee8cc1Swenshuai.xi i=0;
3163*53ee8cc1Swenshuai.xi break;
3164*53ee8cc1Swenshuai.xi case E_MVD_DRV_SUB_STREAM:
3165*53ee8cc1Swenshuai.xi i=1;
3166*53ee8cc1Swenshuai.xi break;
3167*53ee8cc1Swenshuai.xi case E_MVD_DRV_STREAM_NONE:
3168*53ee8cc1Swenshuai.xi default:
3169*53ee8cc1Swenshuai.xi i=0xff;
3170*53ee8cc1Swenshuai.xi break;
3171*53ee8cc1Swenshuai.xi }
3172*53ee8cc1Swenshuai.xi
3173*53ee8cc1Swenshuai.xi if ((i>=MVD_MAX_STREAMS) || (TRUE == MVD_GetIsUsed(i)))
3174*53ee8cc1Swenshuai.xi {
3175*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("eStreamType=%x is used or invalid, i=%x\n", eStreamType, i));
3176*53ee8cc1Swenshuai.xi *pu32Id = 0;
3177*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3178*53ee8cc1Swenshuai.xi }
3179*53ee8cc1Swenshuai.xi #endif
3180*53ee8cc1Swenshuai.xi
3181*53ee8cc1Swenshuai.xi //Get VPU & HAL stream id
3182*53ee8cc1Swenshuai.xi if (E_MVD_DRV_MAIN_STREAM == eStreamType)
3183*53ee8cc1Swenshuai.xi {
3184*53ee8cc1Swenshuai.xi eVpuStreamType = E_HAL_VPU_MAIN_STREAM;
3185*53ee8cc1Swenshuai.xi eHalStreamType = E_HAL_MVD_MAIN_STREAM;
3186*53ee8cc1Swenshuai.xi i = 0;
3187*53ee8cc1Swenshuai.xi }
3188*53ee8cc1Swenshuai.xi else if (E_MVD_DRV_SUB_STREAM == eStreamType)
3189*53ee8cc1Swenshuai.xi {
3190*53ee8cc1Swenshuai.xi eVpuStreamType = E_HAL_VPU_SUB_STREAM;
3191*53ee8cc1Swenshuai.xi eHalStreamType = E_HAL_MVD_SUB_STREAM;
3192*53ee8cc1Swenshuai.xi i = 1;
3193*53ee8cc1Swenshuai.xi }
3194*53ee8cc1Swenshuai.xi #ifdef VDEC3
3195*53ee8cc1Swenshuai.xi else if ((eStreamType >= E_MVD_DRV_N_STREAM) && (eStreamType < (E_MVD_DRV_N_STREAM+MVD_MAX_STREAMS)))
3196*53ee8cc1Swenshuai.xi {
3197*53ee8cc1Swenshuai.xi eVpuStreamType = E_HAL_VPU_N_STREAM + (eStreamType - E_MVD_DRV_N_STREAM);
3198*53ee8cc1Swenshuai.xi eHalStreamType = E_HAL_MVD_N_STREAM + (eStreamType - E_MVD_DRV_N_STREAM);
3199*53ee8cc1Swenshuai.xi i = eStreamType - E_MVD_DRV_N_STREAM;
3200*53ee8cc1Swenshuai.xi }
3201*53ee8cc1Swenshuai.xi #endif
3202*53ee8cc1Swenshuai.xi
3203*53ee8cc1Swenshuai.xi u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(eVpuStreamType);
3204*53ee8cc1Swenshuai.xi if(u32VPUStreamId == E_HAL_VPU_STREAM_NONE)
3205*53ee8cc1Swenshuai.xi {
3206*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3207*53ee8cc1Swenshuai.xi }
3208*53ee8cc1Swenshuai.xi
3209*53ee8cc1Swenshuai.xi u32MVDStreamId = (MS_U32) HAL_MVD_GetFreeStream(eHalStreamType);
3210*53ee8cc1Swenshuai.xi if(u32MVDStreamId == E_HAL_MVD_STREAM_NONE)
3211*53ee8cc1Swenshuai.xi {
3212*53ee8cc1Swenshuai.xi HAL_VPU_EX_ReleaseFreeStream(i);
3213*53ee8cc1Swenshuai.xi }
3214*53ee8cc1Swenshuai.xi
3215*53ee8cc1Swenshuai.xi MVD_DEBUGVERBAL(MVD_PRINT("%s:: i=0x%x, mvd=0x%x, vpu=0x%x\n", __FUNCTION__,
3216*53ee8cc1Swenshuai.xi i, u32MVDStreamId, u32VPUStreamId));
3217*53ee8cc1Swenshuai.xi
3218*53ee8cc1Swenshuai.xi if (u32VPUStreamId && u32MVDStreamId)
3219*53ee8cc1Swenshuai.xi {
3220*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s i=0x%x, mvd=0x%x, vpu=0x%x\n", __FUNCTION__,
3221*53ee8cc1Swenshuai.xi i, u32MVDStreamId, u32VPUStreamId));
3222*53ee8cc1Swenshuai.xi #ifdef VDEC3
3223*53ee8cc1Swenshuai.xi *pu32Id = ((u32MVDStreamId & 0x0F) << 16 | u32MVDStreamId << 8 | u32VPUStreamId);
3224*53ee8cc1Swenshuai.xi if (FALSE == MVD_SaveStreamId(u32MVDStreamId&0x0F, u32MVDStreamId, u32VPUStreamId))
3225*53ee8cc1Swenshuai.xi {
3226*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3227*53ee8cc1Swenshuai.xi }
3228*53ee8cc1Swenshuai.xi #else
3229*53ee8cc1Swenshuai.xi *pu32Id = (i << 16 | u32MVDStreamId << 8 | u32VPUStreamId);
3230*53ee8cc1Swenshuai.xi if (FALSE == MVD_SaveStreamId(i, u32MVDStreamId, u32VPUStreamId))
3231*53ee8cc1Swenshuai.xi {
3232*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3233*53ee8cc1Swenshuai.xi }
3234*53ee8cc1Swenshuai.xi #endif
3235*53ee8cc1Swenshuai.xi }
3236*53ee8cc1Swenshuai.xi else
3237*53ee8cc1Swenshuai.xi {
3238*53ee8cc1Swenshuai.xi #ifdef VDEC3
3239*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s(%d) NG i=0x%x, mvd=0x%x, vpu=0x%x\n", __FUNCTION__, __LINE__,
3240*53ee8cc1Swenshuai.xi u32MVDStreamId&0xf, u32MVDStreamId, u32VPUStreamId));
3241*53ee8cc1Swenshuai.xi #else
3242*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s(%d) NG i=0x%x, mvd=0x%x, vpu=0x%x\n", __FUNCTION__, __LINE__,
3243*53ee8cc1Swenshuai.xi i, u32MVDStreamId, u32VPUStreamId));
3244*53ee8cc1Swenshuai.xi #endif
3245*53ee8cc1Swenshuai.xi }
3246*53ee8cc1Swenshuai.xi
3247*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
3248*53ee8cc1Swenshuai.xi }
3249*53ee8cc1Swenshuai.xi
3250*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3251*53ee8cc1Swenshuai.xi /// Set bitstream buffer overflow threshold
3252*53ee8cc1Swenshuai.xi /// @return -none
3253*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetOverflowTH(MS_U32 u32Id,MS_U32 u32Threshold)3254*53ee8cc1Swenshuai.xi void MDrv_MVD_SetOverflowTH(MS_U32 u32Id, MS_U32 u32Threshold)
3255*53ee8cc1Swenshuai.xi {
3256*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3257*53ee8cc1Swenshuai.xi HAL_MVD_SetOverflowTH(u8HalIdx, u32Threshold);
3258*53ee8cc1Swenshuai.xi return;
3259*53ee8cc1Swenshuai.xi }
3260*53ee8cc1Swenshuai.xi
3261*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3262*53ee8cc1Swenshuai.xi /// Set bitstream buffer underflow threshold
3263*53ee8cc1Swenshuai.xi /// @return -none
3264*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetUnderflowTH(MS_U32 u32Id,MS_U32 u32Threshold)3265*53ee8cc1Swenshuai.xi void MDrv_MVD_SetUnderflowTH(MS_U32 u32Id, MS_U32 u32Threshold)
3266*53ee8cc1Swenshuai.xi {
3267*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3268*53ee8cc1Swenshuai.xi HAL_MVD_SetUnderflowTH(u8HalIdx, u32Threshold);
3269*53ee8cc1Swenshuai.xi return;
3270*53ee8cc1Swenshuai.xi }
3271*53ee8cc1Swenshuai.xi
MDrv_MVD_SetSingleDecodeMode(MS_BOOL bEnable)3272*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetSingleDecodeMode(MS_BOOL bEnable)
3273*53ee8cc1Swenshuai.xi {
3274*53ee8cc1Swenshuai.xi return HAL_VPU_EX_SetSingleDecodeMode(bEnable);
3275*53ee8cc1Swenshuai.xi }
3276*53ee8cc1Swenshuai.xi
3277*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3278*53ee8cc1Swenshuai.xi /// Release fd mask
3279*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3280*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_ReleaseFdMask(MS_U32 u32Id,MS_BOOL bRls)3281*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_ReleaseFdMask(MS_U32 u32Id, MS_BOOL bRls)
3282*53ee8cc1Swenshuai.xi {
3283*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3284*53ee8cc1Swenshuai.xi return HAL_MVD_ReleaseFdMask(u8HalIdx, bRls);
3285*53ee8cc1Swenshuai.xi }
3286*53ee8cc1Swenshuai.xi
3287*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3288*53ee8cc1Swenshuai.xi /// Reset MVD parser . It is used to reset MVD Parser.
3289*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3290*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_ParserRstDone(MS_U32 u32Id,MS_BOOL bEnable)3291*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_ParserRstDone(MS_U32 u32Id, MS_BOOL bEnable)
3292*53ee8cc1Swenshuai.xi {
3293*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3294*53ee8cc1Swenshuai.xi return HAL_MVD_ParserRstDone(u8HalIdx, bEnable);
3295*53ee8cc1Swenshuai.xi }
3296*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3297*53ee8cc1Swenshuai.xi /// Flush PTS buffer.
3298*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3299*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_FlushPTSBuf(MS_U32 u32Id,MS_BOOL bEnable)3300*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_FlushPTSBuf(MS_U32 u32Id,MS_BOOL bEnable)
3301*53ee8cc1Swenshuai.xi {
3302*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3303*53ee8cc1Swenshuai.xi return HAL_MVD_FlushPTSBuf(u8HalIdx ,bEnable);
3304*53ee8cc1Swenshuai.xi }
3305*53ee8cc1Swenshuai.xi
3306*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3307*53ee8cc1Swenshuai.xi /// Get SLQ number
3308*53ee8cc1Swenshuai.xi /// @return -the SLQ number
3309*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetSLQNum(MS_U32 u32Id)3310*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetSLQNum(MS_U32 u32Id)
3311*53ee8cc1Swenshuai.xi {
3312*53ee8cc1Swenshuai.xi #ifdef VDEC3
3313*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
3314*53ee8cc1Swenshuai.xi
3315*53ee8cc1Swenshuai.xi if(pMVDDrvContext->u32FrameBaseMode[u8DrvIdx] == TRUE)
3316*53ee8cc1Swenshuai.xi {
3317*53ee8cc1Swenshuai.xi return 0;
3318*53ee8cc1Swenshuai.xi }
3319*53ee8cc1Swenshuai.xi else
3320*53ee8cc1Swenshuai.xi #endif
3321*53ee8cc1Swenshuai.xi {
3322*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3323*53ee8cc1Swenshuai.xi return HAL_MVD_GetSLQNum(u8HalIdx);
3324*53ee8cc1Swenshuai.xi }
3325*53ee8cc1Swenshuai.xi }
3326*53ee8cc1Swenshuai.xi
3327*53ee8cc1Swenshuai.xi
3328*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3329*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_MVD_GetFrmRateIsSupported()
3330*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get if the framerate is supported
3331*53ee8cc1Swenshuai.xi /// @return -The result of supported or not.
3332*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_GetFrmRateIsSupported(MS_U32 u32Id)3333*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetFrmRateIsSupported(MS_U32 u32Id)
3334*53ee8cc1Swenshuai.xi {
3335*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
3336*53ee8cc1Swenshuai.xi MS_BOOL bSupported = pMVDDrvContext->bFrmRateSupported[u8DrvIdx];
3337*53ee8cc1Swenshuai.xi
3338*53ee8cc1Swenshuai.xi return bSupported;
3339*53ee8cc1Swenshuai.xi }
3340*53ee8cc1Swenshuai.xi
3341*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3342*53ee8cc1Swenshuai.xi /// set fw auto mute
3343*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3344*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetAutoMute(MS_U32 u32Id,MS_BOOL bEnable)3345*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetAutoMute(MS_U32 u32Id, MS_BOOL bEnable)
3346*53ee8cc1Swenshuai.xi {
3347*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3348*53ee8cc1Swenshuai.xi MS_BOOL bRet = HAL_MVD_SetAutoMute(u8HalIdx, bEnable);
3349*53ee8cc1Swenshuai.xi return ((TRUE == bRet) ? E_MVD_RET_OK : E_MVD_RET_FAIL);
3350*53ee8cc1Swenshuai.xi }
3351*53ee8cc1Swenshuai.xi
MDrv_MVD_SetVSizeAlign(MS_U32 u32Id,MS_BOOL bEnable)3352*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetVSizeAlign(MS_U32 u32Id, MS_BOOL bEnable)
3353*53ee8cc1Swenshuai.xi {
3354*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3355*53ee8cc1Swenshuai.xi return HAL_MVD_SetVSizeAlign(u8HalIdx, bEnable);
3356*53ee8cc1Swenshuai.xi }
3357*53ee8cc1Swenshuai.xi
3358*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3359*53ee8cc1Swenshuai.xi /// Set codec type.
3360*53ee8cc1Swenshuai.xi /// @param -pCrcIn \b IN : the struct of generate CRC
3361*53ee8cc1Swenshuai.xi /// @param -pCrcOut \b OUT : CRC value from mvd hw
3362*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetCrcValue(MS_U32 u32Id,MVD_CrcIn * pCrcIn,MVD_CrcOut * pCrcOut)3363*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_GetCrcValue(MS_U32 u32Id, MVD_CrcIn *pCrcIn, MVD_CrcOut *pCrcOut)
3364*53ee8cc1Swenshuai.xi {
3365*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3366*53ee8cc1Swenshuai.xi
3367*53ee8cc1Swenshuai.xi //check input parameters
3368*53ee8cc1Swenshuai.xi if (pCrcIn == NULL)
3369*53ee8cc1Swenshuai.xi {
3370*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("PushQueue NULL pInfo\n"));
3371*53ee8cc1Swenshuai.xi return E_MVD_RET_INVALID_PARAM;
3372*53ee8cc1Swenshuai.xi }
3373*53ee8cc1Swenshuai.xi
3374*53ee8cc1Swenshuai.xi return HAL_MVD_GetCrcValue(u8HalIdx, pCrcIn, pCrcOut);
3375*53ee8cc1Swenshuai.xi }
3376*53ee8cc1Swenshuai.xi
3377*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3378*53ee8cc1Swenshuai.xi /// set debug mode
3379*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3380*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetDbgMode(MS_U32 u32Id,MVD_DbgMode enDbgMode,MS_BOOL bEn)3381*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetDbgMode(MS_U32 u32Id, MVD_DbgMode enDbgMode, MS_BOOL bEn)
3382*53ee8cc1Swenshuai.xi {
3383*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3384*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
3385*53ee8cc1Swenshuai.xi E_MVD_Result eRet=E_MVD_RET_FAIL;
3386*53ee8cc1Swenshuai.xi
3387*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("MDrv_MVD_SetDbgMode...%x\n",(unsigned int)pstCtrlCfg->stDbgModeCfg.value));
3388*53ee8cc1Swenshuai.xi switch (enDbgMode)
3389*53ee8cc1Swenshuai.xi {
3390*53ee8cc1Swenshuai.xi case E_MVD_EX_DBG_MODE_BYPASS_INSERT_START_CODE:
3391*53ee8cc1Swenshuai.xi {
3392*53ee8cc1Swenshuai.xi pstCtrlCfg->stDbgModeCfg.bBypassInsertStartCode=bEn;
3393*53ee8cc1Swenshuai.xi eRet=E_MVD_RET_OK;
3394*53ee8cc1Swenshuai.xi }
3395*53ee8cc1Swenshuai.xi break;
3396*53ee8cc1Swenshuai.xi case E_MVD_EX_DBG_MODE_BYPASS_DIVX_MC_PATCH:
3397*53ee8cc1Swenshuai.xi {
3398*53ee8cc1Swenshuai.xi pstCtrlCfg->stDbgModeCfg.bBypassDivxMCPatch=bEn;
3399*53ee8cc1Swenshuai.xi eRet=E_MVD_RET_OK;
3400*53ee8cc1Swenshuai.xi }
3401*53ee8cc1Swenshuai.xi break;
3402*53ee8cc1Swenshuai.xi default:
3403*53ee8cc1Swenshuai.xi eRet=E_MVD_RET_INVALID_PARAM;
3404*53ee8cc1Swenshuai.xi break;
3405*53ee8cc1Swenshuai.xi }
3406*53ee8cc1Swenshuai.xi MVD_DEBUGINFO(MVD_PRINT("%s stDbgModeCfg=%x\n", __FUNCTION__, (unsigned int)pstCtrlCfg->stDbgModeCfg.value));
3407*53ee8cc1Swenshuai.xi return eRet;
3408*53ee8cc1Swenshuai.xi }
3409*53ee8cc1Swenshuai.xi
3410*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3411*53ee8cc1Swenshuai.xi /// Get SLQ number
3412*53ee8cc1Swenshuai.xi /// @return -the SLQ number
3413*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetDispQNum(MS_U32 u32Id)3414*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetDispQNum(MS_U32 u32Id)
3415*53ee8cc1Swenshuai.xi {
3416*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3417*53ee8cc1Swenshuai.xi return HAL_MVD_GetDispQNum(u8HalIdx);
3418*53ee8cc1Swenshuai.xi }
3419*53ee8cc1Swenshuai.xi
3420*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3421*53ee8cc1Swenshuai.xi /// set fw fask suspend
3422*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3423*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3424*53ee8cc1Swenshuai.xi
MDrv_MVD_SuspendDynamicScale(MS_U32 u32Id,MS_BOOL bEnable)3425*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SuspendDynamicScale(MS_U32 u32Id, MS_BOOL bEnable)
3426*53ee8cc1Swenshuai.xi {
3427*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3428*53ee8cc1Swenshuai.xi return HAL_MVD_SuspendDynamicScale(u8HalIdx, bEnable);
3429*53ee8cc1Swenshuai.xi }
3430*53ee8cc1Swenshuai.xi
MDrv_MVD_GetSuspendDynamicScale(MS_U32 u32Id)3431*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetSuspendDynamicScale(MS_U32 u32Id)
3432*53ee8cc1Swenshuai.xi {
3433*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
3434*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3435*53ee8cc1Swenshuai.xi return HAL_MVD_GetSuspendDynamicScale(u8HalIdx);
3436*53ee8cc1Swenshuai.xi }
3437*53ee8cc1Swenshuai.xi
3438*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3439*53ee8cc1Swenshuai.xi /// get Stereo Type
3440*53ee8cc1Swenshuai.xi /// @return Stereo Type. 0000011(3) : 3d side-by-side 0001000(8) : 2d
3441*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3442*53ee8cc1Swenshuai.xi
MDrv_MVD_GetStereoType(MS_U32 u32Id)3443*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetStereoType(MS_U32 u32Id)
3444*53ee8cc1Swenshuai.xi {
3445*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
3446*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3447*53ee8cc1Swenshuai.xi return HAL_MVD_GetStereoType(u8HalIdx);
3448*53ee8cc1Swenshuai.xi }
3449*53ee8cc1Swenshuai.xi
3450*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3451*53ee8cc1Swenshuai.xi /// Get MVD DivX plus Version,
3452*53ee8cc1Swenshuai.xi /// @return -non DivX plus \b OUT 0
3453*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_GetDivxVer(MS_U32 u32Id)3454*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetDivxVer(MS_U32 u32Id)
3455*53ee8cc1Swenshuai.xi {
3456*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
3457*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3458*53ee8cc1Swenshuai.xi return HAL_MVD_GetDivxVer(u8HalIdx);
3459*53ee8cc1Swenshuai.xi }
3460*53ee8cc1Swenshuai.xi
3461*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3462*53ee8cc1Swenshuai.xi /// Set IDCT mode
3463*53ee8cc1Swenshuai.xi /// @param -u8Mode \b IN : 0 for original IDCT, 1 for new IDCT
3464*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3465*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetIdctMode(MS_U32 u32Id,MS_U8 u8Mode)3466*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetIdctMode(MS_U32 u32Id, MS_U8 u8Mode)
3467*53ee8cc1Swenshuai.xi {
3468*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3469*53ee8cc1Swenshuai.xi
3470*53ee8cc1Swenshuai.xi return HAL_MVD_SetIdctMode(u8HalIdx, u8Mode);
3471*53ee8cc1Swenshuai.xi }
3472*53ee8cc1Swenshuai.xi
3473*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3474*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_MVD_EX_SetMVDClockSpeed()
3475*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set mvd clock speed
3476*53ee8cc1Swenshuai.xi /// @return - The result of setting mvd clock speed
3477*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_EX_SetMVDClockSpeed(MVD_EX_ClockSpeed eClockSpeed)3478*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_EX_SetMVDClockSpeed(MVD_EX_ClockSpeed eClockSpeed)
3479*53ee8cc1Swenshuai.xi {
3480*53ee8cc1Swenshuai.xi HAL_MVD_EX_ClockSpeed eMVDClockSpeed = E_HAL_MVD_EX_CLOCK_SPEED_NONE;
3481*53ee8cc1Swenshuai.xi switch (eClockSpeed)
3482*53ee8cc1Swenshuai.xi {
3483*53ee8cc1Swenshuai.xi case E_MVD_EX_CLOCK_SPEED_HIGHEST:
3484*53ee8cc1Swenshuai.xi eMVDClockSpeed = E_HAL_MVD_EX_CLOCK_SPEED_HIGHEST;
3485*53ee8cc1Swenshuai.xi break;
3486*53ee8cc1Swenshuai.xi case E_MVD_EX_CLOCK_SPEED_HIGH:
3487*53ee8cc1Swenshuai.xi eMVDClockSpeed = E_HAL_MVD_EX_CLOCK_SPEED_HIGH;
3488*53ee8cc1Swenshuai.xi break;
3489*53ee8cc1Swenshuai.xi case E_MVD_EX_CLOCK_SPEED_MEDIUM:
3490*53ee8cc1Swenshuai.xi eMVDClockSpeed = E_HAL_MVD_EX_CLOCK_SPEED_MEDIUM;
3491*53ee8cc1Swenshuai.xi break;
3492*53ee8cc1Swenshuai.xi case E_MVD_EX_CLOCK_SPEED_LOW:
3493*53ee8cc1Swenshuai.xi eMVDClockSpeed = E_HAL_MVD_EX_CLOCK_SPEED_LOW;
3494*53ee8cc1Swenshuai.xi break;
3495*53ee8cc1Swenshuai.xi case E_MVD_EX_CLOCK_SPEED_LOWEST:
3496*53ee8cc1Swenshuai.xi eMVDClockSpeed = E_HAL_MVD_EX_CLOCK_SPEED_LOWEST;
3497*53ee8cc1Swenshuai.xi break;
3498*53ee8cc1Swenshuai.xi case E_MVD_EX_CLOCK_SPEED_DEFAULT:
3499*53ee8cc1Swenshuai.xi eMVDClockSpeed = E_HAL_MVD_EX_CLOCK_SPEED_DEFAULT;
3500*53ee8cc1Swenshuai.xi break;
3501*53ee8cc1Swenshuai.xi default:
3502*53ee8cc1Swenshuai.xi MVD_DEBUGERROR(MVD_ERR("mvd clock setting is wrong(%d)\n", eClockSpeed));
3503*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3504*53ee8cc1Swenshuai.xi break;
3505*53ee8cc1Swenshuai.xi }
3506*53ee8cc1Swenshuai.xi
3507*53ee8cc1Swenshuai.xi return HAL_MVD_EX_SetClockSpeed(eMVDClockSpeed);
3508*53ee8cc1Swenshuai.xi }
3509*53ee8cc1Swenshuai.xi
3510*53ee8cc1Swenshuai.xi
3511*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3512*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_MVD_HWBuffer_ReMappingMode()
3513*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/ Disable to push first frame to display queue directly
3514*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/ Disable
3515*53ee8cc1Swenshuai.xi /// -FALSE(0): disable this mode
3516*53ee8cc1Swenshuai.xi /// -TRUE(1): enable this mode
3517*53ee8cc1Swenshuai.xi /// @return -The result of command MDrv_MVD_HWBuffer_ReMappingMode
3518*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_HWBuffer_ReMappingMode(MS_U32 u32Id,MS_BOOL bEnable)3519*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_HWBuffer_ReMappingMode(MS_U32 u32Id,MS_BOOL bEnable)
3520*53ee8cc1Swenshuai.xi {
3521*53ee8cc1Swenshuai.xi
3522*53ee8cc1Swenshuai.xi E_MVD_Result eRet = E_MVD_RET_OK;
3523*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3524*53ee8cc1Swenshuai.xi
3525*53ee8cc1Swenshuai.xi pMVDDrvContext->gMVDPreCtrl[u8HalIdx].bHWBufferReMapping = bEnable;
3526*53ee8cc1Swenshuai.xi eRet=HAL_MVD_HWBuffer_ReMappingMode(u8HalIdx,bEnable);
3527*53ee8cc1Swenshuai.xi return eRet;
3528*53ee8cc1Swenshuai.xi }
3529*53ee8cc1Swenshuai.xi
3530*53ee8cc1Swenshuai.xi
3531*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3532*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_MVD_ShowFirstFrameDirect()
3533*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/ Disable to push first frame to display queue directly
3534*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/ Disable
3535*53ee8cc1Swenshuai.xi /// -FALSE(0): disable this mode
3536*53ee8cc1Swenshuai.xi /// -TRUE(1): enable this mode
3537*53ee8cc1Swenshuai.xi /// @return -The result of command MDrv_MVD_ShowFirstFrameDirect
3538*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_MVD_ShowFirstFrameDirect(MS_U32 u32Id,MS_BOOL bEnable)3539*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_ShowFirstFrameDirect(MS_U32 u32Id,MS_BOOL bEnable)
3540*53ee8cc1Swenshuai.xi {
3541*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3542*53ee8cc1Swenshuai.xi
3543*53ee8cc1Swenshuai.xi return HAL_MVD_ShowFirstFrameDirect(u8HalIdx, bEnable);
3544*53ee8cc1Swenshuai.xi }
3545*53ee8cc1Swenshuai.xi
3546*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3547*53ee8cc1Swenshuai.xi /// Set xc_low_delay parameter for xc_low_delay mechanism
3548*53ee8cc1Swenshuai.xi /// @return -E_MVD_RET_OK for success; E_MVD_RET_FAIL for failure.
3549*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetXCLowDelayPara(MS_U32 u32Id,MS_U32 u32Para)3550*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetXCLowDelayPara(MS_U32 u32Id,MS_U32 u32Para)
3551*53ee8cc1Swenshuai.xi {
3552*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3553*53ee8cc1Swenshuai.xi
3554*53ee8cc1Swenshuai.xi return HAL_MVD_SetXCLowDelayPara(u8HalIdx, u32Para);
3555*53ee8cc1Swenshuai.xi
3556*53ee8cc1Swenshuai.xi }
3557*53ee8cc1Swenshuai.xi
3558*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3559*53ee8cc1Swenshuai.xi /// Set self seqchange mode
3560*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : 0 for original seqchange, 1 for self seqchange
3561*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3562*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetSelfSeqChange(MS_U32 u32Id,MS_BOOL bEnable)3563*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetSelfSeqChange(MS_U32 u32Id, MS_BOOL bEnable)
3564*53ee8cc1Swenshuai.xi {
3565*53ee8cc1Swenshuai.xi MS_U8 u8DrvIdx = _MVD_GET_IDX(u32Id);
3566*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3567*53ee8cc1Swenshuai.xi MS_BOOL ret;
3568*53ee8cc1Swenshuai.xi
3569*53ee8cc1Swenshuai.xi ret = HAL_MVD_EnableDynamicScale(u8HalIdx,bEnable);
3570*53ee8cc1Swenshuai.xi
3571*53ee8cc1Swenshuai.xi if(ret == TRUE)
3572*53ee8cc1Swenshuai.xi {
3573*53ee8cc1Swenshuai.xi pMVDDrvContext->bSelf_SeqChange[u8DrvIdx] = bEnable;
3574*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
3575*53ee8cc1Swenshuai.xi }
3576*53ee8cc1Swenshuai.xi else
3577*53ee8cc1Swenshuai.xi {
3578*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3579*53ee8cc1Swenshuai.xi }
3580*53ee8cc1Swenshuai.xi }
3581*53ee8cc1Swenshuai.xi
3582*53ee8cc1Swenshuai.xi
3583*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3584*53ee8cc1Swenshuai.xi /// Set external DS buffer info.
3585*53ee8cc1Swenshuai.xi /// @param -pExternalBuf \b IN : External DS buffer info.
3586*53ee8cc1Swenshuai.xi /// @return -The result of setting external DS buffer
3587*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetExternalDSBuffer(MS_U32 u32Id,MVD_EX_ExternalDSBuf * pExternalBuf)3588*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetExternalDSBuffer(MS_U32 u32Id, MVD_EX_ExternalDSBuf *pExternalBuf)
3589*53ee8cc1Swenshuai.xi {
3590*53ee8cc1Swenshuai.xi #define SIZE_3K 0xC00
3591*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3592*53ee8cc1Swenshuai.xi MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8HalIdx);
3593*53ee8cc1Swenshuai.xi
3594*53ee8cc1Swenshuai.xi //MS_U32 u32DrvAddr = NULL;
3595*53ee8cc1Swenshuai.xi if((pstMemCfg == NULL) || (pExternalBuf->u32DSBufSize < SIZE_3K)) /// DS buffer size need more than 3K (0xC00)
3596*53ee8cc1Swenshuai.xi {
3597*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3598*53ee8cc1Swenshuai.xi }
3599*53ee8cc1Swenshuai.xi
3600*53ee8cc1Swenshuai.xi #if defined(CHIP_MONACO)
3601*53ee8cc1Swenshuai.xi if(VPU_FORCE_MIU_MODE == 1)
3602*53ee8cc1Swenshuai.xi {
3603*53ee8cc1Swenshuai.xi VPRINTF("this chip does not support set external DS buffer since VPU_FORCE_MIU_MODE == 1 !!\n");
3604*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3605*53ee8cc1Swenshuai.xi }
3606*53ee8cc1Swenshuai.xi #endif
3607*53ee8cc1Swenshuai.xi
3608*53ee8cc1Swenshuai.xi #if (defined(CHIP_EDISON) || defined(CHIP_EINSTEIN) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO))
3609*53ee8cc1Swenshuai.xi MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8HalIdx);
3610*53ee8cc1Swenshuai.xi MS_BOOL bRet = FALSE;
3611*53ee8cc1Swenshuai.xi MS_BOOL bExternalInMIU1 = FALSE;
3612*53ee8cc1Swenshuai.xi MS_VIRT u32DSAddr = pExternalBuf->u32DSBufAddr;
3613*53ee8cc1Swenshuai.xi MS_VIRT u32VPUAddr = NULL;
3614*53ee8cc1Swenshuai.xi
3615*53ee8cc1Swenshuai.xi if((pExternalBuf->u32DSBufAddr >= HAL_MVD_GetMiu1BaseAdd()) && (HAL_MVD_GetMiu1BaseAdd() != 0))
3616*53ee8cc1Swenshuai.xi {
3617*53ee8cc1Swenshuai.xi bExternalInMIU1 = TRUE;
3618*53ee8cc1Swenshuai.xi u32DSAddr -= HAL_MVD_GetMiu1BaseAdd();
3619*53ee8cc1Swenshuai.xi }
3620*53ee8cc1Swenshuai.xi
3621*53ee8cc1Swenshuai.xi /// If FW and external buf is in the same MIU, the External buffer do nothing.
3622*53ee8cc1Swenshuai.xi if(HAL_MVD_GetFWSelMiu1() == bExternalInMIU1)
3623*53ee8cc1Swenshuai.xi {
3624*53ee8cc1Swenshuai.xi u32VPUAddr = u32DSAddr;
3625*53ee8cc1Swenshuai.xi }
3626*53ee8cc1Swenshuai.xi else
3627*53ee8cc1Swenshuai.xi {
3628*53ee8cc1Swenshuai.xi /// If FW and external buf is not in the same MIU, the External buffer add the VPU Miu base size
3629*53ee8cc1Swenshuai.xi u32VPUAddr = u32DSAddr + HAL_VPU_EX_MIU1BASE();
3630*53ee8cc1Swenshuai.xi }
3631*53ee8cc1Swenshuai.xi
3632*53ee8cc1Swenshuai.xi ///VPRINTF("[EDS] VPU addr 0x%lx, drv addr 0x%lx, enable %d.\n",u32VPUAddr,pExternalBuf->u32DSBufAddr,pExternalBuf->bEnable);
3633*53ee8cc1Swenshuai.xi bRet = HAL_MVD_SetExternalDSBuff(u8HalIdx,u32VPUAddr,pExternalBuf->u32DSBufAddr);
3634*53ee8cc1Swenshuai.xi
3635*53ee8cc1Swenshuai.xi pstCtrlCfg->bExternalDSBuf = TRUE;
3636*53ee8cc1Swenshuai.xi
3637*53ee8cc1Swenshuai.xi if(bRet == TRUE)
3638*53ee8cc1Swenshuai.xi {
3639*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
3640*53ee8cc1Swenshuai.xi }
3641*53ee8cc1Swenshuai.xi else
3642*53ee8cc1Swenshuai.xi {
3643*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3644*53ee8cc1Swenshuai.xi }
3645*53ee8cc1Swenshuai.xi #endif
3646*53ee8cc1Swenshuai.xi
3647*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3648*53ee8cc1Swenshuai.xi }
3649*53ee8cc1Swenshuai.xi
MDrv_MVD_GetESBufferStatus(MS_U32 u32Id)3650*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_GetESBufferStatus(MS_U32 u32Id)
3651*53ee8cc1Swenshuai.xi {
3652*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3653*53ee8cc1Swenshuai.xi
3654*53ee8cc1Swenshuai.xi return HAL_MVD_GetESBufferStatus(u8HalIdx);
3655*53ee8cc1Swenshuai.xi }
3656*53ee8cc1Swenshuai.xi
MDrv_MVD_Field_Polarity_Display_One_field(MS_U32 u32Id,MS_BOOL bEnable,MS_U8 top_bottom)3657*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_Field_Polarity_Display_One_field(MS_U32 u32Id, MS_BOOL bEnable,MS_U8 top_bottom)
3658*53ee8cc1Swenshuai.xi {
3659*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3660*53ee8cc1Swenshuai.xi return HAL_MVD_Field_Polarity_Display_One_field(u8HalIdx, bEnable,top_bottom);
3661*53ee8cc1Swenshuai.xi }
3662*53ee8cc1Swenshuai.xi
3663*53ee8cc1Swenshuai.xi
3664*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3665*53ee8cc1Swenshuai.xi /// set share memory base between driver and fw
3666*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3667*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetShareMemoryBase(MS_U32 u32Id,MS_VIRT u32base)3668*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetShareMemoryBase(MS_U32 u32Id, MS_VIRT u32base)
3669*53ee8cc1Swenshuai.xi {
3670*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3671*53ee8cc1Swenshuai.xi
3672*53ee8cc1Swenshuai.xi if((u32base & MVD_U32_MASK) == HAL_MIU1_BASE)
3673*53ee8cc1Swenshuai.xi {
3674*53ee8cc1Swenshuai.xi u32base -= HAL_MIU1_BASE;
3675*53ee8cc1Swenshuai.xi return HAL_MVD_SetShareMemoryBase(u8HalIdx, u32base,MIU_SEL_1); //in miu1
3676*53ee8cc1Swenshuai.xi }
3677*53ee8cc1Swenshuai.xi else
3678*53ee8cc1Swenshuai.xi {
3679*53ee8cc1Swenshuai.xi return HAL_MVD_SetShareMemoryBase(u8HalIdx, u32base,MIU_SEL_0); // in miu0
3680*53ee8cc1Swenshuai.xi }
3681*53ee8cc1Swenshuai.xi }
3682*53ee8cc1Swenshuai.xi
MDrv_MVD_GetShareMemoryOffset(MS_U32 u32Id,MS_VIRT * u32base)3683*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_GetShareMemoryOffset(MS_U32 u32Id, MS_VIRT *u32base)
3684*53ee8cc1Swenshuai.xi {
3685*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3686*53ee8cc1Swenshuai.xi return HAL_MVD_GetShareMemoryOffset(u8HalIdx, u32base);
3687*53ee8cc1Swenshuai.xi }
3688*53ee8cc1Swenshuai.xi
MDrv_MVD_EnableVPUSecurityMode(MS_BOOL enable)3689*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_EnableVPUSecurityMode(MS_BOOL enable)
3690*53ee8cc1Swenshuai.xi {
3691*53ee8cc1Swenshuai.xi return HAL_VPU_EX_EnableSecurityMode(enable);
3692*53ee8cc1Swenshuai.xi }
3693*53ee8cc1Swenshuai.xi
MDrv_MVD_GetSupport2ndMVOPInterface(void)3694*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetSupport2ndMVOPInterface(void)
3695*53ee8cc1Swenshuai.xi {
3696*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
3697*53ee8cc1Swenshuai.xi
3698*53ee8cc1Swenshuai.xi return HAL_MVD_Support2ndMVOPInterface();
3699*53ee8cc1Swenshuai.xi }
3700*53ee8cc1Swenshuai.xi
MDrv_MVD_GetPVRSeamlessInfo(MS_U8 u8Idx,void * param)3701*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_GetPVRSeamlessInfo(MS_U8 u8Idx,void* param)
3702*53ee8cc1Swenshuai.xi {
3703*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
3704*53ee8cc1Swenshuai.xi
3705*53ee8cc1Swenshuai.xi return HAL_MVD_GetPVRSeamlessInfo(u8Idx,param);
3706*53ee8cc1Swenshuai.xi }
3707*53ee8cc1Swenshuai.xi
MDrv_MVD_REE_RegisterMBX(void)3708*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_REE_RegisterMBX(void)
3709*53ee8cc1Swenshuai.xi {
3710*53ee8cc1Swenshuai.xi return HAL_VPU_EX_REE_RegisterMBX();
3711*53ee8cc1Swenshuai.xi }
3712*53ee8cc1Swenshuai.xi
MDrv_MVD_REE_SetSHMBaseAddr(MS_U32 U32Type,MS_PHY u32SHMAddr,MS_PHY u32SHMSize,MS_PHY u32MIU1Addr)3713*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_REE_SetSHMBaseAddr(MS_U32 U32Type,MS_PHY u32SHMAddr,MS_PHY u32SHMSize,MS_PHY u32MIU1Addr)
3714*53ee8cc1Swenshuai.xi {
3715*53ee8cc1Swenshuai.xi return HAL_VPU_EX_REE_SetSHMBaseAddr(U32Type,u32SHMAddr,u32SHMSize,u32MIU1Addr);
3716*53ee8cc1Swenshuai.xi }
3717*53ee8cc1Swenshuai.xi
3718*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3719*53ee8cc1Swenshuai.xi /// set CC 608 or 708 share memory base between driver and fw
3720*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3721*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetExternal_CC608_Buffer(MS_U32 u32Id,MS_VIRT u32base,MS_U8 u8size)3722*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetExternal_CC608_Buffer(MS_U32 u32Id, MS_VIRT u32base,MS_U8 u8size)
3723*53ee8cc1Swenshuai.xi {
3724*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3725*53ee8cc1Swenshuai.xi return HAL_MVD_SetExternal_CC_Buffer(u8HalIdx,u32base,u8size,1);
3726*53ee8cc1Swenshuai.xi }
3727*53ee8cc1Swenshuai.xi
MDrv_MVD_SetExternal_CC708_Buffer(MS_U32 u32Id,MS_VIRT u32base,MS_U8 u8size)3728*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetExternal_CC708_Buffer(MS_U32 u32Id, MS_VIRT u32base,MS_U8 u8size)
3729*53ee8cc1Swenshuai.xi {
3730*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3731*53ee8cc1Swenshuai.xi return HAL_MVD_SetExternal_CC_Buffer(u8HalIdx,u32base,u8size,0);
3732*53ee8cc1Swenshuai.xi }
3733*53ee8cc1Swenshuai.xi
MDrv_MVD_SetPrebufferSize(MS_U32 u32Id,MS_U32 size)3734*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetPrebufferSize(MS_U32 u32Id, MS_U32 size)
3735*53ee8cc1Swenshuai.xi {
3736*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3737*53ee8cc1Swenshuai.xi return HAL_MVD_SetPrebufferSize(u8HalIdx,size);
3738*53ee8cc1Swenshuai.xi }
3739*53ee8cc1Swenshuai.xi
MDrv_MVD_REE_GetSHMInformation(MS_U32 u32Id,MS_VIRT * u32SHMAddr,MS_VIRT * u32VsyncSHMOffset)3740*53ee8cc1Swenshuai.xi void MDrv_MVD_REE_GetSHMInformation(MS_U32 u32Id, MS_VIRT* u32SHMAddr, MS_VIRT* u32VsyncSHMOffset)
3741*53ee8cc1Swenshuai.xi {
3742*53ee8cc1Swenshuai.xi *u32SHMAddr = HAL_VPU_EX_GetSHMAddr();
3743*53ee8cc1Swenshuai.xi
3744*53ee8cc1Swenshuai.xi #if defined(VDEC_FW30)
3745*53ee8cc1Swenshuai.xi *u32VsyncSHMOffset = HAL_MVD_GetVsyncAddrOffset();
3746*53ee8cc1Swenshuai.xi #elif defined(VDEC_FW31)
3747*53ee8cc1Swenshuai.xi *u32VsyncSHMOffset = HAL_VPU_EX_GetVsyncAddrOffset(u32Id);
3748*53ee8cc1Swenshuai.xi #else
3749*53ee8cc1Swenshuai.xi #error "controller.h should provide definition of VDEC_FW30 or VDEC_FW31"
3750*53ee8cc1Swenshuai.xi #endif
3751*53ee8cc1Swenshuai.xi }
3752*53ee8cc1Swenshuai.xi
MDrv_MVD_REE_GetVsyncExtShm(MS_U32 u32Id,MS_VIRT * u32SHMAddr,MS_VIRT * u32VsyncExtShmOffset)3753*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_REE_GetVsyncExtShm(MS_U32 u32Id, MS_VIRT* u32SHMAddr, MS_VIRT* u32VsyncExtShmOffset)
3754*53ee8cc1Swenshuai.xi {
3755*53ee8cc1Swenshuai.xi *u32SHMAddr = HAL_VPU_EX_GetSHMAddr();
3756*53ee8cc1Swenshuai.xi
3757*53ee8cc1Swenshuai.xi #if defined(VDEC_FW30)
3758*53ee8cc1Swenshuai.xi *u32VsyncExtShmOffset = HAL_MVD_GetVsyncExtAddrOffset();
3759*53ee8cc1Swenshuai.xi #elif defined(VDEC_FW31)
3760*53ee8cc1Swenshuai.xi *u32VsyncExtShmOffset = HAL_VPU_EX_GetVsyncExtAddrOffset(u32Id);
3761*53ee8cc1Swenshuai.xi #else
3762*53ee8cc1Swenshuai.xi #error "controller.h should provide definition of VDEC_FW30 or VDEC_FW31"
3763*53ee8cc1Swenshuai.xi #endif
3764*53ee8cc1Swenshuai.xi
3765*53ee8cc1Swenshuai.xi if (0 == *u32VsyncExtShmOffset)
3766*53ee8cc1Swenshuai.xi {
3767*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3768*53ee8cc1Swenshuai.xi }
3769*53ee8cc1Swenshuai.xi
3770*53ee8cc1Swenshuai.xi return E_MVD_RET_OK;
3771*53ee8cc1Swenshuai.xi }
3772*53ee8cc1Swenshuai.xi
3773*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3774*53ee8cc1Swenshuai.xi /// Set mvd/mpeg4 time_inc predict parameter...
3775*53ee8cc1Swenshuai.xi /// @param u32Para \b IN :
3776*53ee8cc1Swenshuai.xi /// -Arg0(enable), 1 for enable, default is 0.
3777*53ee8cc1Swenshuai.xi /// -Arg1(vop_time_incr_predict_count), 1 for predict once, 2 for twice...0xff for always guess the vop_time_incr even with the vol_header, default is 0...
3778*53ee8cc1Swenshuai.xi /// -Arg2(vop_time_incr_follow_vol_header), // 0 for follow vol_header...1 for bypass vol_header, default is 0...
3779*53ee8cc1Swenshuai.xi /// -Arg3, reserve...
3780*53ee8cc1Swenshuai.xi /// @return -E_MVD_RET_OK for success; E_MVD_RET_FAIL for failure.
3781*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_SetTimeIncPredictParam(MS_U32 u32Id,MS_U32 u32Para)3782*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetTimeIncPredictParam(MS_U32 u32Id,MS_U32 u32Para)
3783*53ee8cc1Swenshuai.xi {
3784*53ee8cc1Swenshuai.xi #if defined(CHIP_T2) || defined(CHIP_T7)
3785*53ee8cc1Swenshuai.xi return E_MVD_RET_FAIL;
3786*53ee8cc1Swenshuai.xi #else
3787*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3788*53ee8cc1Swenshuai.xi return HAL_MVD_SetTimeIncPredictParam(u8HalIdx,u32Para);
3789*53ee8cc1Swenshuai.xi #endif
3790*53ee8cc1Swenshuai.xi }
3791*53ee8cc1Swenshuai.xi
MDrv_MVD_SetDcodeTimeoutParam(MS_U32 u32Id,MS_BOOL enable,MS_U32 u32timeout)3792*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetDcodeTimeoutParam(MS_U32 u32Id,MS_BOOL enable,MS_U32 u32timeout)
3793*53ee8cc1Swenshuai.xi {
3794*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3795*53ee8cc1Swenshuai.xi return HAL_MVD_SetDecodeTimeoutParam(u8HalIdx,enable,u32timeout);
3796*53ee8cc1Swenshuai.xi }
3797*53ee8cc1Swenshuai.xi
MDrv_MVD_SetFramebufferAutoMode(MS_U32 u32Id,MS_BOOL bEnable)3798*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetFramebufferAutoMode(MS_U32 u32Id,MS_BOOL bEnable)
3799*53ee8cc1Swenshuai.xi {
3800*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3801*53ee8cc1Swenshuai.xi return _MVD_SetDynamicAllocateFB(u8HalIdx,bEnable);
3802*53ee8cc1Swenshuai.xi }
3803*53ee8cc1Swenshuai.xi
3804*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3805*53ee8cc1Swenshuai.xi /// set smooth rewind cmd to fw
3806*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3807*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_Set_Smooth_Rewind(MS_U32 u32Id,MS_U8 btype)3808*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_Set_Smooth_Rewind(MS_U32 u32Id, MS_U8 btype)
3809*53ee8cc1Swenshuai.xi {
3810*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3811*53ee8cc1Swenshuai.xi return HAL_MVD_Set_Smooth_Rewind(u8HalIdx, btype);
3812*53ee8cc1Swenshuai.xi }
3813*53ee8cc1Swenshuai.xi
3814*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3815*53ee8cc1Swenshuai.xi /// get mvd is alive or not
3816*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3817*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3818*53ee8cc1Swenshuai.xi
MDrv_MVD_IsAlive(MS_U32 u32Id)3819*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_IsAlive(MS_U32 u32Id)
3820*53ee8cc1Swenshuai.xi {
3821*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3822*53ee8cc1Swenshuai.xi return HAL_MVD_IsAlive(u8HalIdx);
3823*53ee8cc1Swenshuai.xi }
3824*53ee8cc1Swenshuai.xi
3825*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3826*53ee8cc1Swenshuai.xi /// enable/disable and set error tolerance value
3827*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3828*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_Set_Err_Tolerance(MS_U32 u32Id,MS_U16 u16Para)3829*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_Set_Err_Tolerance(MS_U32 u32Id, MS_U16 u16Para)
3830*53ee8cc1Swenshuai.xi {
3831*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3832*53ee8cc1Swenshuai.xi return HAL_MVD_Set_Err_Tolerance(u8HalIdx,u16Para);
3833*53ee8cc1Swenshuai.xi }
3834*53ee8cc1Swenshuai.xi
3835*53ee8cc1Swenshuai.xi
3836*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3837*53ee8cc1Swenshuai.xi /// enable/disable Auto insert dummy pattern in SLQ mode
3838*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3839*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_EnableAutoInsertDummyPattern(MS_U32 u32Id,MS_BOOL bEnable)3840*53ee8cc1Swenshuai.xi void MDrv_MVD_EnableAutoInsertDummyPattern(MS_U32 u32Id, MS_BOOL bEnable)
3841*53ee8cc1Swenshuai.xi {
3842*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3843*53ee8cc1Swenshuai.xi return HAL_MVD_EnableAutoInsertDummyPattern(u8HalIdx,bEnable);
3844*53ee8cc1Swenshuai.xi }
3845*53ee8cc1Swenshuai.xi
MDrv_MVD_Drop_One_PTS(MS_U32 u32Id)3846*53ee8cc1Swenshuai.xi void MDrv_MVD_Drop_One_PTS(MS_U32 u32Id)
3847*53ee8cc1Swenshuai.xi {
3848*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3849*53ee8cc1Swenshuai.xi return HAL_MVD_Drop_One_PTS(u8HalIdx);
3850*53ee8cc1Swenshuai.xi }
MDrv_MVD_PVR_Seamless_mode(MS_U32 u32Id,MS_U8 u8Arg)3851*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_PVR_Seamless_mode(MS_U32 u32Id, MS_U8 u8Arg)
3852*53ee8cc1Swenshuai.xi {
3853*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3854*53ee8cc1Swenshuai.xi return HAL_MVD_PVR_Seamless_mode(u8HalIdx,u8Arg);
3855*53ee8cc1Swenshuai.xi }
3856*53ee8cc1Swenshuai.xi
MDrv_MVD_SetDVXCShmAddr(MS_U32 u32Id,MS_PHY u32FWBaseAddr,MS_PHY u32DVXCShmAddr)3857*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetDVXCShmAddr(MS_U32 u32Id, MS_PHY u32FWBaseAddr, MS_PHY u32DVXCShmAddr)
3858*53ee8cc1Swenshuai.xi {
3859*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3860*53ee8cc1Swenshuai.xi return HAL_MVD_SetDVXCShmAddr(u8HalIdx,u32FWBaseAddr,u32DVXCShmAddr);
3861*53ee8cc1Swenshuai.xi }
3862*53ee8cc1Swenshuai.xi
3863*53ee8cc1Swenshuai.xi
3864*53ee8cc1Swenshuai.xi // Please set it before cmd "CMD_ENABLE_LAST_FRAME_SHOW"
3865*53ee8cc1Swenshuai.xi // 0(default): for original just assert the last_frame_show_done when push to dispQ
3866*53ee8cc1Swenshuai.xi // 1: for strict qualify the last_frame_show_done after the last_frame been displayed by mvop, 20120309
MDrv_MVD_SetDispFinishMode(MS_U32 u32Id,MS_U8 u8Mode)3867*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_SetDispFinishMode(MS_U32 u32Id,MS_U8 u8Mode)
3868*53ee8cc1Swenshuai.xi {
3869*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3870*53ee8cc1Swenshuai.xi return HAL_MVD_SetDisplayFinishMode(u8HalIdx,u8Mode);
3871*53ee8cc1Swenshuai.xi }
3872*53ee8cc1Swenshuai.xi
MDrv_MVD_Set_MBX_param(MS_U8 u8APIMbxMsgClass)3873*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_Set_MBX_param(MS_U8 u8APIMbxMsgClass)
3874*53ee8cc1Swenshuai.xi {
3875*53ee8cc1Swenshuai.xi return HAL_VPU_Set_MBX_param(u8APIMbxMsgClass);
3876*53ee8cc1Swenshuai.xi }
3877*53ee8cc1Swenshuai.xi
MDrv_MVD_SetDmxFrameRate(MS_U32 u32Id,MS_U32 u32Value)3878*53ee8cc1Swenshuai.xi void MDrv_MVD_SetDmxFrameRate(MS_U32 u32Id,MS_U32 u32Value)
3879*53ee8cc1Swenshuai.xi {
3880*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3881*53ee8cc1Swenshuai.xi HAL_MVD_SetDmxFrameRate(u8HalIdx,u32Value);
3882*53ee8cc1Swenshuai.xi }
3883*53ee8cc1Swenshuai.xi
MDrv_MVD_SetDmxFrameRateBase(MS_U32 u32Id,MS_U32 u32Value)3884*53ee8cc1Swenshuai.xi void MDrv_MVD_SetDmxFrameRateBase(MS_U32 u32Id,MS_U32 u32Value)
3885*53ee8cc1Swenshuai.xi {
3886*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3887*53ee8cc1Swenshuai.xi HAL_MVD_SetDmxFrameRateBase(u8HalIdx,u32Value);
3888*53ee8cc1Swenshuai.xi }
MDrv_MVD_Dynamic_FB_Mode(MS_BOOL bEnable,MS_PHY u32Address,MS_U32 u32Size)3889*53ee8cc1Swenshuai.xi void MDrv_MVD_Dynamic_FB_Mode(MS_BOOL bEnable,MS_PHY u32Address,MS_U32 u32Size)
3890*53ee8cc1Swenshuai.xi {
3891*53ee8cc1Swenshuai.xi HAL_VPU_EX_DynamicFBMode(bEnable,u32Address,u32Size);
3892*53ee8cc1Swenshuai.xi }
3893*53ee8cc1Swenshuai.xi
MDrv_MVD_SetCMAInformation(void * cmaInitParam)3894*53ee8cc1Swenshuai.xi void MDrv_MVD_SetCMAInformation(void* cmaInitParam)
3895*53ee8cc1Swenshuai.xi {
3896*53ee8cc1Swenshuai.xi pMVDDrvContext->bCMAUsed = TRUE;
3897*53ee8cc1Swenshuai.xi memcpy((void*)(&pMVDDrvContext->cmaInitParam),cmaInitParam,sizeof(struct CMA_Pool_Init_Param));
3898*53ee8cc1Swenshuai.xi HAL_MVD_SetCMAInformation(cmaInitParam);
3899*53ee8cc1Swenshuai.xi }
MDrv_MVD_ReleaseFreeStream(MS_U32 u32Id)3900*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_ReleaseFreeStream(MS_U32 u32Id)
3901*53ee8cc1Swenshuai.xi {
3902*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx =_MVD_GET_IDX(u32Id);
3903*53ee8cc1Swenshuai.xi return HAL_VPU_EX_ReleaseFreeStream(u8HalIdx);
3904*53ee8cc1Swenshuai.xi }
3905*53ee8cc1Swenshuai.xi
3906*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3907*53ee8cc1Swenshuai.xi /// Enable FW PTS abnormal detect.
3908*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3909*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_EnablePTSDetector(MS_U32 u32Id,MS_BOOL bEn)3910*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_EnablePTSDetector(MS_U32 u32Id, MS_BOOL bEn)
3911*53ee8cc1Swenshuai.xi {
3912*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
3913*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3914*53ee8cc1Swenshuai.xi return HAL_MVD_EnablePTSDetector(u8HalIdx, bEn);
3915*53ee8cc1Swenshuai.xi }
3916*53ee8cc1Swenshuai.xi
MDrv_MVD_SetAVSyncDispAutoDrop(MS_U32 u32Id,MS_BOOL bEnable)3917*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetAVSyncDispAutoDrop(MS_U32 u32Id,MS_BOOL bEnable)
3918*53ee8cc1Swenshuai.xi {
3919*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3920*53ee8cc1Swenshuai.xi return HAL_MVD_SetAVSyncDispAutoDrop(u8HalIdx,bEnable);
3921*53ee8cc1Swenshuai.xi }
3922*53ee8cc1Swenshuai.xi
MDrv_MVD_SetDynmcDispPath(MS_U32 u32Id,MS_BOOL bConnect,MVD_DISPLAY_PATH eValue,MS_BOOL bPreSet)3923*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_SetDynmcDispPath(MS_U32 u32Id,MS_BOOL bConnect,MVD_DISPLAY_PATH eValue,MS_BOOL bPreSet)
3924*53ee8cc1Swenshuai.xi {
3925*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3926*53ee8cc1Swenshuai.xi return HAL_MVD_SetDynmcDispPath(u8HalIdx,bConnect,eValue,bPreSet);
3927*53ee8cc1Swenshuai.xi }
3928*53ee8cc1Swenshuai.xi
MDrv_MVD_PreConnectInputTsp(MS_U32 u32Id,MS_BOOL bEnable,MVD_INPUT_TSP eInputTsp,MVD_Original_Stream eStream)3929*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_PreConnectInputTsp(MS_U32 u32Id, MS_BOOL bEnable, MVD_INPUT_TSP eInputTsp, MVD_Original_Stream eStream)
3930*53ee8cc1Swenshuai.xi {
3931*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3932*53ee8cc1Swenshuai.xi return HAL_MVD_PreConnectInputTsp(u8HalIdx, bEnable, eInputTsp, eStream);
3933*53ee8cc1Swenshuai.xi }
3934*53ee8cc1Swenshuai.xi
3935*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3936*53ee8cc1Swenshuai.xi /// Disable PB Frame Mode
3937*53ee8cc1Swenshuai.xi /// @return -TRUE for success; FALSE for failure.
3938*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_DisablePBFrameMode(MS_U32 u32Id,MS_BOOL bEn)3939*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_DisablePBFrameMode(MS_U32 u32Id, MS_BOOL bEn)
3940*53ee8cc1Swenshuai.xi {
3941*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
3942*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3943*53ee8cc1Swenshuai.xi return HAL_MVD_DisablePBFrameMode(u8HalIdx, bEn);
3944*53ee8cc1Swenshuai.xi }
3945*53ee8cc1Swenshuai.xi
MDrv_MVD_CheckFreeStream(MVD_Original_Stream eStream)3946*53ee8cc1Swenshuai.xi MS_U8 MDrv_MVD_CheckFreeStream(MVD_Original_Stream eStream)
3947*53ee8cc1Swenshuai.xi {
3948*53ee8cc1Swenshuai.xi return HAL_VPU_EX_CheckFreeStream(eStream);
3949*53ee8cc1Swenshuai.xi }
3950*53ee8cc1Swenshuai.xi
MDrv_MVD_Set_SlowSyncParam(MS_U32 u32Id,MS_U8 u8RepeatPeriod,MS_U8 u8DropPeriod)3951*53ee8cc1Swenshuai.xi E_MVD_Result MDrv_MVD_Set_SlowSyncParam(MS_U32 u32Id, MS_U8 u8RepeatPeriod,MS_U8 u8DropPeriod)
3952*53ee8cc1Swenshuai.xi {
3953*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3954*53ee8cc1Swenshuai.xi return HAL_MVD_Set_SlowSyncParam(u8HalIdx,u8RepeatPeriod,u8DropPeriod);
3955*53ee8cc1Swenshuai.xi }
MDrv_MVD_VariableFrameRate(MS_U32 u32Id)3956*53ee8cc1Swenshuai.xi MS_BOOL MDrv_MVD_VariableFrameRate(MS_U32 u32Id)
3957*53ee8cc1Swenshuai.xi {
3958*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
3959*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3960*53ee8cc1Swenshuai.xi return HAL_MVD_VariableFrameRate(u8HalIdx);
3961*53ee8cc1Swenshuai.xi }
3962*53ee8cc1Swenshuai.xi
3963*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3964*53ee8cc1Swenshuai.xi /// Disable PB Frame Mode
3965*53ee8cc1Swenshuai.xi /// @return Min pre buffer size
3966*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_MVD_EX_GetMinTspDataSize(MS_U32 u32Id)3967*53ee8cc1Swenshuai.xi MS_U32 MDrv_MVD_EX_GetMinTspDataSize(MS_U32 u32Id)
3968*53ee8cc1Swenshuai.xi {
3969*53ee8cc1Swenshuai.xi MVD_FUNC_ENTRY();
3970*53ee8cc1Swenshuai.xi MS_U8 u8HalIdx = MVD_GetHalIdx(u32Id);
3971*53ee8cc1Swenshuai.xi return HAL_MVD_GetMinTspDataSize(u8HalIdx);
3972*53ee8cc1Swenshuai.xi }
3973*53ee8cc1Swenshuai.xi
3974*53ee8cc1Swenshuai.xi #endif
3975