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