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) 2006-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 // (uMStar Confidential Informationv) by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi
95*53ee8cc1Swenshuai.xi #ifndef __UBOOT__
96*53ee8cc1Swenshuai.xi #include <stdio.h>
97*53ee8cc1Swenshuai.xi #include <string.h>
98*53ee8cc1Swenshuai.xi #include <fcntl.h>
99*53ee8cc1Swenshuai.xi #endif
100*53ee8cc1Swenshuai.xi
101*53ee8cc1Swenshuai.xi #include "MFE_chip.h"
102*53ee8cc1Swenshuai.xi #if defined(_MFE_UTOPIA_)
103*53ee8cc1Swenshuai.xi #include "MsCommon.h"
104*53ee8cc1Swenshuai.xi #include "MsIRQ.h"
105*53ee8cc1Swenshuai.xi #include "MsOS.h"
106*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
107*53ee8cc1Swenshuai.xi #include "drvMIU.h"
108*53ee8cc1Swenshuai.xi #endif
109*53ee8cc1Swenshuai.xi #include "mfe_type.h"
110*53ee8cc1Swenshuai.xi #include "mfe_common.h"
111*53ee8cc1Swenshuai.xi #include "madp_ms_dprintf.h"
112*53ee8cc1Swenshuai.xi
113*53ee8cc1Swenshuai.xi #include "mdrv_mfe_io.h"
114*53ee8cc1Swenshuai.xi #include "drv_mfe_st.h"
115*53ee8cc1Swenshuai.xi #include "madp_mfe.h"
116*53ee8cc1Swenshuai.xi #include "apiVOIPMFE.h"
117*53ee8cc1Swenshuai.xi #if defined(_SUPPORT_JPE_)
118*53ee8cc1Swenshuai.xi #include "Exif.h"
119*53ee8cc1Swenshuai.xi #include "jcmarker.h"
120*53ee8cc1Swenshuai.xi #endif
121*53ee8cc1Swenshuai.xi
122*53ee8cc1Swenshuai.xi #if defined(__MFE_G2__)
123*53ee8cc1Swenshuai.xi #include "riumap.h"
124*53ee8cc1Swenshuai.xi #endif
125*53ee8cc1Swenshuai.xi
126*53ee8cc1Swenshuai.xi #include "madp_mfe_int.h"
127*53ee8cc1Swenshuai.xi
128*53ee8cc1Swenshuai.xi #include "apiMFE_priv.h"
129*53ee8cc1Swenshuai.xi
130*53ee8cc1Swenshuai.xi
131*53ee8cc1Swenshuai.xi
132*53ee8cc1Swenshuai.xi #define CEILING_ALIGN(value, align) (((MS_U32)(value)+((align)-1UL)) & ~((align)-1UL))
133*53ee8cc1Swenshuai.xi
134*53ee8cc1Swenshuai.xi #if defined(_MFE_UTOPIA_)
135*53ee8cc1Swenshuai.xi extern void MDrv_MFE_ISR(InterruptNum eIntNum);
136*53ee8cc1Swenshuai.xi #endif
137*53ee8cc1Swenshuai.xi
138*53ee8cc1Swenshuai.xi #define ALIGN_TO_256(f) (((f) + 255UL) & ~255UL)
139*53ee8cc1Swenshuai.xi #define mfe_fd 0UL
140*53ee8cc1Swenshuai.xi
141*53ee8cc1Swenshuai.xi PVR_Info* appPVR_Info;
142*53ee8cc1Swenshuai.xi
MAdp_MFE_Change_State(MFE_STATE * mfe_state,MFE_STATE in_state)143*53ee8cc1Swenshuai.xi static MS_BOOL MAdp_MFE_Change_State(MFE_STATE* mfe_state,MFE_STATE in_state)
144*53ee8cc1Swenshuai.xi {
145*53ee8cc1Swenshuai.xi
146*53ee8cc1Swenshuai.xi *mfe_state = in_state;
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi return TRUE;
149*53ee8cc1Swenshuai.xi }
150*53ee8cc1Swenshuai.xi
my_malloc(MS_VIRT * ppVAStart,MS_U32 size,const MS_S8 * msg)151*53ee8cc1Swenshuai.xi MS_U8 *my_malloc(MS_VIRT* ppVAStart,MS_U32 size,const MS_S8* msg)
152*53ee8cc1Swenshuai.xi {
153*53ee8cc1Swenshuai.xi MS_U8 *ret = (MS_U8 *)*ppVAStart;
154*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2, "my_malloc[%s]: VA_START: %p, SIZE: 0x%x\n", msg, ret, (unsigned int)size);
155*53ee8cc1Swenshuai.xi
156*53ee8cc1Swenshuai.xi #ifdef MEM_CHECK
157*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2,"my_malloc:Check mem set.\n");
158*53ee8cc1Swenshuai.xi memset(ret, 0xFF, size);
159*53ee8cc1Swenshuai.xi sleep(100000);
160*53ee8cc1Swenshuai.xi #endif
161*53ee8cc1Swenshuai.xi
162*53ee8cc1Swenshuai.xi *ppVAStart += size;
163*53ee8cc1Swenshuai.xi return ret;
164*53ee8cc1Swenshuai.xi }
165*53ee8cc1Swenshuai.xi
166*53ee8cc1Swenshuai.xi
MAdp_MFE_Proc_nonThread(MEMMAP_CUR_t input_frame)167*53ee8cc1Swenshuai.xi static MS_BOOL MAdp_MFE_Proc_nonThread(MEMMAP_CUR_t input_frame)
168*53ee8cc1Swenshuai.xi {
169*53ee8cc1Swenshuai.xi
170*53ee8cc1Swenshuai.xi MS_U32 nDispOrder=0; // Driver is responsible for frame buffer re-ordering
171*53ee8cc1Swenshuai.xi MS_VIRT Vaddr;
172*53ee8cc1Swenshuai.xi MS_S32 Vsize=0;
173*53ee8cc1Swenshuai.xi BITSFRAME_INFO bitsinfo;
174*53ee8cc1Swenshuai.xi #if defined(_SUPPORT_JPE_)
175*53ee8cc1Swenshuai.xi MS_S32 fdc_size = 0;
176*53ee8cc1Swenshuai.xi #endif
177*53ee8cc1Swenshuai.xi memset(&bitsinfo,0x0,sizeof(BITSFRAME_INFO));
178*53ee8cc1Swenshuai.xi #ifdef _MFE_M1_
179*53ee8cc1Swenshuai.xi //get last frame DropFlag.
180*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GET_DROPFLAG, (MS_VIRT)(&appPVR_Info->nDropFlag));
181*53ee8cc1Swenshuai.xi
182*53ee8cc1Swenshuai.xi //get current frame SkipFlag
183*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GET_SKIPFLAG, (MS_VIRT)(&appPVR_Info->nSkipFlag));
184*53ee8cc1Swenshuai.xi #endif
185*53ee8cc1Swenshuai.xi //if(appPVR_Info->nDropFlag==0)
186*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GET_DISPORDER, (MS_VIRT)&nDispOrder);
187*53ee8cc1Swenshuai.xi #if defined(_MFE_UTOPIA_)
188*53ee8cc1Swenshuai.xi if(appPVR_Info->enableISR) {
189*53ee8cc1Swenshuai.xi mfe_open_int();
190*53ee8cc1Swenshuai.xi MsOS_EnableInterrupt((InterruptNum)E_INT_IRQ_MFE);
191*53ee8cc1Swenshuai.xi }
192*53ee8cc1Swenshuai.xi #endif
193*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_ENC_ONEFRAME, (MS_VIRT)&input_frame);
194*53ee8cc1Swenshuai.xi
195*53ee8cc1Swenshuai.xi if(appPVR_Info->nSkipFlag==1) {
196*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L3,"SkipFrame\n");
197*53ee8cc1Swenshuai.xi #ifndef _GenSkipHeader_
198*53ee8cc1Swenshuai.xi return TRUE;
199*53ee8cc1Swenshuai.xi #endif
200*53ee8cc1Swenshuai.xi }
201*53ee8cc1Swenshuai.xi Vsize = 0;
202*53ee8cc1Swenshuai.xi #if defined(_SUPPORT_JPE_)
203*53ee8cc1Swenshuai.xi if(appPVR_Info->nCodecType == JPEG_ENC) {//jpeg
204*53ee8cc1Swenshuai.xi //FDC_t fdc;
205*53ee8cc1Swenshuai.xi MS_S32 q_table[128];
206*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GET_QTABLE, (MS_VIRT)&q_table);
207*53ee8cc1Swenshuai.xi // set_fdc(appPVR_Info->nDispWidth,appPVR_Info->nDispHeight);
208*53ee8cc1Swenshuai.xi get_fdc(appPVR_Info->BitstreamOutBuffer.miuPointer,&fdc_size,appPVR_Info->nDispWidth,appPVR_Info->nDispHeight,
209*53ee8cc1Swenshuai.xi &q_table[0],&q_table[64],appPVR_Info->exif_enable);
210*53ee8cc1Swenshuai.xi
211*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L3,"header size = 0x%x\n",fdc_size);
212*53ee8cc1Swenshuai.xi //memcpy(appPVR_Info->BitstreamOutBuffer.miuPointer,&fdc,fdc_size);
213*53ee8cc1Swenshuai.xi Vsize = fdc_size;
214*53ee8cc1Swenshuai.xi }
215*53ee8cc1Swenshuai.xi #endif
216*53ee8cc1Swenshuai.xi #ifdef _SW_BUF_MODE_
217*53ee8cc1Swenshuai.xi if(appPVR_Info->m_bFrameMode == 0) {
218*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L3,"fake rowdone\n");
219*53ee8cc1Swenshuai.xi mfe_fake_row_mode(input_frame,appPVR_Info->nBufWidth,appPVR_Info->nBufHeight);
220*53ee8cc1Swenshuai.xi }
221*53ee8cc1Swenshuai.xi #endif
222*53ee8cc1Swenshuai.xi // MsOS_DelayTask(20); //delay 2 ms
223*53ee8cc1Swenshuai.xi //get bits
224*53ee8cc1Swenshuai.xi
225*53ee8cc1Swenshuai.xi while(1) {
226*53ee8cc1Swenshuai.xi MFE_CONFIG* pConfig = (MFE_CONFIG *)appPVR_Info->mfe_drvHandle;
227*53ee8cc1Swenshuai.xi OutStream* pStream = &(pConfig->m_OutStream);
228*53ee8cc1Swenshuai.xi
229*53ee8cc1Swenshuai.xi if (pConfig->encodeDummyFrame)
230*53ee8cc1Swenshuai.xi {
231*53ee8cc1Swenshuai.xi bitsinfo.size = pStream->m_nByteCount;
232*53ee8cc1Swenshuai.xi bitsinfo.status = BITS_INFO_FRAMEDONE;
233*53ee8cc1Swenshuai.xi bitsinfo.voptype = P_VOP;
234*53ee8cc1Swenshuai.xi Vaddr = (MS_VIRT)pStream->m_pbFrameBuffer;
235*53ee8cc1Swenshuai.xi }
236*53ee8cc1Swenshuai.xi else
237*53ee8cc1Swenshuai.xi {
238*53ee8cc1Swenshuai.xi #ifdef _GenSkipHeader_
239*53ee8cc1Swenshuai.xi if (appPVR_Info->nSkipFlag == 0)
240*53ee8cc1Swenshuai.xi #endif
241*53ee8cc1Swenshuai.xi {
242*53ee8cc1Swenshuai.xi mfe_wait_int(appPVR_Info->enableISR);
243*53ee8cc1Swenshuai.xi }
244*53ee8cc1Swenshuai.xi
245*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GETBITS, (MS_VIRT)(&bitsinfo));
246*53ee8cc1Swenshuai.xi MS_ASSERT(bitsinfo.size >= 0);
247*53ee8cc1Swenshuai.xi if(appPVR_Info->enableSecurityMode){
248*53ee8cc1Swenshuai.xi Vsize = bitsinfo.size;
249*53ee8cc1Swenshuai.xi goto NONCOPY;
250*53ee8cc1Swenshuai.xi }
251*53ee8cc1Swenshuai.xi if (appPVR_Info->reserved0) // cached memory
252*53ee8cc1Swenshuai.xi Vaddr = (MS_VIRT) MAdp_MPool_PA2KSEG0(bitsinfo.miuAddress+appPVR_Info->MfeApiInfo.miu_offset);
253*53ee8cc1Swenshuai.xi else // non-cached memory
254*53ee8cc1Swenshuai.xi Vaddr = (MS_VIRT) MAdp_MPool_PA2KSEG1(bitsinfo.miuAddress+appPVR_Info->MfeApiInfo.miu_offset);
255*53ee8cc1Swenshuai.xi }
256*53ee8cc1Swenshuai.xi
257*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L3, "bitsinfo.miuAddress = 0x%x, Vaddr = 0x"MPRI_VIRT", size = 0x%x\n", (unsigned int)bitsinfo.miuAddress, (ptrdiff_t)Vaddr, (unsigned int)bitsinfo.size);
258*53ee8cc1Swenshuai.xi if((appPVR_Info->BitstreamOutBufferSize-Vsize) < bitsinfo.size) {
259*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"BitstreamOutBufferSize is too small\n");
260*53ee8cc1Swenshuai.xi return FALSE;
261*53ee8cc1Swenshuai.xi }
262*53ee8cc1Swenshuai.xi if (appPVR_Info->reserved0) { // cached memory
263*53ee8cc1Swenshuai.xi MsOS_Dcache_Flush(Vaddr, CEILING_ALIGN(bitsinfo.size, 16UL));
264*53ee8cc1Swenshuai.xi }
265*53ee8cc1Swenshuai.xi memcpy(appPVR_Info->BitstreamOutBuffer.miuPointer +Vsize, (MS_U8 *)Vaddr, bitsinfo.size);
266*53ee8cc1Swenshuai.xi Vsize += bitsinfo.size;
267*53ee8cc1Swenshuai.xi
268*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L3, "memcpy 0x%x, total 0x%x\n", (unsigned int)bitsinfo.size, (unsigned int)Vsize);
269*53ee8cc1Swenshuai.xi if(bitsinfo.status == BITS_INFO_FRAMEDONE) {//frame done
270*53ee8cc1Swenshuai.xi if(appPVR_Info->enableCABAC) {
271*53ee8cc1Swenshuai.xi //CABAC stuffing byte
272*53ee8cc1Swenshuai.xi if(bitsinfo.stuffing_bytes!=0) {
273*53ee8cc1Swenshuai.xi MS_S32 i;
274*53ee8cc1Swenshuai.xi MS_U8 *obufp = appPVR_Info->BitstreamOutBuffer.miuPointer + Vsize;
275*53ee8cc1Swenshuai.xi
276*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L3, "CABAC stuffing byte 0x%x\n", (unsigned int)bitsinfo.stuffing_bytes);
277*53ee8cc1Swenshuai.xi for(i=0;i<bitsinfo.stuffing_bytes/3;i++) {
278*53ee8cc1Swenshuai.xi *obufp++ = 0x0;
279*53ee8cc1Swenshuai.xi *obufp++ = 0x0;
280*53ee8cc1Swenshuai.xi *obufp++ = 0x3;
281*53ee8cc1Swenshuai.xi }
282*53ee8cc1Swenshuai.xi for(i=0;i<bitsinfo.stuffing_bytes%3;i++) {
283*53ee8cc1Swenshuai.xi *obufp++ = 0x0;
284*53ee8cc1Swenshuai.xi }
285*53ee8cc1Swenshuai.xi
286*53ee8cc1Swenshuai.xi }
287*53ee8cc1Swenshuai.xi Vsize += bitsinfo.stuffing_bytes;
288*53ee8cc1Swenshuai.xi }
289*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L3,"frame done\n");
290*53ee8cc1Swenshuai.xi break;
291*53ee8cc1Swenshuai.xi }
292*53ee8cc1Swenshuai.xi else if(bitsinfo.status == BITS_INFO_BUFFULL) {
293*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L3,"frame full\n");
294*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_CLEAR_BITSBUF, (MS_VIRT)1);
295*53ee8cc1Swenshuai.xi }
296*53ee8cc1Swenshuai.xi else if (bitsinfo.status == BITS_INFO_IMG_BUFFULL){
297*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"input buf full\n");
298*53ee8cc1Swenshuai.xi return FALSE;
299*53ee8cc1Swenshuai.xi } else {
300*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"[MFE]unknown state\n");
301*53ee8cc1Swenshuai.xi return FALSE;
302*53ee8cc1Swenshuai.xi }
303*53ee8cc1Swenshuai.xi }
304*53ee8cc1Swenshuai.xi
305*53ee8cc1Swenshuai.xi NONCOPY:
306*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_CLEAR_BITSBUF, (MS_VIRT)1);
307*53ee8cc1Swenshuai.xi appPVR_Info->BitstreamOutBuffer.size = Vsize;
308*53ee8cc1Swenshuai.xi if(Vsize)
309*53ee8cc1Swenshuai.xi appPVR_Info->g_StreamCallBackFunc(appPVR_Info->g_pCustomCtx, (MS_S32)bitsinfo.voptype,
310*53ee8cc1Swenshuai.xi appPVR_Info->BitstreamOutBuffer.miuPointer, Vsize, 0x3);
311*53ee8cc1Swenshuai.xi
312*53ee8cc1Swenshuai.xi appPVR_Info->g_CleanCallBackFunc(1, (MS_VIRT)&input_frame);
313*53ee8cc1Swenshuai.xi
314*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2, "frame size = 0x%x\n", (unsigned int)appPVR_Info->BitstreamOutBuffer.size);
315*53ee8cc1Swenshuai.xi
316*53ee8cc1Swenshuai.xi #if (DEBUG_LEVEL & ADP_L3)
317*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GET_DROPFLAG, (MS_VIRT)(&appPVR_Info->nDropFlag));
318*53ee8cc1Swenshuai.xi if(appPVR_Info->nDropFlag)
319*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L3,"Dropframe.");
320*53ee8cc1Swenshuai.xi #endif
321*53ee8cc1Swenshuai.xi return TRUE;
322*53ee8cc1Swenshuai.xi }
323*53ee8cc1Swenshuai.xi
MFE_SetRIU_Base(void)324*53ee8cc1Swenshuai.xi MS_BOOL MFE_SetRIU_Base(void)
325*53ee8cc1Swenshuai.xi {
326*53ee8cc1Swenshuai.xi
327*53ee8cc1Swenshuai.xi #ifdef __MFE_G2__
328*53ee8cc1Swenshuai.xi MS_VIRT u32RiuBaseAdd=0;
329*53ee8cc1Swenshuai.xi MsIoMapInit();
330*53ee8cc1Swenshuai.xi u32RiuBaseAdd = MsIoMapGetRiuBase(RIUBASE_MFE0);
331*53ee8cc1Swenshuai.xi
332*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2,"MFE Init u32RiuBaseAdd = 0x%X\n", (MS_U32)u32RiuBaseAdd);
333*53ee8cc1Swenshuai.xi #elif defined(WIN32)
334*53ee8cc1Swenshuai.xi MS_VIRT u32RiuBaseAdd=0xa80;
335*53ee8cc1Swenshuai.xi MS_PHY u32NonPMBankSize=0;
336*53ee8cc1Swenshuai.xi #else
337*53ee8cc1Swenshuai.xi MS_VIRT u32RiuBaseAdd=0;
338*53ee8cc1Swenshuai.xi MS_PHY u32NonPMBankSize=0;
339*53ee8cc1Swenshuai.xi
340*53ee8cc1Swenshuai.xi if( !MDrv_MMIO_GetBASE( &u32RiuBaseAdd, &u32NonPMBankSize, MS_MODULE_HW)){
341*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"MFE Init Err: MMIO_GetBASE failure\n");
342*53ee8cc1Swenshuai.xi return FALSE;
343*53ee8cc1Swenshuai.xi }
344*53ee8cc1Swenshuai.xi
345*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2, "MFE Init u32RiuBaseAdd = 0x%tx, u32NonPMBankSize = 0x%tx\n",
346*53ee8cc1Swenshuai.xi (ptrdiff_t)u32RiuBaseAdd, (ptrdiff_t)u32NonPMBankSize);
347*53ee8cc1Swenshuai.xi //MDrv_MFE_SetOSRegBase(u32RiuBaseAdd);
348*53ee8cc1Swenshuai.xi #endif
349*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_SET_RIU_BASE, u32RiuBaseAdd);
350*53ee8cc1Swenshuai.xi
351*53ee8cc1Swenshuai.xi return TRUE;
352*53ee8cc1Swenshuai.xi
353*53ee8cc1Swenshuai.xi }
354*53ee8cc1Swenshuai.xi
355*53ee8cc1Swenshuai.xi
MApi_MFE_CompressOnePicture_ex(MEMMAP_CUR_t YUVPlane,MS_BOOL bForceIframe)356*53ee8cc1Swenshuai.xi MS_BOOL MApi_MFE_CompressOnePicture_ex(MEMMAP_CUR_t YUVPlane, MS_BOOL bForceIframe)
357*53ee8cc1Swenshuai.xi {
358*53ee8cc1Swenshuai.xi return _MApi_MFE_CompressOnePicture(appPVR_Info, YUVPlane, bForceIframe);
359*53ee8cc1Swenshuai.xi }
360*53ee8cc1Swenshuai.xi
MApi_MFE_Encode(void)361*53ee8cc1Swenshuai.xi MS_BOOL MApi_MFE_Encode(void)
362*53ee8cc1Swenshuai.xi {
363*53ee8cc1Swenshuai.xi return _MApi_MFE_Encode(appPVR_Info);
364*53ee8cc1Swenshuai.xi }
365*53ee8cc1Swenshuai.xi
MApi_MFE_DeInitialize(void)366*53ee8cc1Swenshuai.xi MS_BOOL MApi_MFE_DeInitialize(void)
367*53ee8cc1Swenshuai.xi {
368*53ee8cc1Swenshuai.xi
369*53ee8cc1Swenshuai.xi // old api didnot support multi instance, so always power off mfe when deInit.
370*53ee8cc1Swenshuai.xi POWERON_t power_Info;
371*53ee8cc1Swenshuai.xi power_Info.is_off = 1;
372*53ee8cc1Swenshuai.xi power_Info.clock_level = MFE_CLK_FAST;
373*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)NULL, MFE_IOC_POWEROFF, (MS_VIRT)&power_Info);
374*53ee8cc1Swenshuai.xi return _MApi_MFE_DeInit(appPVR_Info);
375*53ee8cc1Swenshuai.xi }
376*53ee8cc1Swenshuai.xi
377*53ee8cc1Swenshuai.xi
MApi_MFE_GetState(void)378*53ee8cc1Swenshuai.xi MFE_STATE MApi_MFE_GetState(void)
379*53ee8cc1Swenshuai.xi {
380*53ee8cc1Swenshuai.xi return appPVR_Info->mfe_state;
381*53ee8cc1Swenshuai.xi }
MApi_MFE_GetVOL_ex(void * header_info)382*53ee8cc1Swenshuai.xi MS_BOOL MApi_MFE_GetVOL_ex(void *header_info)
383*53ee8cc1Swenshuai.xi {
384*53ee8cc1Swenshuai.xi return _MApi_MFE_GetVOL(appPVR_Info,header_info);
385*53ee8cc1Swenshuai.xi }
386*53ee8cc1Swenshuai.xi
MApi_MFE_Initialize_ex(PVR_Info * in_Info,StreamCallback out_cb,CleanCallback mfe_CleanBufStatus,void * ctx)387*53ee8cc1Swenshuai.xi MS_BOOL MApi_MFE_Initialize_ex(PVR_Info* in_Info,StreamCallback out_cb,CleanCallback
388*53ee8cc1Swenshuai.xi mfe_CleanBufStatus, void *ctx)
389*53ee8cc1Swenshuai.xi {
390*53ee8cc1Swenshuai.xi
391*53ee8cc1Swenshuai.xi MS_BOOL ret;
392*53ee8cc1Swenshuai.xi ret = _MApi_MFE_Init(in_Info);
393*53ee8cc1Swenshuai.xi if(ret == FALSE)
394*53ee8cc1Swenshuai.xi return FALSE;
395*53ee8cc1Swenshuai.xi appPVR_Info->g_pCustomCtx = ctx;
396*53ee8cc1Swenshuai.xi appPVR_Info->g_StreamCallBackFunc = out_cb;
397*53ee8cc1Swenshuai.xi appPVR_Info->g_CleanCallBackFunc = mfe_CleanBufStatus;
398*53ee8cc1Swenshuai.xi
399*53ee8cc1Swenshuai.xi return ret;
400*53ee8cc1Swenshuai.xi
401*53ee8cc1Swenshuai.xi }
402*53ee8cc1Swenshuai.xi
403*53ee8cc1Swenshuai.xi
MApi_MFE_SetConfig(MFE_ENC_CONF conf_type,void * value)404*53ee8cc1Swenshuai.xi MS_BOOL MApi_MFE_SetConfig(MFE_ENC_CONF conf_type, void *value)
405*53ee8cc1Swenshuai.xi {
406*53ee8cc1Swenshuai.xi
407*53ee8cc1Swenshuai.xi MS_S32 set_value;
408*53ee8cc1Swenshuai.xi if(appPVR_Info->mfe_state != MFE_Idle) {
409*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"state check error.[%d]\n",appPVR_Info->mfe_state);
410*53ee8cc1Swenshuai.xi return FALSE;
411*53ee8cc1Swenshuai.xi }
412*53ee8cc1Swenshuai.xi
413*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Busy);
414*53ee8cc1Swenshuai.xi
415*53ee8cc1Swenshuai.xi switch (conf_type) {
416*53ee8cc1Swenshuai.xi case MFE_ENC_SETCONF_FRAME_TYPE:
417*53ee8cc1Swenshuai.xi set_value = (*((MS_S32*) value));
418*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L1, "MApi_MFE_SetConfig %d\n", (int)set_value);
419*53ee8cc1Swenshuai.xi if(set_value == I_VOP)
420*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_SET_FORCEDI, (MS_VIRT)NULL);
421*53ee8cc1Swenshuai.xi break;
422*53ee8cc1Swenshuai.xi case MFE_ENC_SETCONF_CHANGE_FRAME_RATE:
423*53ee8cc1Swenshuai.xi set_value = (*((MS_S32*) value));
424*53ee8cc1Swenshuai.xi if(set_value == 0) {
425*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"framerate cannot be 0.\n");
426*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
427*53ee8cc1Swenshuai.xi return FALSE;
428*53ee8cc1Swenshuai.xi }
429*53ee8cc1Swenshuai.xi appPVR_Info->FrameRatex100 = set_value;
430*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_RESET_FRAMERATE, (MS_VIRT)(appPVR_Info));
431*53ee8cc1Swenshuai.xi break;
432*53ee8cc1Swenshuai.xi case MFE_ENC_SETCONF_CHANGE_BIT_RATE:
433*53ee8cc1Swenshuai.xi set_value = (*((MS_S32*) value));
434*53ee8cc1Swenshuai.xi if(set_value == 0) {
435*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"bitrate cannot be 0.\n");
436*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
437*53ee8cc1Swenshuai.xi return FALSE;
438*53ee8cc1Swenshuai.xi }
439*53ee8cc1Swenshuai.xi appPVR_Info->nBitrate = set_value;
440*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_RESET_BITRATE, (MS_VIRT)(appPVR_Info));
441*53ee8cc1Swenshuai.xi break;
442*53ee8cc1Swenshuai.xi case MFE_ENC_SETCONF_CHANGE_BIT_RATE_AND_FRAME_RATE:
443*53ee8cc1Swenshuai.xi {
444*53ee8cc1Swenshuai.xi PVR_Info* in_Info = (PVR_Info*)value;
445*53ee8cc1Swenshuai.xi appPVR_Info->nBitrate = in_Info->nBitrate;
446*53ee8cc1Swenshuai.xi appPVR_Info->FrameRatex100 = in_Info->FrameRatex100;
447*53ee8cc1Swenshuai.xi if (_MApi_MFE_SetBitrateFramerate(appPVR_Info) == FALSE) {
448*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state, MFE_Idle);
449*53ee8cc1Swenshuai.xi return FALSE;
450*53ee8cc1Swenshuai.xi }
451*53ee8cc1Swenshuai.xi #if 0
452*53ee8cc1Swenshuai.xi if(in_Info->nBitrate== 0 ) {
453*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"bitrate cannot be 0.\n");
454*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
455*53ee8cc1Swenshuai.xi return FALSE;
456*53ee8cc1Swenshuai.xi }
457*53ee8cc1Swenshuai.xi if(in_Info->FrameRatex100 == 0) {
458*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"framerate cannot be 0.\n");
459*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
460*53ee8cc1Swenshuai.xi return FALSE;
461*53ee8cc1Swenshuai.xi }
462*53ee8cc1Swenshuai.xi appPVR_Info->nBitrate = in_Info->nBitrate;
463*53ee8cc1Swenshuai.xi appPVR_Info->FrameRatex100 = in_Info->FrameRatex100;
464*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_RESET_BITRATE_AND_FRAMERATE, (MS_VIRT)(appPVR_Info));
465*53ee8cc1Swenshuai.xi #endif
466*53ee8cc1Swenshuai.xi }
467*53ee8cc1Swenshuai.xi break;
468*53ee8cc1Swenshuai.xi case MFE_ENC_SETCONF_FRAME_TAG:
469*53ee8cc1Swenshuai.xi appPVR_Info->out_frametag_top = (*((MS_S32*) value));
470*53ee8cc1Swenshuai.xi break;
471*53ee8cc1Swenshuai.xi case MFE_ENC_SETCONF_RESET_SPSPPS:
472*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_RESET_SPSPPS, (MS_VIRT)NULL);
473*53ee8cc1Swenshuai.xi break;
474*53ee8cc1Swenshuai.xi case MFE_ENC_SETCONF_OUT_BSP_BUFFER:
475*53ee8cc1Swenshuai.xi {
476*53ee8cc1Swenshuai.xi MEMMAP_t* outbuf = (MEMMAP_t *)value;
477*53ee8cc1Swenshuai.xi if(outbuf->miuPointer == NULL || outbuf->size == 0) {
478*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"outbuf->miuPointer == NULL || outbuf->size == 0\n");
479*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
480*53ee8cc1Swenshuai.xi return FALSE;
481*53ee8cc1Swenshuai.xi }
482*53ee8cc1Swenshuai.xi appPVR_Info->BitstreamOutBuffer.miuPointer = outbuf->miuPointer;
483*53ee8cc1Swenshuai.xi appPVR_Info->BitstreamOutBuffer.miuAddress = outbuf->miuAddress;
484*53ee8cc1Swenshuai.xi appPVR_Info->BitstreamOutBuffer.size = 0;
485*53ee8cc1Swenshuai.xi appPVR_Info->BitstreamOutBufferSize = outbuf->size;
486*53ee8cc1Swenshuai.xi break;
487*53ee8cc1Swenshuai.xi }
488*53ee8cc1Swenshuai.xi case MFE_ENC_SETCONF_JPE_QUALITY:
489*53ee8cc1Swenshuai.xi set_value = (*((MS_S32*) value));
490*53ee8cc1Swenshuai.xi if(set_value <0 || set_value > 100) {
491*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "quality does not support %d\n", (int)set_value);
492*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
493*53ee8cc1Swenshuai.xi return FALSE;
494*53ee8cc1Swenshuai.xi }
495*53ee8cc1Swenshuai.xi appPVR_Info->quality = (MS_S32)set_value;
496*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_SET_QUALITY, (MS_VIRT)(set_value));
497*53ee8cc1Swenshuai.xi break;
498*53ee8cc1Swenshuai.xi case MFE_ENC_SETCONF_SET_COLORFORMAT:
499*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
500*53ee8cc1Swenshuai.xi set_value = (*((MS_S32*) value));
501*53ee8cc1Swenshuai.xi appPVR_Info->bColorFormat = (MFE_COLOR_FORMAT_INFO)set_value;
502*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_SET_COLOR_FORMAT, (MS_VIRT)(appPVR_Info));
503*53ee8cc1Swenshuai.xi break;
504*53ee8cc1Swenshuai.xi #else
505*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"Not support MFE_ENC_SETCONF_SET_COLORFORMAT on this chip\n");
506*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
507*53ee8cc1Swenshuai.xi return FALSE;
508*53ee8cc1Swenshuai.xi #endif
509*53ee8cc1Swenshuai.xi default:
510*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"conf_type error\n");
511*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
512*53ee8cc1Swenshuai.xi return FALSE;
513*53ee8cc1Swenshuai.xi }
514*53ee8cc1Swenshuai.xi
515*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
516*53ee8cc1Swenshuai.xi
517*53ee8cc1Swenshuai.xi return TRUE;
518*53ee8cc1Swenshuai.xi }
519*53ee8cc1Swenshuai.xi
MApi_MFE_GetConfig(MFE_ENC_CONF conf_type,void * value)520*53ee8cc1Swenshuai.xi MS_BOOL MApi_MFE_GetConfig(MFE_ENC_CONF conf_type, void *value)
521*53ee8cc1Swenshuai.xi {
522*53ee8cc1Swenshuai.xi if (MFE_ENC_GETCONF_CONFIG == conf_type) {
523*53ee8cc1Swenshuai.xi MS_U32 u32ShmId = 0;
524*53ee8cc1Swenshuai.xi MS_U32 u32BufSize = 0;
525*53ee8cc1Swenshuai.xi MS_VIRT VAddr = 0;
526*53ee8cc1Swenshuai.xi PVR_Info* pShmConfig = NULL;
527*53ee8cc1Swenshuai.xi PVR_Info* pDstConfig = (PVR_Info*)value;
528*53ee8cc1Swenshuai.xi
529*53ee8cc1Swenshuai.xi if (!pDstConfig) {
530*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "Null pointer in get config.\n");
531*53ee8cc1Swenshuai.xi return FALSE;
532*53ee8cc1Swenshuai.xi }
533*53ee8cc1Swenshuai.xi
534*53ee8cc1Swenshuai.xi if (FALSE == MsOS_SHM_GetId((MS_U8*)("MFE driver"), sizeof(PVR_Info), &u32ShmId, &VAddr, &u32BufSize, MSOS_SHM_QUERY)) // Query if there is mfe driver exist in share memory
535*53ee8cc1Swenshuai.xi {
536*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "Failed to get share mem.\n");
537*53ee8cc1Swenshuai.xi return FALSE;
538*53ee8cc1Swenshuai.xi }
539*53ee8cc1Swenshuai.xi
540*53ee8cc1Swenshuai.xi pShmConfig = (PVR_Info*)VAddr;
541*53ee8cc1Swenshuai.xi if (MFE_ReInit != pShmConfig->mfe_state) {
542*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "MFE not initialized.\n");
543*53ee8cc1Swenshuai.xi return FALSE;
544*53ee8cc1Swenshuai.xi }
545*53ee8cc1Swenshuai.xi
546*53ee8cc1Swenshuai.xi memcpy(pDstConfig, pShmConfig, sizeof(PVR_Info));
547*53ee8cc1Swenshuai.xi return TRUE;
548*53ee8cc1Swenshuai.xi }
549*53ee8cc1Swenshuai.xi
550*53ee8cc1Swenshuai.xi if(appPVR_Info->mfe_state != MFE_Idle) {
551*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"state check error.[%d]\n",appPVR_Info->mfe_state);
552*53ee8cc1Swenshuai.xi return FALSE;
553*53ee8cc1Swenshuai.xi }
554*53ee8cc1Swenshuai.xi
555*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Busy);
556*53ee8cc1Swenshuai.xi
557*53ee8cc1Swenshuai.xi switch (conf_type) {
558*53ee8cc1Swenshuai.xi case MFE_ENC_GETCONF_FRAME_TAG:
559*53ee8cc1Swenshuai.xi (*((MS_U32*) value)) = appPVR_Info->out_frametag_top;
560*53ee8cc1Swenshuai.xi break;
561*53ee8cc1Swenshuai.xi case MFE_ENC_GETCONF_OUT_BSP_BUFFER:
562*53ee8cc1Swenshuai.xi {
563*53ee8cc1Swenshuai.xi //memcpy(value,&appPVR_Info->BitstreamOutBuffer,sizeof(MEMMAP_t));
564*53ee8cc1Swenshuai.xi _MApi_MFE_GetOBuf(appPVR_Info,(MEMMAP_t*)value);
565*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2, "appPVR_Info->BitstreamOutBuffer.size = 0x%x\n", (unsigned int)appPVR_Info->BitstreamOutBuffer.size);
566*53ee8cc1Swenshuai.xi break;
567*53ee8cc1Swenshuai.xi }
568*53ee8cc1Swenshuai.xi case MFE_ENC_GETCONF_JPE_QUALITY:
569*53ee8cc1Swenshuai.xi (*((MS_S32*) value)) = appPVR_Info->quality;
570*53ee8cc1Swenshuai.xi break;
571*53ee8cc1Swenshuai.xi case MFE_ENC_GETCONF_DROP:
572*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GET_DROPFLAG, (MS_VIRT)(&appPVR_Info->nDropFlag));
573*53ee8cc1Swenshuai.xi *((MS_U32 *)value) = appPVR_Info->nDropFlag;
574*53ee8cc1Swenshuai.xi break;
575*53ee8cc1Swenshuai.xi default:
576*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"conf_type error\n");
577*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
578*53ee8cc1Swenshuai.xi return FALSE;
579*53ee8cc1Swenshuai.xi }
580*53ee8cc1Swenshuai.xi
581*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
582*53ee8cc1Swenshuai.xi
583*53ee8cc1Swenshuai.xi return TRUE;
584*53ee8cc1Swenshuai.xi }
585*53ee8cc1Swenshuai.xi
MApi_MFE_GetHWCap(MFE_HwCapV0 * pDrv,MS_U32 * len)586*53ee8cc1Swenshuai.xi MS_BOOL MApi_MFE_GetHWCap(MFE_HwCapV0 *pDrv, MS_U32 *len)
587*53ee8cc1Swenshuai.xi {
588*53ee8cc1Swenshuai.xi return _MApi_MFE_GetHWCap(appPVR_Info, pDrv, len);
589*53ee8cc1Swenshuai.xi }
590*53ee8cc1Swenshuai.xi
_MApi_MFE_Init(PVR_Info * mfe_Info)591*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_Init(PVR_Info* mfe_Info)
592*53ee8cc1Swenshuai.xi {
593*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L1,"_MApi_MFE_Init\n");
594*53ee8cc1Swenshuai.xi MS_U32 nFrameSize;
595*53ee8cc1Swenshuai.xi MS_U32 MallocToDrvSize ;
596*53ee8cc1Swenshuai.xi MS_U32 MallocToDrvFrame;
597*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
598*53ee8cc1Swenshuai.xi
599*53ee8cc1Swenshuai.xi if (appPVR_Info->mfe_state != MFE_Invalid
600*53ee8cc1Swenshuai.xi && appPVR_Info->mfe_state != MFE_DeInit
601*53ee8cc1Swenshuai.xi && appPVR_Info->mfe_state != MFE_ReInit) {
602*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "Incorrect state for initialization.\n");
603*53ee8cc1Swenshuai.xi return FALSE;
604*53ee8cc1Swenshuai.xi }
605*53ee8cc1Swenshuai.xi
606*53ee8cc1Swenshuai.xi //parameter check
607*53ee8cc1Swenshuai.xi if((appPVR_Info->nCodecType != MPEG4_ENC) && (appPVR_Info->nCodecType != H263_ENC)
608*53ee8cc1Swenshuai.xi && (appPVR_Info->nCodecType != H264_ENC) && (appPVR_Info->nCodecType != JPEG_ENC )){
609*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"nCodecType error\n");
610*53ee8cc1Swenshuai.xi return FALSE;
611*53ee8cc1Swenshuai.xi }
612*53ee8cc1Swenshuai.xi
613*53ee8cc1Swenshuai.xi //video parameter
614*53ee8cc1Swenshuai.xi if(appPVR_Info->nCodecType != JPEG_ENC){
615*53ee8cc1Swenshuai.xi if(appPVR_Info->FrameRatex100/100 <= 0) {
616*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "FrameRatex100 cannot be %d\n", (int)appPVR_Info->FrameRatex100);
617*53ee8cc1Swenshuai.xi return FALSE;
618*53ee8cc1Swenshuai.xi }
619*53ee8cc1Swenshuai.xi if(appPVR_Info->nBbetweenP != 0) {
620*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "nBbetweenP cannot be %d\n", (int)appPVR_Info->nBbetweenP);
621*53ee8cc1Swenshuai.xi return FALSE;
622*53ee8cc1Swenshuai.xi }
623*53ee8cc1Swenshuai.xi //if(appPVR_Info->nBitrate <= 0) {
624*53ee8cc1Swenshuai.xi // ms_dprintf(ADP_L0,"nBitrate cant be %d\n",appPVR_Info->nBitrate);
625*53ee8cc1Swenshuai.xi // return FALSE;
626*53ee8cc1Swenshuai.xi //}
627*53ee8cc1Swenshuai.xi if(appPVR_Info->width==0 ||appPVR_Info->height == 0) {
628*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"appPVR_Info->width==0 ||appPVR_Info->height == 0\n");
629*53ee8cc1Swenshuai.xi return FALSE;
630*53ee8cc1Swenshuai.xi }
631*53ee8cc1Swenshuai.xi #if defined(MFE_SUPPORT_1080P)
632*53ee8cc1Swenshuai.xi if(appPVR_Info->height > 1088) {
633*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"appPVR_Info->height > 1088\n");
634*53ee8cc1Swenshuai.xi return FALSE;
635*53ee8cc1Swenshuai.xi }
636*53ee8cc1Swenshuai.xi if(appPVR_Info->width > 1920) {
637*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"appPVR_Info->width > 1920\n");
638*53ee8cc1Swenshuai.xi return FALSE;
639*53ee8cc1Swenshuai.xi }
640*53ee8cc1Swenshuai.xi #else
641*53ee8cc1Swenshuai.xi if(appPVR_Info->height > 720) {
642*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"appPVR_Info->height > 720\n");
643*53ee8cc1Swenshuai.xi return FALSE;
644*53ee8cc1Swenshuai.xi }
645*53ee8cc1Swenshuai.xi if(appPVR_Info->width > 1280) {
646*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"appPVR_Info->width > 1280\n");
647*53ee8cc1Swenshuai.xi return FALSE;
648*53ee8cc1Swenshuai.xi }
649*53ee8cc1Swenshuai.xi #endif
650*53ee8cc1Swenshuai.xi if(appPVR_Info->nCodecType == MPEG4_ENC){
651*53ee8cc1Swenshuai.xi if(appPVR_Info->TimeIncreamentRes==0 || appPVR_Info->VopTimeIncreament == 0)
652*53ee8cc1Swenshuai.xi return FALSE;
653*53ee8cc1Swenshuai.xi }
654*53ee8cc1Swenshuai.xi if(appPVR_Info->m_bFrameMode != 1) {
655*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"appPVR_Info->m_bFrameMode != 1\n");
656*53ee8cc1Swenshuai.xi return FALSE;
657*53ee8cc1Swenshuai.xi }
658*53ee8cc1Swenshuai.xi }
659*53ee8cc1Swenshuai.xi else{ //jpeg
660*53ee8cc1Swenshuai.xi if((appPVR_Info->quality < 1) || (appPVR_Info->quality > 100)) {
661*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "quality cannot be %d\n", (int)appPVR_Info->quality);
662*53ee8cc1Swenshuai.xi return FALSE;
663*53ee8cc1Swenshuai.xi }
664*53ee8cc1Swenshuai.xi if(appPVR_Info->height > 2592) {
665*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "height cannot be %d\n", (int)appPVR_Info->height);
666*53ee8cc1Swenshuai.xi return FALSE;
667*53ee8cc1Swenshuai.xi }
668*53ee8cc1Swenshuai.xi if(appPVR_Info->width > 2960) {
669*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "width cannot be %d\n", (int)appPVR_Info->width);
670*53ee8cc1Swenshuai.xi return FALSE;
671*53ee8cc1Swenshuai.xi }
672*53ee8cc1Swenshuai.xi }
673*53ee8cc1Swenshuai.xi
674*53ee8cc1Swenshuai.xi if(!appPVR_Info->enableSecurityMode && appPVR_Info->BitstreamOutBuffer.miuPointer == NULL) {
675*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"appPVR_Info->BitstreamOutBuffer.miuPointer == NULL\n");
676*53ee8cc1Swenshuai.xi return FALSE;
677*53ee8cc1Swenshuai.xi }
678*53ee8cc1Swenshuai.xi if(appPVR_Info->enableSecurityMode) {
679*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L1,"enableSecurityMode\n");
680*53ee8cc1Swenshuai.xi }
681*53ee8cc1Swenshuai.xi if((appPVR_Info->MfeAdvInfo.input_imi_en!=0) && (appPVR_Info->MfeAdvInfo.low_bandwidth_en!=0)) {
682*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "MfeAdvInfo.input_imi_en = %u, MfeAdvInfo.low_bandwidth_en = %u\n",
683*53ee8cc1Swenshuai.xi (unsigned int)appPVR_Info->MfeAdvInfo.input_imi_en, (unsigned int)appPVR_Info->MfeAdvInfo.low_bandwidth_en);
684*53ee8cc1Swenshuai.xi return FALSE; //cannot enable at the same time.
685*53ee8cc1Swenshuai.xi }
686*53ee8cc1Swenshuai.xi if(appPVR_Info->bInterlace != PROGRESSIVE) {
687*53ee8cc1Swenshuai.xi if(appPVR_Info->nBufHeight % 32 != 0){
688*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"Height must %% 32 for interlace mode\n");
689*53ee8cc1Swenshuai.xi return FALSE;
690*53ee8cc1Swenshuai.xi }
691*53ee8cc1Swenshuai.xi }
692*53ee8cc1Swenshuai.xi
693*53ee8cc1Swenshuai.xi #if defined(_MFE_EDISON_) //eagle only support MSTTILE
694*53ee8cc1Swenshuai.xi if(appPVR_Info->bColorFormat == YUVTILE) {
695*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L4,"Only support MSTTILE, force to MSTTILE.\n");
696*53ee8cc1Swenshuai.xi appPVR_Info->bColorFormat = MSTTILE;
697*53ee8cc1Swenshuai.xi }
698*53ee8cc1Swenshuai.xi #endif
699*53ee8cc1Swenshuai.xi
700*53ee8cc1Swenshuai.xi #if defined(MFE_YUV_LOADER)
701*53ee8cc1Swenshuai.xi if (appPVR_Info->bColorFormat > MFE_NV21)
702*53ee8cc1Swenshuai.xi #else
703*53ee8cc1Swenshuai.xi if (appPVR_Info->bColorFormat > MFE_VYUY)
704*53ee8cc1Swenshuai.xi #endif
705*53ee8cc1Swenshuai.xi {
706*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "Invalid input format.\n");
707*53ee8cc1Swenshuai.xi return FALSE;
708*53ee8cc1Swenshuai.xi }
709*53ee8cc1Swenshuai.xi
710*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2,"video parameter check done\n");
711*53ee8cc1Swenshuai.xi //set RIU BASE
712*53ee8cc1Swenshuai.xi if(MFE_SetRIU_Base() == FALSE) {
713*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"MFE_SetRIU_Base() == FALSE\n");
714*53ee8cc1Swenshuai.xi return FALSE;
715*53ee8cc1Swenshuai.xi }
716*53ee8cc1Swenshuai.xi
717*53ee8cc1Swenshuai.xi appPVR_Info->nDropFlag = 0;
718*53ee8cc1Swenshuai.xi
719*53ee8cc1Swenshuai.xi appPVR_Info->nOutBuffer = OBUF_NUM;
720*53ee8cc1Swenshuai.xi //appPVR_Info->OutBufferSize = OBUF_SIZE;
721*53ee8cc1Swenshuai.xi appPVR_Info->OutBufferSize = appPVR_Info->BitstreamOutBufferSize;
722*53ee8cc1Swenshuai.xi
723*53ee8cc1Swenshuai.xi if((appPVR_Info->nBufHeight*appPVR_Info->nBufWidth) >= (1280*720))
724*53ee8cc1Swenshuai.xi MallocToDrvFrame = MAX_BUFPOOL_COUNT -1; // Only 1 ref.
725*53ee8cc1Swenshuai.xi else
726*53ee8cc1Swenshuai.xi MallocToDrvFrame = MAX_BUFPOOL_COUNT;
727*53ee8cc1Swenshuai.xi
728*53ee8cc1Swenshuai.xi if(appPVR_Info->nCodecType == H264_ENC) {
729*53ee8cc1Swenshuai.xi MS_U32 out_buf_size = appPVR_Info->OutBufferSize*appPVR_Info->nOutBuffer;
730*53ee8cc1Swenshuai.xi if(appPVR_Info->bColorFormat == YUVTILE) {
731*53ee8cc1Swenshuai.xi nFrameSize = appPVR_Info->nBufHeight*appPVR_Info->nBufWidth*3/2;
732*53ee8cc1Swenshuai.xi if(appPVR_Info->bInterlace != PROGRESSIVE)
733*53ee8cc1Swenshuai.xi nFrameSize = (appPVR_Info->nBufHeight>>1)*appPVR_Info->nBufWidth*3/2;
734*53ee8cc1Swenshuai.xi } else { // MSTTILE or YUV422
735*53ee8cc1Swenshuai.xi MS_S32 DstSizeY = CEILING_ALIGN(appPVR_Info->nBufHeight,32)*appPVR_Info->nBufWidth;
736*53ee8cc1Swenshuai.xi MS_S32 DstSizeUV = CEILING_ALIGN(appPVR_Info->nBufHeight,64)*appPVR_Info->nBufWidth/2;
737*53ee8cc1Swenshuai.xi nFrameSize = DstSizeY + DstSizeUV;
738*53ee8cc1Swenshuai.xi if(appPVR_Info->bInterlace != PROGRESSIVE) {
739*53ee8cc1Swenshuai.xi MS_S32 DstSizeY = CEILING_ALIGN(appPVR_Info->nBufHeight/2,32)*appPVR_Info->nBufWidth;
740*53ee8cc1Swenshuai.xi MS_S32 DstSizeUV = CEILING_ALIGN(appPVR_Info->nBufHeight/2,64)*appPVR_Info->nBufWidth/2;
741*53ee8cc1Swenshuai.xi nFrameSize = DstSizeY + DstSizeUV;
742*53ee8cc1Swenshuai.xi }
743*53ee8cc1Swenshuai.xi }
744*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
745*53ee8cc1Swenshuai.xi MallocToDrvSize = nFrameSize * MallocToDrvFrame
746*53ee8cc1Swenshuai.xi + out_buf_size
747*53ee8cc1Swenshuai.xi + (appPVR_Info->nBufWidth >> 4) * 128 + 10 * 1024;
748*53ee8cc1Swenshuai.xi #else
749*53ee8cc1Swenshuai.xi MallocToDrvSize = nFrameSize * MallocToDrvFrame
750*53ee8cc1Swenshuai.xi + out_buf_size
751*53ee8cc1Swenshuai.xi + (appPVR_Info->nBufWidth >> 4) * 64 + 10 * 1024;
752*53ee8cc1Swenshuai.xi #endif
753*53ee8cc1Swenshuai.xi }
754*53ee8cc1Swenshuai.xi else if(appPVR_Info->nCodecType == H263_ENC || appPVR_Info->nCodecType == MPEG4_ENC) {
755*53ee8cc1Swenshuai.xi nFrameSize = appPVR_Info->nBufHeight*appPVR_Info->nBufWidth*3/2;
756*53ee8cc1Swenshuai.xi MallocToDrvSize = nFrameSize*MallocToDrvFrame+appPVR_Info->OutBufferSize*appPVR_Info->nOutBuffer +
757*53ee8cc1Swenshuai.xi (appPVR_Info->nBufWidth>>4)*64 +
758*53ee8cc1Swenshuai.xi appPVR_Info->nBufHeight*appPVR_Info->nBufWidth/256*16 + 10*1024;
759*53ee8cc1Swenshuai.xi }
760*53ee8cc1Swenshuai.xi else {
761*53ee8cc1Swenshuai.xi appPVR_Info->MfeApiInfo.mfe_phy_buf_size = appPVR_Info->MfeApiInfo.mfe_phy_buf_size -
762*53ee8cc1Swenshuai.xi (ALIGN_TO_256(appPVR_Info->MfeApiInfo.mfe_phy_buf_addr) -appPVR_Info->MfeApiInfo.mfe_phy_buf_addr);
763*53ee8cc1Swenshuai.xi appPVR_Info->MfeApiInfo.mfe_phy_buf_addr = ALIGN_TO_256(appPVR_Info->MfeApiInfo.mfe_phy_buf_addr);
764*53ee8cc1Swenshuai.xi
765*53ee8cc1Swenshuai.xi appPVR_Info->nOutBuffer = OBUF_NUM;
766*53ee8cc1Swenshuai.xi appPVR_Info->OutBufferSize = MallocToDrvSize = appPVR_Info->MfeApiInfo.mfe_phy_buf_size;
767*53ee8cc1Swenshuai.xi }
768*53ee8cc1Swenshuai.xi
769*53ee8cc1Swenshuai.xi if(appPVR_Info->enableSecurityMode) {
770*53ee8cc1Swenshuai.xi MallocToDrvSize = MallocToDrvSize - (appPVR_Info->OutBufferSize*appPVR_Info->nOutBuffer);
771*53ee8cc1Swenshuai.xi }
772*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2, "mfe_phy_buf_size = 0x%x, MallocToDrvSize = 0x%x\n",
773*53ee8cc1Swenshuai.xi (unsigned int)appPVR_Info->MfeApiInfo.mfe_phy_buf_size, (unsigned int)MallocToDrvSize);
774*53ee8cc1Swenshuai.xi if(appPVR_Info->MfeApiInfo.mfe_phy_buf_size < MallocToDrvSize) {
775*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"appPVR_Info->MfeApiInfo.mfe_phy_buf_size < MallocToDrvSize\n");
776*53ee8cc1Swenshuai.xi return FALSE;
777*53ee8cc1Swenshuai.xi }
778*53ee8cc1Swenshuai.xi // malloc memory for DRV level
779*53ee8cc1Swenshuai.xi my_malloc(&appPVR_Info->MfeApiInfo.mfe_vir_buf_ptr, MallocToDrvSize, (const MS_S8*)("pretend to allocate for MFE driver"));
780*53ee8cc1Swenshuai.xi
781*53ee8cc1Swenshuai.xi //pretend to allocate for MFE
782*53ee8cc1Swenshuai.xi appPVR_Info->BitsBuffStart = appPVR_Info->MfeApiInfo.mfe_phy_buf_addr;
783*53ee8cc1Swenshuai.xi appPVR_Info->BitsBuffSize = MallocToDrvSize;
784*53ee8cc1Swenshuai.xi appPVR_Info->BitsBuffStart -= (appPVR_Info->BitsBuffStart & appPVR_Info->MfeApiInfo.miu_offset);
785*53ee8cc1Swenshuai.xi
786*53ee8cc1Swenshuai.xi appPVR_Info->MfeApiInfo.Encode_stop = 0;
787*53ee8cc1Swenshuai.xi appPVR_Info->mfe_drvHandle = (void*)MfeDrvMemMalloc(sizeof(MFE_CONFIG), (const MS_S8*)"mfe_drvHandle");
788*53ee8cc1Swenshuai.xi if ( mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_INIT, (MS_VIRT)(appPVR_Info)) != 0)
789*53ee8cc1Swenshuai.xi return FALSE;
790*53ee8cc1Swenshuai.xi
791*53ee8cc1Swenshuai.xi if(!appPVR_Info->enableSecurityMode)
792*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_SET_MIU_OFFSET, (MS_VIRT)appPVR_Info->MfeApiInfo.miu_offset);
793*53ee8cc1Swenshuai.xi
794*53ee8cc1Swenshuai.xi #if 0 // Not needed here. Open interrupt at CompressOnePicture instead.
795*53ee8cc1Swenshuai.xi if(appPVR_Info->enableISR) {
796*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L1,"MFE open interrupt\n");
797*53ee8cc1Swenshuai.xi mfe_open_int();
798*53ee8cc1Swenshuai.xi }
799*53ee8cc1Swenshuai.xi #endif
800*53ee8cc1Swenshuai.xi #if defined(_SUPPORT_JPE_)
801*53ee8cc1Swenshuai.xi if(appPVR_Info->nCodecType == JPEG_ENC) {
802*53ee8cc1Swenshuai.xi init_fdc();
803*53ee8cc1Swenshuai.xi set_fdc(appPVR_Info->nDispWidth,appPVR_Info->nDispHeight);
804*53ee8cc1Swenshuai.xi }
805*53ee8cc1Swenshuai.xi #endif
806*53ee8cc1Swenshuai.xi
807*53ee8cc1Swenshuai.xi // Keep a copy of init parameters in share mem
808*53ee8cc1Swenshuai.xi do {
809*53ee8cc1Swenshuai.xi MS_U32 u32ShmId = 0;
810*53ee8cc1Swenshuai.xi MS_U32 u32BufSize = 0;
811*53ee8cc1Swenshuai.xi MS_VIRT VAddr = 0;
812*53ee8cc1Swenshuai.xi PVR_Info* pShmConfig = NULL;
813*53ee8cc1Swenshuai.xi void* tmpHandle = appPVR_Info->mfe_drvHandle;
814*53ee8cc1Swenshuai.xi
815*53ee8cc1Swenshuai.xi if (FALSE == MsOS_SHM_GetId((MS_U8*)("MFE driver"), sizeof(PVR_Info), &u32ShmId, &VAddr, &u32BufSize, MSOS_SHM_QUERY)) // Query if there is mfe driver exist in share memory
816*53ee8cc1Swenshuai.xi {
817*53ee8cc1Swenshuai.xi if (FALSE == MsOS_SHM_GetId((MS_U8*)("MFE driver"), sizeof(PVR_Info), &u32ShmId, &VAddr, &u32BufSize, MSOS_SHM_CREATE)) // Create mfe driver in share memory
818*53ee8cc1Swenshuai.xi {
819*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "Failed to create share mem.\n");
820*53ee8cc1Swenshuai.xi break;
821*53ee8cc1Swenshuai.xi }
822*53ee8cc1Swenshuai.xi }
823*53ee8cc1Swenshuai.xi
824*53ee8cc1Swenshuai.xi pShmConfig = (PVR_Info*)VAddr;
825*53ee8cc1Swenshuai.xi appPVR_Info->mfe_drvHandle = NULL; // Do not put internal pointer in share mem
826*53ee8cc1Swenshuai.xi appPVR_Info->mfe_state = MFE_ReInit; // share mem copy of configuration is for re-init
827*53ee8cc1Swenshuai.xi memcpy(pShmConfig, appPVR_Info, sizeof(PVR_Info));
828*53ee8cc1Swenshuai.xi
829*53ee8cc1Swenshuai.xi appPVR_Info->mfe_drvHandle = tmpHandle;
830*53ee8cc1Swenshuai.xi } while (0);
831*53ee8cc1Swenshuai.xi
832*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Init);
833*53ee8cc1Swenshuai.xi
834*53ee8cc1Swenshuai.xi return TRUE;
835*53ee8cc1Swenshuai.xi
836*53ee8cc1Swenshuai.xi }
_MApi_MFE_Encode(PVR_Info * mfe_Info)837*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_Encode(PVR_Info* mfe_Info)
838*53ee8cc1Swenshuai.xi {
839*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
840*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L1,"_MApi_MFE_Encode\n");
841*53ee8cc1Swenshuai.xi if(appPVR_Info->mfe_state == MFE_Init)
842*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Busy);
843*53ee8cc1Swenshuai.xi else {
844*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"state check error.[%d]\n",appPVR_Info->mfe_state);
845*53ee8cc1Swenshuai.xi return FALSE;
846*53ee8cc1Swenshuai.xi }
847*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
848*53ee8cc1Swenshuai.xi
849*53ee8cc1Swenshuai.xi return TRUE;
850*53ee8cc1Swenshuai.xi }
_MApi_MFE_GetVOL(PVR_Info * mfe_Info,void * header_info)851*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_GetVOL(PVR_Info* mfe_Info, void *header_info)
852*53ee8cc1Swenshuai.xi {
853*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L1,"_MApi_MFE_GetVOL\n");
854*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
855*53ee8cc1Swenshuai.xi if(appPVR_Info->mfe_state != MFE_Idle) {
856*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"state check error.[%d]\n",appPVR_Info->mfe_state);
857*53ee8cc1Swenshuai.xi return FALSE;
858*53ee8cc1Swenshuai.xi }
859*53ee8cc1Swenshuai.xi
860*53ee8cc1Swenshuai.xi
861*53ee8cc1Swenshuai.xi if(header_info == NULL) {
862*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"header_info == NULL\n");
863*53ee8cc1Swenshuai.xi return FALSE;
864*53ee8cc1Swenshuai.xi }
865*53ee8cc1Swenshuai.xi
866*53ee8cc1Swenshuai.xi
867*53ee8cc1Swenshuai.xi //MPEG4
868*53ee8cc1Swenshuai.xi if(appPVR_Info->nCodecType == MPEG4_ENC) {
869*53ee8cc1Swenshuai.xi VOL_INFO_t *vol_info = header_info;
870*53ee8cc1Swenshuai.xi vol_info->pHeader = appPVR_Info->BitstreamOutBuffer.miuPointer;
871*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GET_VOL, (MS_VIRT)vol_info);
872*53ee8cc1Swenshuai.xi }
873*53ee8cc1Swenshuai.xi else if(appPVR_Info->nCodecType == H264_ENC) { // H264
874*53ee8cc1Swenshuai.xi SPSPPS_INFO_t *spspps_info = header_info;
875*53ee8cc1Swenshuai.xi spspps_info->pHeaderSPS = appPVR_Info->BitstreamOutBuffer.miuPointer;
876*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GET_VOL, (MS_VIRT)spspps_info);
877*53ee8cc1Swenshuai.xi appPVR_Info->BitstreamOutBuffer.size = spspps_info->PPSLen + spspps_info->SPSLen;
878*53ee8cc1Swenshuai.xi }
879*53ee8cc1Swenshuai.xi else {
880*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "non-support codec type %d\n", (int)appPVR_Info->nCodecType);
881*53ee8cc1Swenshuai.xi return FALSE;
882*53ee8cc1Swenshuai.xi }
883*53ee8cc1Swenshuai.xi
884*53ee8cc1Swenshuai.xi return TRUE;
885*53ee8cc1Swenshuai.xi }
886*53ee8cc1Swenshuai.xi
887*53ee8cc1Swenshuai.xi
mfe_check_input_alignment(MEMMAP_CUR_t YUVPlane)888*53ee8cc1Swenshuai.xi static MS_BOOL mfe_check_input_alignment(MEMMAP_CUR_t YUVPlane)
889*53ee8cc1Swenshuai.xi {
890*53ee8cc1Swenshuai.xi MS_PHY align = 0;
891*53ee8cc1Swenshuai.xi switch (appPVR_Info->bColorFormat)
892*53ee8cc1Swenshuai.xi {
893*53ee8cc1Swenshuai.xi case MSTTILE:
894*53ee8cc1Swenshuai.xi #if defined(MFE_YUV_LOADER)
895*53ee8cc1Swenshuai.xi align = 0x1FF; // 512-byte alignment
896*53ee8cc1Swenshuai.xi #else
897*53ee8cc1Swenshuai.xi align = 0xFF; // 256-byte alignment
898*53ee8cc1Swenshuai.xi #endif
899*53ee8cc1Swenshuai.xi break;
900*53ee8cc1Swenshuai.xi
901*53ee8cc1Swenshuai.xi case MFE_YUYV:
902*53ee8cc1Swenshuai.xi case MFE_YVYU:
903*53ee8cc1Swenshuai.xi case MFE_UYVY:
904*53ee8cc1Swenshuai.xi case MFE_VYUY:
905*53ee8cc1Swenshuai.xi align = 0x7; // 8-byte alignment
906*53ee8cc1Swenshuai.xi break;
907*53ee8cc1Swenshuai.xi
908*53ee8cc1Swenshuai.xi #if defined(MFE_YUV_LOADER)
909*53ee8cc1Swenshuai.xi case MFE_EVDTILE:
910*53ee8cc1Swenshuai.xi case MFE_32x32TILE:
911*53ee8cc1Swenshuai.xi case MFE_NV12:
912*53ee8cc1Swenshuai.xi case MFE_NV21:
913*53ee8cc1Swenshuai.xi align = 0x3FF; // 1024-byte alignment
914*53ee8cc1Swenshuai.xi break;
915*53ee8cc1Swenshuai.xi #endif
916*53ee8cc1Swenshuai.xi
917*53ee8cc1Swenshuai.xi default:
918*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "error: unsupported input file format\n");
919*53ee8cc1Swenshuai.xi return FALSE;
920*53ee8cc1Swenshuai.xi }
921*53ee8cc1Swenshuai.xi
922*53ee8cc1Swenshuai.xi if ((YUVPlane.Cur_Y0.miuAddress & align) != 0 ||
923*53ee8cc1Swenshuai.xi (YUVPlane.Cur_C0.miuAddress & align) != 0)
924*53ee8cc1Swenshuai.xi {
925*53ee8cc1Swenshuai.xi return FALSE;
926*53ee8cc1Swenshuai.xi }
927*53ee8cc1Swenshuai.xi
928*53ee8cc1Swenshuai.xi if (appPVR_Info->m_bFrameMode == 0)
929*53ee8cc1Swenshuai.xi {
930*53ee8cc1Swenshuai.xi if ((YUVPlane.Cur_Y1.miuAddress & align) != 0 ||
931*53ee8cc1Swenshuai.xi (YUVPlane.Cur_C1.miuAddress & align) != 0)
932*53ee8cc1Swenshuai.xi {
933*53ee8cc1Swenshuai.xi return FALSE;
934*53ee8cc1Swenshuai.xi }
935*53ee8cc1Swenshuai.xi }
936*53ee8cc1Swenshuai.xi
937*53ee8cc1Swenshuai.xi return TRUE;
938*53ee8cc1Swenshuai.xi }
939*53ee8cc1Swenshuai.xi
940*53ee8cc1Swenshuai.xi
_MApi_MFE_CompressOnePicture(PVR_Info * mfe_Info,MEMMAP_CUR_t YUVPlane,MS_BOOL bForceIframe)941*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_CompressOnePicture(PVR_Info* mfe_Info, MEMMAP_CUR_t YUVPlane, MS_BOOL bForceIframe)
942*53ee8cc1Swenshuai.xi {
943*53ee8cc1Swenshuai.xi MS_BOOL ret = FALSE;
944*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
945*53ee8cc1Swenshuai.xi if(appPVR_Info->mfe_state != MFE_Idle) {
946*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"state check error.[%d]\n",appPVR_Info->mfe_state);
947*53ee8cc1Swenshuai.xi return FALSE;
948*53ee8cc1Swenshuai.xi }
949*53ee8cc1Swenshuai.xi
950*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Busy);
951*53ee8cc1Swenshuai.xi
952*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2, "input Y0: VA %p, PA 0x%x\n", YUVPlane.Cur_Y0.miuPointer, (unsigned int)YUVPlane.Cur_Y0.miuAddress);
953*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2, "input C0: VA %p, PA 0x%x\n", YUVPlane.Cur_C0.miuPointer, (unsigned int)YUVPlane.Cur_C0.miuAddress);
954*53ee8cc1Swenshuai.xi
955*53ee8cc1Swenshuai.xi if (TRUE == mfe_check_input_alignment(YUVPlane)) {
956*53ee8cc1Swenshuai.xi if (bForceIframe) {
957*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_SET_FORCEDI, (MS_VIRT)NULL);
958*53ee8cc1Swenshuai.xi }
959*53ee8cc1Swenshuai.xi //sem_post(&madp_sem_input);
960*53ee8cc1Swenshuai.xi ret = MAdp_MFE_Proc_nonThread(YUVPlane);
961*53ee8cc1Swenshuai.xi }
962*53ee8cc1Swenshuai.xi else {
963*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "error: incorrect input address ailgnment\n");
964*53ee8cc1Swenshuai.xi }
965*53ee8cc1Swenshuai.xi
966*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
967*53ee8cc1Swenshuai.xi return ret;
968*53ee8cc1Swenshuai.xi }
969*53ee8cc1Swenshuai.xi
970*53ee8cc1Swenshuai.xi
_MApi_MFE_DeInit(PVR_Info * mfe_Info)971*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_DeInit(PVR_Info* mfe_Info)
972*53ee8cc1Swenshuai.xi {
973*53ee8cc1Swenshuai.xi
974*53ee8cc1Swenshuai.xi MS_S32 err = 0;
975*53ee8cc1Swenshuai.xi MS_U32 temp=0;
976*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
977*53ee8cc1Swenshuai.xi if(appPVR_Info->mfe_state != MFE_Idle) {
978*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L4,"MApi_MFE_DeInitialize state check error.[%d] \
979*53ee8cc1Swenshuai.xi Still Force deinitialize the mfe..\n",appPVR_Info->mfe_state);
980*53ee8cc1Swenshuai.xi }
981*53ee8cc1Swenshuai.xi
982*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_DeInit);
983*53ee8cc1Swenshuai.xi
984*53ee8cc1Swenshuai.xi appPVR_Info->MfeApiInfo.Encode_stop = 1;
985*53ee8cc1Swenshuai.xi
986*53ee8cc1Swenshuai.xi if (appPVR_Info->mfe_drvHandle != NULL) //mfe_drvHandle = NULL, not init or init fail
987*53ee8cc1Swenshuai.xi {
988*53ee8cc1Swenshuai.xi err = mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_FINISH, (MS_VIRT)temp);
989*53ee8cc1Swenshuai.xi MfeDrvMemFree(&appPVR_Info->mfe_drvHandle, (const MS_S8*)("mfe_drvHandle"));
990*53ee8cc1Swenshuai.xi }
991*53ee8cc1Swenshuai.xi
992*53ee8cc1Swenshuai.xi if(appPVR_Info->enableISR) {
993*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L1,"MFE close interrupt\n");
994*53ee8cc1Swenshuai.xi mfe_close_int();
995*53ee8cc1Swenshuai.xi }
996*53ee8cc1Swenshuai.xi #if defined(_SUPPORT_JPE_)
997*53ee8cc1Swenshuai.xi if(appPVR_Info->nCodecType == JPEG_ENC)
998*53ee8cc1Swenshuai.xi deinit_fdc();
999*53ee8cc1Swenshuai.xi #endif
1000*53ee8cc1Swenshuai.xi appPVR_Info = NULL;
1001*53ee8cc1Swenshuai.xi //MfeDrvMemFree(appPVR_Info, (const MS_S8*)("appPVR_Info"));
1002*53ee8cc1Swenshuai.xi //MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Invalid);
1003*53ee8cc1Swenshuai.xi
1004*53ee8cc1Swenshuai.xi
1005*53ee8cc1Swenshuai.xi return (err == 0);
1006*53ee8cc1Swenshuai.xi
1007*53ee8cc1Swenshuai.xi
1008*53ee8cc1Swenshuai.xi }
1009*53ee8cc1Swenshuai.xi
_MApi_MFE_GetOBuf(PVR_Info * mfe_Info,MEMMAP_t * obuf)1010*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_GetOBuf(PVR_Info* mfe_Info,MEMMAP_t* obuf)
1011*53ee8cc1Swenshuai.xi {
1012*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
1013*53ee8cc1Swenshuai.xi memcpy(obuf,&appPVR_Info->BitstreamOutBuffer,sizeof(MEMMAP_t));
1014*53ee8cc1Swenshuai.xi
1015*53ee8cc1Swenshuai.xi return TRUE;
1016*53ee8cc1Swenshuai.xi }
1017*53ee8cc1Swenshuai.xi
_MApi_MFE_SetBitrateFramerate(PVR_Info * mfe_Info)1018*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_SetBitrateFramerate(PVR_Info* mfe_Info)
1019*53ee8cc1Swenshuai.xi {
1020*53ee8cc1Swenshuai.xi
1021*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
1022*53ee8cc1Swenshuai.xi if(appPVR_Info->nBitrate== 0 ) {
1023*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"bitrate cannot be 0.\n");
1024*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
1025*53ee8cc1Swenshuai.xi return FALSE;
1026*53ee8cc1Swenshuai.xi }
1027*53ee8cc1Swenshuai.xi if(appPVR_Info->FrameRatex100 == 0) {
1028*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"framerate cannot be 0.\n");
1029*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
1030*53ee8cc1Swenshuai.xi return FALSE;
1031*53ee8cc1Swenshuai.xi }
1032*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_RESET_BITRATE_AND_FRAMERATE, (MS_VIRT)(appPVR_Info));
1033*53ee8cc1Swenshuai.xi
1034*53ee8cc1Swenshuai.xi return TRUE;
1035*53ee8cc1Swenshuai.xi }
1036*53ee8cc1Swenshuai.xi
_MApi_MFE_PowerOff(PVR_Info * mfe_Info)1037*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_PowerOff(PVR_Info* mfe_Info)
1038*53ee8cc1Swenshuai.xi {
1039*53ee8cc1Swenshuai.xi
1040*53ee8cc1Swenshuai.xi POWERON_t power_Info;
1041*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
1042*53ee8cc1Swenshuai.xi power_Info.is_off = 1;
1043*53ee8cc1Swenshuai.xi power_Info.clock_level = MFE_CLK_FAST;
1044*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)NULL, MFE_IOC_POWEROFF, (MS_VIRT)&power_Info);
1045*53ee8cc1Swenshuai.xi
1046*53ee8cc1Swenshuai.xi return TRUE;
1047*53ee8cc1Swenshuai.xi }
1048*53ee8cc1Swenshuai.xi
_MApi_MFE_ISREnable(PVR_Info * mfe_Info)1049*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_ISREnable(PVR_Info* mfe_Info)
1050*53ee8cc1Swenshuai.xi {
1051*53ee8cc1Swenshuai.xi
1052*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
1053*53ee8cc1Swenshuai.xi if(mfe_Info->enableISR) {
1054*53ee8cc1Swenshuai.xi // Not needed here. Open interrupt at CompressOnePicture instead.
1055*53ee8cc1Swenshuai.xi //mfe_openInt();
1056*53ee8cc1Swenshuai.xi } else {
1057*53ee8cc1Swenshuai.xi mfe_close_int();
1058*53ee8cc1Swenshuai.xi }
1059*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)NULL, MFE_IOC_SET_ISR, (MS_VIRT)(appPVR_Info));
1060*53ee8cc1Swenshuai.xi return TRUE;
1061*53ee8cc1Swenshuai.xi }
1062*53ee8cc1Swenshuai.xi
_MApi_MFE_SetColorFormat(PVR_Info * mfe_Info)1063*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_SetColorFormat(PVR_Info* mfe_Info)
1064*53ee8cc1Swenshuai.xi {
1065*53ee8cc1Swenshuai.xi
1066*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
1067*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
1068*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_SET_COLOR_FORMAT, (MS_VIRT)(appPVR_Info));
1069*53ee8cc1Swenshuai.xi #else
1070*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0,"Not support MFE_ENC_SETCONF_SET_COLORFORMAT on this chip\n");
1071*53ee8cc1Swenshuai.xi MAdp_MFE_Change_State(&appPVR_Info->mfe_state,MFE_Idle);
1072*53ee8cc1Swenshuai.xi return FALSE;
1073*53ee8cc1Swenshuai.xi #endif
1074*53ee8cc1Swenshuai.xi
1075*53ee8cc1Swenshuai.xi return TRUE;
1076*53ee8cc1Swenshuai.xi }
1077*53ee8cc1Swenshuai.xi
_MApi_MFE_ResetSPSPPS(PVR_Info * mfe_Info)1078*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_ResetSPSPPS(PVR_Info* mfe_Info)
1079*53ee8cc1Swenshuai.xi {
1080*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
1081*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_RESET_SPSPPS, (MS_VIRT)NULL);
1082*53ee8cc1Swenshuai.xi
1083*53ee8cc1Swenshuai.xi return TRUE;
1084*53ee8cc1Swenshuai.xi }
1085*53ee8cc1Swenshuai.xi
_MApi_MFE_SetFrameType(PVR_Info * mfe_Info,MS_S32 frametype)1086*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_SetFrameType(PVR_Info* mfe_Info, MS_S32 frametype)
1087*53ee8cc1Swenshuai.xi {
1088*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
1089*53ee8cc1Swenshuai.xi if(frametype == I_VOP)
1090*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_SET_FORCEDI, (MS_VIRT)NULL);
1091*53ee8cc1Swenshuai.xi
1092*53ee8cc1Swenshuai.xi return TRUE;
1093*53ee8cc1Swenshuai.xi }
1094*53ee8cc1Swenshuai.xi
_MApi_MFE_GetHWCap(PVR_Info * mfe_Info,MFE_HwCapV0 * pDrv,MS_U32 * len)1095*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_GetHWCap(PVR_Info* mfe_Info, MFE_HwCapV0 *pDrv, MS_U32 *len)
1096*53ee8cc1Swenshuai.xi {
1097*53ee8cc1Swenshuai.xi
1098*53ee8cc1Swenshuai.xi MS_U16 u16CopiedLength = sizeof(MFE_HwCapV0);
1099*53ee8cc1Swenshuai.xi MFE_HwCapV0 DrvHW;
1100*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
1101*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GET_HWCAP, (MS_VIRT)(&DrvHW));
1102*53ee8cc1Swenshuai.xi
1103*53ee8cc1Swenshuai.xi if(pDrv->u16ApiHW_Length == 0){
1104*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "Null paramter or Wrong u16ApiHW_Length!!\n");
1105*53ee8cc1Swenshuai.xi return 0;
1106*53ee8cc1Swenshuai.xi }
1107*53ee8cc1Swenshuai.xi
1108*53ee8cc1Swenshuai.xi if(pDrv->u32ApiHW_Version < 1){
1109*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "Wrong u32ApiHW_Version please check!!\n");
1110*53ee8cc1Swenshuai.xi return 0;
1111*53ee8cc1Swenshuai.xi }
1112*53ee8cc1Swenshuai.xi
1113*53ee8cc1Swenshuai.xi //new AP + old lib, only the length corresponding to old lib has meaning.
1114*53ee8cc1Swenshuai.xi if(pDrv->u32ApiHW_Version > API_HWCAP_VERSION0){
1115*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2, "old lib version has only length: %u\n", (unsigned int)sizeof(MFE_HwCapV0));
1116*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2, "we still copy the min size of both structure, but AP should take care of it.\n");
1117*53ee8cc1Swenshuai.xi u16CopiedLength = sizeof(MFE_HwCapV0);
1118*53ee8cc1Swenshuai.xi }
1119*53ee8cc1Swenshuai.xi
1120*53ee8cc1Swenshuai.xi //old AP + new lib, driver shouldn't access to the space which doesn't exist in old structure
1121*53ee8cc1Swenshuai.xi if((pDrv->u32ApiHW_Version < API_HWCAP_VERSION0) || (pDrv->u16ApiHW_Length < sizeof(MFE_HwCapV0))){
1122*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L2, "new lib version access by old structure!!\n");
1123*53ee8cc1Swenshuai.xi u16CopiedLength = pDrv->u16ApiHW_Length;
1124*53ee8cc1Swenshuai.xi }
1125*53ee8cc1Swenshuai.xi
1126*53ee8cc1Swenshuai.xi DrvHW.u32ApiHW_Version = API_HWCAP_VERSION0;
1127*53ee8cc1Swenshuai.xi DrvHW.u16ApiHW_Length = u16CopiedLength;
1128*53ee8cc1Swenshuai.xi DrvHW.bIsSupportEncoder = TRUE;
1129*53ee8cc1Swenshuai.xi DrvHW.u8MaxEncodeFrame = 0;
1130*53ee8cc1Swenshuai.xi DrvHW.bSupportSubVidWin = FALSE;
1131*53ee8cc1Swenshuai.xi DrvHW.bSupportMpeg4 = FALSE;
1132*53ee8cc1Swenshuai.xi DrvHW.bSupportH264 = TRUE;
1133*53ee8cc1Swenshuai.xi memcpy(pDrv, &DrvHW, u16CopiedLength);
1134*53ee8cc1Swenshuai.xi *len = u16CopiedLength;
1135*53ee8cc1Swenshuai.xi return TRUE;
1136*53ee8cc1Swenshuai.xi }
1137*53ee8cc1Swenshuai.xi
_MApi_MFE_GetOutputInfo(PVR_Info * mfe_Info,MS_S32 * frametype,MS_S32 * size)1138*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_GetOutputInfo(PVR_Info *mfe_Info, MS_S32 *frametype, MS_S32 *size)
1139*53ee8cc1Swenshuai.xi {
1140*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
1141*53ee8cc1Swenshuai.xi if (appPVR_Info->mfe_state != MFE_Idle) {
1142*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "state check error.[%d]\n", appPVR_Info->mfe_state);
1143*53ee8cc1Swenshuai.xi return FALSE;
1144*53ee8cc1Swenshuai.xi }
1145*53ee8cc1Swenshuai.xi *size = appPVR_Info->BitstreamOutBuffer.size;
1146*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_GET_FRAME_TYPE, (MS_VIRT)(frametype));
1147*53ee8cc1Swenshuai.xi
1148*53ee8cc1Swenshuai.xi return TRUE;
1149*53ee8cc1Swenshuai.xi }
1150*53ee8cc1Swenshuai.xi
_MApi_MFE_SetVUI(PVR_Info * mfe_Info,VUI_Info * vui_info)1151*53ee8cc1Swenshuai.xi MS_BOOL _MApi_MFE_SetVUI(PVR_Info *mfe_Info, VUI_Info* vui_info)
1152*53ee8cc1Swenshuai.xi {
1153*53ee8cc1Swenshuai.xi appPVR_Info = mfe_Info;
1154*53ee8cc1Swenshuai.xi if (appPVR_Info->mfe_state != MFE_Idle && appPVR_Info->mfe_state != MFE_Init) {
1155*53ee8cc1Swenshuai.xi ms_dprintf(ADP_L0, "state check error.[%d]\n", appPVR_Info->mfe_state);
1156*53ee8cc1Swenshuai.xi return FALSE;
1157*53ee8cc1Swenshuai.xi }
1158*53ee8cc1Swenshuai.xi mfe_ioctl((MS_VIRT)appPVR_Info->mfe_drvHandle, MFE_IOC_SET_VUI, (MS_VIRT)(vui_info));
1159*53ee8cc1Swenshuai.xi
1160*53ee8cc1Swenshuai.xi return TRUE;
1161*53ee8cc1Swenshuai.xi }
1162