xref: /utopia/UTPA2-700.0.x/modules/mfe/drv/mfe_ex/cModel/mfe_reg_m4ve.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi 
79*53ee8cc1Swenshuai.xi 
80*53ee8cc1Swenshuai.xi 
81*53ee8cc1Swenshuai.xi #include "MFE_chip.h"
82*53ee8cc1Swenshuai.xi #include "mfe_type.h"
83*53ee8cc1Swenshuai.xi #include "mfe_common.h"
84*53ee8cc1Swenshuai.xi #include "ms_dprintf.h"
85*53ee8cc1Swenshuai.xi #include "mhal_mfe.h"
86*53ee8cc1Swenshuai.xi #ifdef __MOBILE_CASE__
87*53ee8cc1Swenshuai.xi #include <stdio.h>
88*53ee8cc1Swenshuai.xi #include <string.h>
89*53ee8cc1Swenshuai.xi #endif
90*53ee8cc1Swenshuai.xi 
91*53ee8cc1Swenshuai.xi #include "msRateCtrl.h"
92*53ee8cc1Swenshuai.xi #include "OutStrm.h"
93*53ee8cc1Swenshuai.xi #include "m4v_header.h"
94*53ee8cc1Swenshuai.xi #include "BufMng.h"
95*53ee8cc1Swenshuai.xi #include "mfe_reg.h"
96*53ee8cc1Swenshuai.xi #if defined(WIN32)
97*53ee8cc1Swenshuai.xi 	#include "mdrv_mfe.h"
98*53ee8cc1Swenshuai.xi #elif defined(_MFE_T8_) && defined(_MIPS_PLATFORM_) &&!defined(_KERNEL_MODE_)
99*53ee8cc1Swenshuai.xi     #include "mdrv_mfe.h"
100*53ee8cc1Swenshuai.xi #endif
101*53ee8cc1Swenshuai.xi #include "msRateCtrl.h"
102*53ee8cc1Swenshuai.xi #if defined(_MFE_T8_)
103*53ee8cc1Swenshuai.xi #define MAX_REF_FRAME  2UL
104*53ee8cc1Swenshuai.xi #define SEARCH_RANGE_X 32UL
105*53ee8cc1Swenshuai.xi #elif defined(_MFE_M1_)
106*53ee8cc1Swenshuai.xi #define MAX_REF_FRAME  1UL
107*53ee8cc1Swenshuai.xi #define SEARCH_RANGE_X 16UL
108*53ee8cc1Swenshuai.xi #endif
109*53ee8cc1Swenshuai.xi 
110*53ee8cc1Swenshuai.xi // Sync with cModel QExp.h
111*53ee8cc1Swenshuai.xi #define CLOCK_GATING	// Enable clock gating
112*53ee8cc1Swenshuai.xi #define FME_PIPELINE_OPEN	// Enable David's FME speedup version
113*53ee8cc1Swenshuai.xi 
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi #define FIELD_DCT_DIFF_THR  (350UL>>2)	// Subsampled by 4
117*53ee8cc1Swenshuai.xi 
118*53ee8cc1Swenshuai.xi 
119*53ee8cc1Swenshuai.xi 
120*53ee8cc1Swenshuai.xi static const MS_S32 rgiDefaultIntraQMatrix [64] = {
121*53ee8cc1Swenshuai.xi 	8,	17,	18,	19,	21,	23,	25,	27,
122*53ee8cc1Swenshuai.xi 	17,	18,	19,	21,	23,	25,	27,	28,
123*53ee8cc1Swenshuai.xi 	20,	21,	22,	23,	24,	26,	28,	30,
124*53ee8cc1Swenshuai.xi 	21,	22,	23,	24,	26,	28,	30,	32,
125*53ee8cc1Swenshuai.xi 	22,	23,	24,	26,	28,	30,	32,	35,
126*53ee8cc1Swenshuai.xi 	23,	24,	26,	28,	30,	32,	35,	38,
127*53ee8cc1Swenshuai.xi 	25,	26,	28,	30,	32,	35,	38,	41,
128*53ee8cc1Swenshuai.xi 	27,	28,	30,	32,	35,	38,	41,	45
129*53ee8cc1Swenshuai.xi };
130*53ee8cc1Swenshuai.xi 
131*53ee8cc1Swenshuai.xi static const MS_S32 rgiDefaultInterQMatrix [64] = {
132*53ee8cc1Swenshuai.xi 	16,	17,	18, 19, 20,	21,	22,	23,
133*53ee8cc1Swenshuai.xi 	17,	18,	19,	20,	21,	22,	23,	24,
134*53ee8cc1Swenshuai.xi 	18,	19,	20,	21,	22,	23,	24,	25,
135*53ee8cc1Swenshuai.xi 	19,	20,	21,	22,	23,	24,	26,	27,
136*53ee8cc1Swenshuai.xi 	20,	21,	22,	23,	25,	26,	27,	28,
137*53ee8cc1Swenshuai.xi 	21,	22,	23,	24,	26,	27,	28,	30,
138*53ee8cc1Swenshuai.xi 	22,	23,	24,	26,	27,	28,	30,	31,
139*53ee8cc1Swenshuai.xi 	23,	24,	25,	27,	28,	30,	31,	33
140*53ee8cc1Swenshuai.xi };
141*53ee8cc1Swenshuai.xi #ifdef MFE_MIU_PROTECT
142*53ee8cc1Swenshuai.xi extern void MHal_MFE_Enable_MIU_Protection(MS_S32 MIU_TEST_MODE,MFE_CONFIG* pConfig);
143*53ee8cc1Swenshuai.xi #endif
144*53ee8cc1Swenshuai.xi void OutputSwCfg1_Mp4(MS_S32 nFrmNum, MFE_CONFIG* pConfig);
145*53ee8cc1Swenshuai.xi 
CeilLog2(MS_U32 uiVal)146*53ee8cc1Swenshuai.xi static MS_U32 CeilLog2( MS_U32 uiVal)
147*53ee8cc1Swenshuai.xi {
148*53ee8cc1Swenshuai.xi 	MS_U32 uiTmp = uiVal-1;
149*53ee8cc1Swenshuai.xi 	MS_U32 uiRet = 0;
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi 	while( uiTmp != 0 )
152*53ee8cc1Swenshuai.xi 	{
153*53ee8cc1Swenshuai.xi 		uiTmp >>= 1;
154*53ee8cc1Swenshuai.xi 		uiRet++;
155*53ee8cc1Swenshuai.xi 	}
156*53ee8cc1Swenshuai.xi 	return uiRet;
157*53ee8cc1Swenshuai.xi }
158*53ee8cc1Swenshuai.xi 
mfeM4VE_DeInit(MFE_CONFIG * pConfig)159*53ee8cc1Swenshuai.xi void mfeM4VE_DeInit(MFE_CONFIG *pConfig)
160*53ee8cc1Swenshuai.xi {
161*53ee8cc1Swenshuai.xi     IntraUpdateClose(pConfig);
162*53ee8cc1Swenshuai.xi }
163*53ee8cc1Swenshuai.xi 
mfeM4VE_Init(MFE_CONFIG * pConfig)164*53ee8cc1Swenshuai.xi void mfeM4VE_Init(MFE_CONFIG *pConfig)
165*53ee8cc1Swenshuai.xi {
166*53ee8cc1Swenshuai.xi 	MS_S32 i;
167*53ee8cc1Swenshuai.xi 	M4VEINFO* pInfo = &pConfig->ctxM4veInfo;
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi 	memset(pInfo, 0, sizeof(M4VEINFO));
170*53ee8cc1Swenshuai.xi 
171*53ee8cc1Swenshuai.xi 	switch (pConfig->nCodecType)
172*53ee8cc1Swenshuai.xi 	{
173*53ee8cc1Swenshuai.xi 	case REG_ENC_MODE_MPG4:
174*53ee8cc1Swenshuai.xi 		pInfo->bShortHeader = 0;
175*53ee8cc1Swenshuai.xi              pConfig->bQuantType = 1;
176*53ee8cc1Swenshuai.xi 		break;
177*53ee8cc1Swenshuai.xi 	case REG_ENC_MODE_H263:
178*53ee8cc1Swenshuai.xi 		pInfo->bShortHeader = 1;
179*53ee8cc1Swenshuai.xi              pConfig->bQuantType = 0;
180*53ee8cc1Swenshuai.xi 		break;
181*53ee8cc1Swenshuai.xi 	default:
182*53ee8cc1Swenshuai.xi 		MS_ASSERT(0);
183*53ee8cc1Swenshuai.xi 		pInfo->bShortHeader = 0;
184*53ee8cc1Swenshuai.xi 	}
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi 	switch (pConfig->FrameRatex100) {
187*53ee8cc1Swenshuai.xi 	case 3000:
188*53ee8cc1Swenshuai.xi 		pInfo->nTimeResolution = 30;
189*53ee8cc1Swenshuai.xi 		pInfo->nFixedIncrement = 1;
190*53ee8cc1Swenshuai.xi 		pInfo->iClockRate = 30;
191*53ee8cc1Swenshuai.xi 		break;
192*53ee8cc1Swenshuai.xi 	case 1500:
193*53ee8cc1Swenshuai.xi 		pInfo->nTimeResolution = 15;
194*53ee8cc1Swenshuai.xi 		pInfo->nFixedIncrement = 1;
195*53ee8cc1Swenshuai.xi 		pInfo->iClockRate = 15;
196*53ee8cc1Swenshuai.xi 		break;
197*53ee8cc1Swenshuai.xi 	case 2500:
198*53ee8cc1Swenshuai.xi 		pInfo->nTimeResolution = 25;
199*53ee8cc1Swenshuai.xi 		pInfo->nFixedIncrement = 1;
200*53ee8cc1Swenshuai.xi 		pInfo->iClockRate = 25;
201*53ee8cc1Swenshuai.xi 		break;
202*53ee8cc1Swenshuai.xi 	case 2997:
203*53ee8cc1Swenshuai.xi 		pInfo->nTimeResolution = 30000;
204*53ee8cc1Swenshuai.xi 		pInfo->nFixedIncrement = 1001;
205*53ee8cc1Swenshuai.xi 		pInfo->iClockRate = 2997;
206*53ee8cc1Swenshuai.xi 		break;
207*53ee8cc1Swenshuai.xi 	default:
208*53ee8cc1Swenshuai.xi             if(pConfig->nCodecType == REG_ENC_MODE_MPG4) {
209*53ee8cc1Swenshuai.xi                 pInfo->nTimeResolution = pConfig->TimeIncreamentRes;
210*53ee8cc1Swenshuai.xi                 pInfo->nFixedIncrement = pConfig->VopTimeIncreament;
211*53ee8cc1Swenshuai.xi                  ms_dprintk(DRV_L2,"Setting from API: pInfo->nTimeResolution = %d, pInfo->nFixedIncrement = %d\n",
212*53ee8cc1Swenshuai.xi                     (int)pInfo->nTimeResolution, (int)pInfo->nFixedIncrement);
213*53ee8cc1Swenshuai.xi             pInfo->iClockRate = pInfo->nTimeResolution;
214*53ee8cc1Swenshuai.xi             }
215*53ee8cc1Swenshuai.xi             else {
216*53ee8cc1Swenshuai.xi                 pInfo->nTimeResolution = pConfig->FrameRatex100 / 100;
217*53ee8cc1Swenshuai.xi                 pInfo->nFixedIncrement = 1;
218*53ee8cc1Swenshuai.xi                 pInfo->iClockRate = pInfo->nTimeResolution;
219*53ee8cc1Swenshuai.xi             }
220*53ee8cc1Swenshuai.xi              MS_ASSERT(pInfo->nTimeResolution>0);
221*53ee8cc1Swenshuai.xi              MS_ASSERT(pInfo->nFixedIncrement>0);
222*53ee8cc1Swenshuai.xi 	}
223*53ee8cc1Swenshuai.xi 	{
224*53ee8cc1Swenshuai.xi 		MS_S32 iClockRate = pInfo->iClockRate-1;
225*53ee8cc1Swenshuai.xi 		MS_ASSERT (iClockRate < 65536);
226*53ee8cc1Swenshuai.xi 		//printf("mfeM4VE_Init: iClockRate=%d\n"), iClockRate);
227*53ee8cc1Swenshuai.xi 		if(iClockRate>0)
228*53ee8cc1Swenshuai.xi 		{
229*53ee8cc1Swenshuai.xi 			for (pInfo->nNumBitsTimeIncr = 1; pInfo->nNumBitsTimeIncr < 16; pInfo->nNumBitsTimeIncr++)	{
230*53ee8cc1Swenshuai.xi 				if (iClockRate == 1)
231*53ee8cc1Swenshuai.xi 					break;
232*53ee8cc1Swenshuai.xi 				iClockRate = (iClockRate >> 1);
233*53ee8cc1Swenshuai.xi 			}
234*53ee8cc1Swenshuai.xi 		}
235*53ee8cc1Swenshuai.xi 		else
236*53ee8cc1Swenshuai.xi 			pInfo->nNumBitsTimeIncr = 1;
237*53ee8cc1Swenshuai.xi 		//printf("mfeM4VE_Init: nNumBitsTimeIncr=%d\n"), pInfo->nNumBitsTimeIncr);
238*53ee8cc1Swenshuai.xi 	}
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi 	if (pConfig->nCodecType==REG_ENC_MODE_MPG4) {
241*53ee8cc1Swenshuai.xi 		pInfo->bInterlacedCoding = (pConfig->bInterlace != PROGRESSIVE);
242*53ee8cc1Swenshuai.xi 		pInfo->bInterlace = pInfo->bInterlacedCoding;
243*53ee8cc1Swenshuai.xi 		pInfo->iSearchRangeForward = SEARCH_RANGE_X;
244*53ee8cc1Swenshuai.xi 		pInfo->bQuantizerType = pConfig->bQuantType;
245*53ee8cc1Swenshuai.xi 
246*53ee8cc1Swenshuai.xi 		for (i=0; i<64; i++) {
247*53ee8cc1Swenshuai.xi 			pInfo->rgiIntraQuantizerMatrix[i] = rgiDefaultIntraQMatrix[i];
248*53ee8cc1Swenshuai.xi 			pInfo->rgiInterQuantizerMatrix[i] = rgiDefaultInterQMatrix[i];
249*53ee8cc1Swenshuai.xi 		}
250*53ee8cc1Swenshuai.xi 
251*53ee8cc1Swenshuai.xi 		pInfo->iRoundingControlSwitch = 1;
252*53ee8cc1Swenshuai.xi 	}
253*53ee8cc1Swenshuai.xi 	else {
254*53ee8cc1Swenshuai.xi 		pInfo->iSearchRangeForward = 16;
255*53ee8cc1Swenshuai.xi 		pInfo->bQuantizerType = 0;
256*53ee8cc1Swenshuai.xi 
257*53ee8cc1Swenshuai.xi 		pInfo->iRoundingControlSwitch = 0;
258*53ee8cc1Swenshuai.xi 	}
259*53ee8cc1Swenshuai.xi 
260*53ee8cc1Swenshuai.xi 	pInfo->SEARCH_RANGE_Y = 16;
261*53ee8cc1Swenshuai.xi 	pInfo->IME_ADAPTIVE_WINDOW = 1;
262*53ee8cc1Swenshuai.xi 	if (pInfo->SEARCH_RANGE_Y<=16 && pInfo->iSearchRangeForward<=16)
263*53ee8cc1Swenshuai.xi 		pInfo->iFCode = 1;
264*53ee8cc1Swenshuai.xi 	else
265*53ee8cc1Swenshuai.xi 		pInfo->iFCode = 2;
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi 	pInfo->iRoundingControl = pInfo->iRoundingControlSwitch;
268*53ee8cc1Swenshuai.xi 	pConfig->vopPredType = I_VOP;
269*53ee8cc1Swenshuai.xi 	pInfo->g_rec_en = 1;
270*53ee8cc1Swenshuai.xi 	pInfo->g_ref_en = 0;
271*53ee8cc1Swenshuai.xi 	pInfo->m_nLastZZ = 63;
272*53ee8cc1Swenshuai.xi 	pInfo->m_nFmePrec = 1;	// Default: Half-pixel
273*53ee8cc1Swenshuai.xi 
274*53ee8cc1Swenshuai.xi 	pInfo->m_nBitsResyncMarker = 0;
275*53ee8cc1Swenshuai.xi 	pInfo->nNumBitsVPMBnum = CeilLog2((pConfig->nBufWidth*pConfig->nBufHeight)>>8);	// number of bits for macroblock_number
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi 	pInfo->m_tModuloBaseDecd = 0;
278*53ee8cc1Swenshuai.xi 	pInfo->m_tModuloBaseDisp = 0;
279*53ee8cc1Swenshuai.xi 	pInfo->m_tFutureRef = 0;
280*53ee8cc1Swenshuai.xi 	pInfo->m_tPastRef = 0;
281*53ee8cc1Swenshuai.xi 	pInfo->m_t = 0;
282*53ee8cc1Swenshuai.xi 	pInfo->m_nBitsModuloBase = 0;
283*53ee8cc1Swenshuai.xi 	pInfo->m_iVopTimeIncr = 0;
284*53ee8cc1Swenshuai.xi 
285*53ee8cc1Swenshuai.xi 	pInfo->intQP = 0;
286*53ee8cc1Swenshuai.xi 
287*53ee8cc1Swenshuai.xi 	MS_ASSERT((pConfig->nBufWidth&0xF)==0);
288*53ee8cc1Swenshuai.xi 	MS_ASSERT((pConfig->nBufHeight&0xF)==0);
289*53ee8cc1Swenshuai.xi 
290*53ee8cc1Swenshuai.xi 	pInfo->bAllowSkippedPMBs = !(pConfig->nBbetweenP>0);
291*53ee8cc1Swenshuai.xi 	pInfo->nAllowDirectBMBs = 1;
292*53ee8cc1Swenshuai.xi 
293*53ee8cc1Swenshuai.xi 	pInfo->bHECEnabled = 1;
294*53ee8cc1Swenshuai.xi 	pInfo->nHECPeriod = 3;
295*53ee8cc1Swenshuai.xi 
296*53ee8cc1Swenshuai.xi 	// H263
297*53ee8cc1Swenshuai.xi 	if (pConfig->nCodecType==REG_ENC_MODE_H263) {
298*53ee8cc1Swenshuai.xi 		if (pConfig->nBufHeight<=400)
299*53ee8cc1Swenshuai.xi 			pInfo->nGobUnit = 0;
300*53ee8cc1Swenshuai.xi 		else if (pConfig->nBufHeight<=800)
301*53ee8cc1Swenshuai.xi 			pInfo->nGobUnit = 1;
302*53ee8cc1Swenshuai.xi 		else if (pConfig->nBufHeight<=1152)
303*53ee8cc1Swenshuai.xi 			pInfo->nGobUnit = 2;
304*53ee8cc1Swenshuai.xi 		else
305*53ee8cc1Swenshuai.xi 			MS_ASSERT(0);
306*53ee8cc1Swenshuai.xi 		pInfo->m_iGobFrameId = 0;
307*53ee8cc1Swenshuai.xi 	}
308*53ee8cc1Swenshuai.xi 
309*53ee8cc1Swenshuai.xi 	// Rate control
310*53ee8cc1Swenshuai.xi 	MfeDrvRateControlInit(pConfig);
311*53ee8cc1Swenshuai.xi 
312*53ee8cc1Swenshuai.xi 	// FDC header initialization
313*53ee8cc1Swenshuai.xi 	osCreate(&pConfig->m_OutStream);
314*53ee8cc1Swenshuai.xi 	osSetWriteBuffer(&pConfig->m_OutStream, pConfig->m_FdcBuffer);
315*53ee8cc1Swenshuai.xi 
316*53ee8cc1Swenshuai.xi 	// Intra-update initialization
317*53ee8cc1Swenshuai.xi 	IntraUpdateInit(pConfig);
318*53ee8cc1Swenshuai.xi }
319*53ee8cc1Swenshuai.xi 
320*53ee8cc1Swenshuai.xi 
mfeM4VE_EncodeFrame(MFE_CONFIG * pConfig,GOPINFO * pGopInfo)321*53ee8cc1Swenshuai.xi void mfeM4VE_EncodeFrame(MFE_CONFIG *pConfig, GOPINFO* pGopInfo)
322*53ee8cc1Swenshuai.xi {
323*53ee8cc1Swenshuai.xi     M4VEINFO* pInfo = &pConfig->ctxM4veInfo;
324*53ee8cc1Swenshuai.xi     BitsInfo* pBitsInfo = &pConfig->ctxBitsInfo;
325*53ee8cc1Swenshuai.xi     OutStream* pStream = &pConfig->m_OutStream;
326*53ee8cc1Swenshuai.xi     const MS_U8 gBITMASK[8] = { 0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe };
327*53ee8cc1Swenshuai.xi 	// This is done in msAPI_MFE_EnOneFrm()
328*53ee8cc1Swenshuai.xi 	//mfeSetVopType(pConfig, pGopInfo); // Will set pConfig->vopPredType
329*53ee8cc1Swenshuai.xi 
330*53ee8cc1Swenshuai.xi 	// Config
331*53ee8cc1Swenshuai.xi 	// Frame type
332*53ee8cc1Swenshuai.xi 	pInfo->bInterlace = pInfo->bInterlacedCoding;
333*53ee8cc1Swenshuai.xi 	if (!pInfo->bShortHeader) {
334*53ee8cc1Swenshuai.xi 		if (pConfig->vopPredType==P_VOP) {
335*53ee8cc1Swenshuai.xi 			pInfo->iRoundingControlSwitch ^= 1;
336*53ee8cc1Swenshuai.xi 			pInfo->iRoundingControl = pInfo->iRoundingControlSwitch;
337*53ee8cc1Swenshuai.xi 		}
338*53ee8cc1Swenshuai.xi 		else if (pConfig->vopPredType==B_VOP)
339*53ee8cc1Swenshuai.xi 			pInfo->iRoundingControl = 0;
340*53ee8cc1Swenshuai.xi 	}
341*53ee8cc1Swenshuai.xi 	pInfo->g_rec_en = (MS_U8)((pConfig->nPbetweenI==0 || pConfig->vopPredType==B_VOP) ? /*0*/(pGopInfo->nCodingOrder&1) : 1);	// nCodingOrder&1 is for testing.
342*53ee8cc1Swenshuai.xi 	pInfo->g_ref_en = pConfig->vopPredType==I_VOP ? 0 : (pConfig->vopPredType==P_VOP?1:3);
343*53ee8cc1Swenshuai.xi 	pInfo->bMvStore = (pConfig->nBbetweenP>0) & ((pConfig->vopPredType==P_VOP) | (/*IVOP_MVSTORE*/1 & (pConfig->vopPredType==I_VOP) & (pGopInfo->nCodingOrder!=0)));
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi #ifdef _GenSkipHeader_
346*53ee8cc1Swenshuai.xi     if(pConfig->VTMode && rc_CheckSkippedFrame(&pConfig->VTRateCtrl)){
347*53ee8cc1Swenshuai.xi         codeNonCodedVOPShortHead(pConfig, pStream);
348*53ee8cc1Swenshuai.xi         // Finalize
349*53ee8cc1Swenshuai.xi         osFlushAll(&pConfig->m_OutStream);
350*53ee8cc1Swenshuai.xi         return;
351*53ee8cc1Swenshuai.xi     }
352*53ee8cc1Swenshuai.xi #endif
353*53ee8cc1Swenshuai.xi     if(pConfig->VTMode) {
354*53ee8cc1Swenshuai.xi         MS_S8 chFrameType;
355*53ee8cc1Swenshuai.xi         if(pConfig->vopPredType==I_VOP)
356*53ee8cc1Swenshuai.xi             chFrameType = 'I';
357*53ee8cc1Swenshuai.xi         else
358*53ee8cc1Swenshuai.xi             chFrameType = 'P';
359*53ee8cc1Swenshuai.xi         {
360*53ee8cc1Swenshuai.xi             //update original ratecontrol struct for set reg.
361*53ee8cc1Swenshuai.xi             CVBRRateControl* rcCtx = &pConfig->ctxRateControl;
362*53ee8cc1Swenshuai.xi             RateCtrl_t* rcVTCtx = &pConfig->VTRateCtrl;
363*53ee8cc1Swenshuai.xi             rcCtx->m_rcGranularity=MBLEVELRC;
364*53ee8cc1Swenshuai.xi             rcCtx->m_nFrameQStep = rcQP2Qstep(rcCtx,rc_InitFrame(&pConfig->VTRateCtrl, chFrameType));
365*53ee8cc1Swenshuai.xi             rcCtx->m_nTargetMbBits = rcVTCtx->m_nTargetBits / rcVTCtx->m_nNFrame;
366*53ee8cc1Swenshuai.xi             rcCtx->m_nMinQP = SPEC_MIN_QP;
367*53ee8cc1Swenshuai.xi             rcCtx->m_nMaxQP = SPEC_MAX_QP;
368*53ee8cc1Swenshuai.xi             rcCtx->m_nMinQStep = SPEC_MIN_QP<<QS_SHIFT_FACTOR;
369*53ee8cc1Swenshuai.xi             rcCtx->m_nMaxQStep = SPEC_MAX_QP<<QS_SHIFT_FACTOR;
370*53ee8cc1Swenshuai.xi             rcCtx->m_nCodecType = pConfig->nCodecType;
371*53ee8cc1Swenshuai.xi             pInfo->intQP = rcQstep2QP(rcCtx, rcCtx->m_nFrameQStep);
372*53ee8cc1Swenshuai.xi             ms_dprintf(DRV_L3, "m_rcGranularity = %d, rcCtx->m_nTargetMbBits = %d",
373*53ee8cc1Swenshuai.xi                 rcCtx->m_rcGranularity, (int)rcCtx->m_nTargetMbBits);
374*53ee8cc1Swenshuai.xi         }
375*53ee8cc1Swenshuai.xi     }
376*53ee8cc1Swenshuai.xi     else
377*53ee8cc1Swenshuai.xi         pInfo->intQP = cvbr_InitFrame(&pConfig->ctxRateControl, pConfig->vopPredType, 0);
378*53ee8cc1Swenshuai.xi 
379*53ee8cc1Swenshuai.xi 	// Frame time
380*53ee8cc1Swenshuai.xi 	pInfo->m_t = pGopInfo->nDispOrder;
381*53ee8cc1Swenshuai.xi 	if (pConfig->vopPredType != B_VOP) {
382*53ee8cc1Swenshuai.xi 		pInfo->m_tPastRef = pInfo->m_tFutureRef;
383*53ee8cc1Swenshuai.xi 		pInfo->m_tFutureRef = pInfo->m_t;
384*53ee8cc1Swenshuai.xi 	}
385*53ee8cc1Swenshuai.xi 	// Handled in codeVOPHeadInitial()
386*53ee8cc1Swenshuai.xi 	//m_tModuloBaseDecd
387*53ee8cc1Swenshuai.xi 	//m_tModuloBaseDisp
388*53ee8cc1Swenshuai.xi 	//m_nBitsModuloBase
389*53ee8cc1Swenshuai.xi 	//m_iVopTimeIncr
390*53ee8cc1Swenshuai.xi 
391*53ee8cc1Swenshuai.xi 	// VideoPacket, GOB parameters
392*53ee8cc1Swenshuai.xi 	pInfo->m_nBitsResyncMarker = 17/*NUMBITS_VP_RESYNC_MARKER*/;
393*53ee8cc1Swenshuai.xi 	if(pConfig->vopPredType == P_VOP)
394*53ee8cc1Swenshuai.xi 		pInfo->m_nBitsResyncMarker += (pInfo->iFCode - 1);
395*53ee8cc1Swenshuai.xi 	else if(pConfig->vopPredType == B_VOP) {
396*53ee8cc1Swenshuai.xi 		// tung : VP 4.21
397*53ee8cc1Swenshuai.xi 		pInfo->m_nBitsResyncMarker += (pInfo->iFCode - 1);
398*53ee8cc1Swenshuai.xi 		if (pInfo->m_nBitsResyncMarker<18)
399*53ee8cc1Swenshuai.xi 			pInfo->m_nBitsResyncMarker = 18;
400*53ee8cc1Swenshuai.xi 		// ~tung
401*53ee8cc1Swenshuai.xi 	}
402*53ee8cc1Swenshuai.xi 
403*53ee8cc1Swenshuai.xi 	// H263
404*53ee8cc1Swenshuai.xi 	pInfo->m_iGobFrameId = (pConfig->vopPredType==P_VOP ? 1 : 0);
405*53ee8cc1Swenshuai.xi 
406*53ee8cc1Swenshuai.xi 	// Buffer management
407*53ee8cc1Swenshuai.xi 	m4veGetBufferAddr(pConfig);
408*53ee8cc1Swenshuai.xi 
409*53ee8cc1Swenshuai.xi 	//MODE 0: (Checking range > real range ) 	reg_mfe_s_marb_miu_bound_err = 0
410*53ee8cc1Swenshuai.xi 	//MODE 1: (Checking range < real range ) 	reg_mfe_s_marb_miu_bound_err = 1
411*53ee8cc1Swenshuai.xi 	//#define TEST_MIU_PROTECTION_MODE 0UL
412*53ee8cc1Swenshuai.xi #ifdef MFE_MIU_PROTECT
413*53ee8cc1Swenshuai.xi 	MHal_MFE_Enable_MIU_Protection(TEST_MIU_PROTECTION_MODE,pConfig);
414*53ee8cc1Swenshuai.xi #endif
415*53ee8cc1Swenshuai.xi 
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi 	// Prepare header
418*53ee8cc1Swenshuai.xi 	osReset(&pConfig->m_OutStream);
419*53ee8cc1Swenshuai.xi 	if (!pInfo->bShortHeader)
420*53ee8cc1Swenshuai.xi 	{
421*53ee8cc1Swenshuai.xi 		// VOS and VO header
422*53ee8cc1Swenshuai.xi 		if (pGopInfo->nCodingOrder==0)
423*53ee8cc1Swenshuai.xi 		{
424*53ee8cc1Swenshuai.xi 			codeSequenceHead(pConfig, pStream);
425*53ee8cc1Swenshuai.xi 			codeVOHead(pConfig, pStream);
426*53ee8cc1Swenshuai.xi 		}
427*53ee8cc1Swenshuai.xi 		// VOL header
428*53ee8cc1Swenshuai.xi #if defined(_MFE_T8_)
429*53ee8cc1Swenshuai.xi 		if (pGopInfo->nCodingOrder==0||pConfig->vopPredType==I_VOP)
430*53ee8cc1Swenshuai.xi #else
431*53ee8cc1Swenshuai.xi 		if (pGopInfo->nCodingOrder==0)
432*53ee8cc1Swenshuai.xi #endif
433*53ee8cc1Swenshuai.xi 		{
434*53ee8cc1Swenshuai.xi 			codeVOLHead(pConfig, pStream);
435*53ee8cc1Swenshuai.xi 		}
436*53ee8cc1Swenshuai.xi 	}
437*53ee8cc1Swenshuai.xi 
438*53ee8cc1Swenshuai.xi 	// VOP header
439*53ee8cc1Swenshuai.xi 	if (pConfig->m_cvbrFrameSkip>0 && pConfig->vopPredType==P_VOP) {
440*53ee8cc1Swenshuai.xi 		if (pConfig->m_bGenSkipVopHeader) {
441*53ee8cc1Swenshuai.xi 			if (pInfo->bShortHeader)
442*53ee8cc1Swenshuai.xi 				codeNonCodedVOPShortHead(pConfig, pStream);
443*53ee8cc1Swenshuai.xi 			else
444*53ee8cc1Swenshuai.xi 				codeNonCodedVOPHead(pConfig, pStream);
445*53ee8cc1Swenshuai.xi 		}
446*53ee8cc1Swenshuai.xi 	}
447*53ee8cc1Swenshuai.xi 	else {
448*53ee8cc1Swenshuai.xi 		if (pInfo->bShortHeader)
449*53ee8cc1Swenshuai.xi 			codeVOPShortHead(pConfig, pStream);
450*53ee8cc1Swenshuai.xi 		else
451*53ee8cc1Swenshuai.xi 			codeVOPHead(pConfig, pStream);
452*53ee8cc1Swenshuai.xi 	}
453*53ee8cc1Swenshuai.xi 	// Finalize
454*53ee8cc1Swenshuai.xi 	osFlushAll(&pConfig->m_OutStream);
455*53ee8cc1Swenshuai.xi 	pBitsInfo->ptr = pStream->m_pbFrameBuffer;
456*53ee8cc1Swenshuai.xi 	pBitsInfo->len = pStream->m_nByteCount;
457*53ee8cc1Swenshuai.xi 	if ((pStream->BC_nCumulativeBits&7)==0) {
458*53ee8cc1Swenshuai.xi 		pBitsInfo->bit_len = 0;
459*53ee8cc1Swenshuai.xi 		pBitsInfo->bits = 0;
460*53ee8cc1Swenshuai.xi 	}
461*53ee8cc1Swenshuai.xi 	else {
462*53ee8cc1Swenshuai.xi 		pBitsInfo->len--;
463*53ee8cc1Swenshuai.xi 		pBitsInfo->bit_len = pStream->BC_nCumulativeBits&7;
464*53ee8cc1Swenshuai.xi 		pBitsInfo->bits = pStream->m_pbFrameBuffer[pStream->BC_nCumulativeBits>>3] & gBITMASK[pBitsInfo->bit_len];
465*53ee8cc1Swenshuai.xi 	}
466*53ee8cc1Swenshuai.xi /*
467*53ee8cc1Swenshuai.xi #if DEBUG_LEVEL
468*53ee8cc1Swenshuai.xi 	{	// DEBUG codes
469*53ee8cc1Swenshuai.xi 		MS_S32 i;
470*53ee8cc1Swenshuai.xi 		ms_dprintk(DRV_L3,"FDC bitcount %d ==> "), pBitsInfo->len*8+pBitsInfo->bit_len);
471*53ee8cc1Swenshuai.xi 		for (i=0; i<pBitsInfo->len; i++) {
472*53ee8cc1Swenshuai.xi 			ms_dprintk(DRV_L3,"%02x "), pBitsInfo->ptr[i]);
473*53ee8cc1Swenshuai.xi 		}
474*53ee8cc1Swenshuai.xi 		ms_dprintk(DRV_L3,"%02x(msb %d bits)\n"), pBitsInfo->bits, pBitsInfo->bit_len);
475*53ee8cc1Swenshuai.xi 	}
476*53ee8cc1Swenshuai.xi #endif
477*53ee8cc1Swenshuai.xi */
478*53ee8cc1Swenshuai.xi 	// Set reg and start encoding
479*53ee8cc1Swenshuai.xi 	OutputSwCfg1_Mp4(pGopInfo->nCodingOrder, pConfig);
480*53ee8cc1Swenshuai.xi 	ms_dprintk(DRV_L3,"In mfeM4VE_EncodeFrame() After OutputSwCfg1_Mp4\n");
481*53ee8cc1Swenshuai.xi }
482*53ee8cc1Swenshuai.xi 
483*53ee8cc1Swenshuai.xi 
484*53ee8cc1Swenshuai.xi 
mfeM4VE_UpdateFrame(MFE_CONFIG * pConfig)485*53ee8cc1Swenshuai.xi void mfeM4VE_UpdateFrame(MFE_CONFIG *pConfig)
486*53ee8cc1Swenshuai.xi {
487*53ee8cc1Swenshuai.xi 	if (pConfig->vopPredType==I_VOP)
488*53ee8cc1Swenshuai.xi 		IntraUpdateInit(pConfig);
489*53ee8cc1Swenshuai.xi 	IntraUpdateFrame(pConfig);
490*53ee8cc1Swenshuai.xi 
491*53ee8cc1Swenshuai.xi 	// Rate control
492*53ee8cc1Swenshuai.xi 	MfeDrvRateControlUpdate(pConfig, 0);
493*53ee8cc1Swenshuai.xi 
494*53ee8cc1Swenshuai.xi }
495*53ee8cc1Swenshuai.xi 
496*53ee8cc1Swenshuai.xi // Trd must >= Trb, no checking here.
TrbTrdReduction(MS_S32 * Trb,MS_S32 * Trd)497*53ee8cc1Swenshuai.xi static void TrbTrdReduction(MS_S32* Trb, MS_S32* Trd)
498*53ee8cc1Swenshuai.xi {
499*53ee8cc1Swenshuai.xi 	MS_S32 r;
500*53ee8cc1Swenshuai.xi 	MS_S32 d = *Trd;
501*53ee8cc1Swenshuai.xi 	MS_S32 b = *Trb;
502*53ee8cc1Swenshuai.xi 
503*53ee8cc1Swenshuai.xi 	if (b==d) {
504*53ee8cc1Swenshuai.xi 		*Trb = *Trd = 1;
505*53ee8cc1Swenshuai.xi 		return;
506*53ee8cc1Swenshuai.xi 	}
507*53ee8cc1Swenshuai.xi 
508*53ee8cc1Swenshuai.xi 	// b < d
509*53ee8cc1Swenshuai.xi 	while(1) {
510*53ee8cc1Swenshuai.xi 		r = d%b;
511*53ee8cc1Swenshuai.xi 		if(r==0) {
512*53ee8cc1Swenshuai.xi 			*Trb /= b;
513*53ee8cc1Swenshuai.xi 			*Trd /= b;
514*53ee8cc1Swenshuai.xi 			return;
515*53ee8cc1Swenshuai.xi 		}
516*53ee8cc1Swenshuai.xi 		d = b;
517*53ee8cc1Swenshuai.xi 		b = r;
518*53ee8cc1Swenshuai.xi 	}
519*53ee8cc1Swenshuai.xi }
520*53ee8cc1Swenshuai.xi 
OutputSwCfg1_Mp4(MS_S32 nFrmNum,MFE_CONFIG * pConfig)521*53ee8cc1Swenshuai.xi void OutputSwCfg1_Mp4(MS_S32 nFrmNum, MFE_CONFIG* pConfig)
522*53ee8cc1Swenshuai.xi {
523*53ee8cc1Swenshuai.xi 
524*53ee8cc1Swenshuai.xi 	MS_S32 nTarWriteCount;
525*53ee8cc1Swenshuai.xi 	MS_S32 nRegWriteCount;
526*53ee8cc1Swenshuai.xi 	MS_S32 nTarFDCCount;
527*53ee8cc1Swenshuai.xi 	MS_S32 nRegFDCCount;
528*53ee8cc1Swenshuai.xi 
529*53ee8cc1Swenshuai.xi 	M4VEINFO* pM4veInfo = &pConfig->ctxM4veInfo;
530*53ee8cc1Swenshuai.xi 	BufInfo* pBufInfo = &pConfig->ctxBufInfo;
531*53ee8cc1Swenshuai.xi 	BitsInfo* pBitsInfo = &pConfig->ctxBitsInfo;
532*53ee8cc1Swenshuai.xi 	CVBRRateControl* rcCtx = &pConfig->ctxRateControl;
533*53ee8cc1Swenshuai.xi     MFE_REG* mfe_reg = &pConfig->mfe_reg;
534*53ee8cc1Swenshuai.xi 
535*53ee8cc1Swenshuai.xi 	//////////////////////////////////////////////////////////////////////////
536*53ee8cc1Swenshuai.xi 	// Sequence-wide settings
537*53ee8cc1Swenshuai.xi 
538*53ee8cc1Swenshuai.xi 	if (nFrmNum==0) {
539*53ee8cc1Swenshuai.xi 		memset(mfe_reg, 0, sizeof(MFE_REG));	// Initial
540*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_enc_mode = pM4veInfo->bShortHeader ? REG_ENC_MODE_H263 : REG_ENC_MODE_MPG4;
541*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_pic_width = pConfig->nBufWidth;
542*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_pic_height = pConfig->nBufHeight;
543*53ee8cc1Swenshuai.xi #ifdef _MFE_M1_
544*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_jpe_buffer_mode=0;
545*53ee8cc1Swenshuai.xi #endif
546*53ee8cc1Swenshuai.xi 		if (mfe_reg->reg_mfe_g_enc_mode==REG_ENC_MODE_MPG4) {	// MPEG-4
547*53ee8cc1Swenshuai.xi 			// Qtable
548*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_qmode = pM4veInfo->bQuantizerType;
549*53ee8cc1Swenshuai.xi 
550*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_mp4_itlc = pM4veInfo->bInterlacedCoding;
551*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_mp4_pskip_off = (pM4veInfo->bAllowSkippedPMBs==0);
552*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_mp4_acp = (0<<1) | 1;	// disabled
553*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_er_hec = pM4veInfo->bHECEnabled;
554*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_er_hec_t = pM4veInfo->nHECPeriod;
555*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_mp4_direct_en = pM4veInfo->nAllowDirectBMBs==0 ? 0 : 1;
556*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_inter_pref = 512;	// inter-intra selection
557*53ee8cc1Swenshuai.xi 
558*53ee8cc1Swenshuai.xi 			// ME partition type
559*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_16x16_disable = 0;
560*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_8x8_disable = 0;
561*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_16x8_disable = 1;
562*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_8x16_disable = 1;
563*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_8x4_disable = 1;
564*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_4x8_disable = 1;
565*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_4x4_disable = 1;
566*53ee8cc1Swenshuai.xi 
567*53ee8cc1Swenshuai.xi 			// MDC
568*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_mdc_total_mb_bw = pM4veInfo->nNumBitsVPMBnum;
569*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_mdc_m4vop_tinc_bw = pM4veInfo->nNumBitsTimeIncr;
570*53ee8cc1Swenshuai.xi 
571*53ee8cc1Swenshuai.xi 			// Field DCT
572*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_mp4_flddct_en = pM4veInfo->bInterlace ? 1 : 0;
573*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_mp4_flddct_diff_thr = FIELD_DCT_DIFF_THR;
574*53ee8cc1Swenshuai.xi 		}
575*53ee8cc1Swenshuai.xi 		if (mfe_reg->reg_mfe_g_enc_mode==REG_ENC_MODE_H263) {	// H263
576*53ee8cc1Swenshuai.xi 			// Qtable
577*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_qmode = 0;
578*53ee8cc1Swenshuai.xi 
579*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_er_h263_unit = pM4veInfo->nGobUnit;
580*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_inter_pref = 512;	// inter-intra selection
581*53ee8cc1Swenshuai.xi 
582*53ee8cc1Swenshuai.xi 			// ME partition type
583*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_16x16_disable = 0;
584*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_ime_sr16 = 1;
585*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_ime_umv_disable = 1;
586*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_8x8_disable = 1;
587*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_16x8_disable = 1;
588*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_8x16_disable = 1;
589*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_8x4_disable = 1;
590*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_4x8_disable = 1;
591*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_me_4x4_disable = 1;
592*53ee8cc1Swenshuai.xi 		}
593*53ee8cc1Swenshuai.xi #ifdef _MFE_M1_
594*53ee8cc1Swenshuai.xi             // pre-fetch
595*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_prfh_cryc_en = 1;
596*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_prfh_refy_en = 1;
597*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_prfh_cryc_idle_cnt = 0;
598*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_prfh_refy_idle_cnt = 0;
599*53ee8cc1Swenshuai.xi 
600*53ee8cc1Swenshuai.xi 		if (pConfig->m_bFrameMode) {
601*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_jpe_buffer_mode = 1;	// frame-mode
602*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_jpe_fsvs_mode = 0;
603*53ee8cc1Swenshuai.xi 		}
604*53ee8cc1Swenshuai.xi 		else {
605*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_jpe_buffer_mode = 0;	// row-mode
606*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_jpe_multibuf_mode = 0;
607*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_jpe_enc_mode = 0;	// 420
608*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_jpe_qfactor = 3;
609*53ee8cc1Swenshuai.xi #if defined(TEST_INPUT_ROW_MODE_HWAUTO_OK) || defined(TEST_INPUT_ROW_MODE_HWAUTO_FAIL1) || defined(TEST_INPUT_ROW_MODE_HWAUTO_FAIL2) || defined(TEST_INPUT_ROW_MODE_HWAUTO_FAIL3)
610*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_jpe_fsvs_mode=3;
611*53ee8cc1Swenshuai.xi #elif defined(TEST_INPUT_ROW_MODE_HW_OK) || defined(TEST_INPUT_ROW_MODE_HW_FAIL)
612*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_jpe_fsvs_mode=2;
613*53ee8cc1Swenshuai.xi #elif defined(TEST_INPUT_ROW_MODE_SWHW_OK) || defined(TEST_INPUT_ROW_MODE_SWHW_FAIL)
614*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_jpe_fsvs_mode=1;
615*53ee8cc1Swenshuai.xi #else
616*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_jpe_fsvs_mode=2;
617*53ee8cc1Swenshuai.xi #endif
618*53ee8cc1Swenshuai.xi 		}
619*53ee8cc1Swenshuai.xi 
620*53ee8cc1Swenshuai.xi #ifdef SW_BUF_MODE
621*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_sw_buffer_mode = 1;
622*53ee8cc1Swenshuai.xi #else
623*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_sw_buffer_mode = 0;
624*53ee8cc1Swenshuai.xi #endif
625*53ee8cc1Swenshuai.xi #endif //_MFE_M1_
626*53ee8cc1Swenshuai.xi 	}
627*53ee8cc1Swenshuai.xi 	else {
628*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_frame_start_sw = 0;
629*53ee8cc1Swenshuai.xi 	}
630*53ee8cc1Swenshuai.xi 
631*53ee8cc1Swenshuai.xi 
632*53ee8cc1Swenshuai.xi 	//////////////////////////////////////////////////////////////////////////
633*53ee8cc1Swenshuai.xi 	// Frame-wide settings
634*53ee8cc1Swenshuai.xi #ifdef CLOCK_GATING
635*53ee8cc1Swenshuai.xi     mfe_reg->reg16 = 0xffff;	// clock gating
636*53ee8cc1Swenshuai.xi #endif
637*53ee8cc1Swenshuai.xi 
638*53ee8cc1Swenshuai.xi 	// Input buffer address: Must be 256-byte aligned.
639*53ee8cc1Swenshuai.xi 	MS_ASSERT((pBufInfo->m_nCurYAddr.miuAddress&0xFF)==0);
640*53ee8cc1Swenshuai.xi 	MS_ASSERT((pBufInfo->m_nCurCAddr.miuAddress&0xFF)==0);
641*53ee8cc1Swenshuai.xi 	MS_ASSERT((pBufInfo->m_nRefYAddr[0].miuAddress&0xFF)==0);
642*53ee8cc1Swenshuai.xi 	MS_ASSERT((pBufInfo->m_nRefCAddr[0].miuAddress&0xFF)==0);
643*53ee8cc1Swenshuai.xi     if(pConfig->m_bFrameMode==0) {
644*53ee8cc1Swenshuai.xi 	MS_ASSERT((pBufInfo->m_nRefYAddr[1].miuAddress&0xFF)==0);
645*53ee8cc1Swenshuai.xi 	MS_ASSERT((pBufInfo->m_nRefCAddr[1].miuAddress&0xFF)==0);
646*53ee8cc1Swenshuai.xi     }
647*53ee8cc1Swenshuai.xi 	MS_ASSERT((pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress&0x7)==0);
648*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_cur_y_adr_low  = (MS_U16)((pBufInfo->m_nCurYAddr.miuAddress>>8)&0xFFFF);
649*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_cur_y_adr_high = (MS_U16)(pBufInfo->m_nCurYAddr.miuAddress>>(8+16));
650*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_cur_c_adr_low  = (MS_U16)((pBufInfo->m_nCurCAddr.miuAddress>>8)&0xFFFF);
651*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_cur_c_adr_high = (MS_U16)(pBufInfo->m_nCurCAddr.miuAddress>>(8+16));
652*53ee8cc1Swenshuai.xi 
653*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_ref_y_adr0_low  = (MS_U16)((pBufInfo->m_nRefYAddr[0].miuAddress>>8)&0xFFFF);
654*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_ref_y_adr0_high = (MS_U16)(pBufInfo->m_nRefYAddr[0].miuAddress>>(8+16));
655*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_ref_c_adr0_low  = (MS_U16)((pBufInfo->m_nRefCAddr[0].miuAddress>>8)&0xFFFF);
656*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_ref_c_adr0_high = (MS_U16)(pBufInfo->m_nRefCAddr[0].miuAddress>>(8+16));
657*53ee8cc1Swenshuai.xi      if(pConfig->m_bFrameMode==0) {
658*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_ref_y_adr1_low  = (MS_U16)((pBufInfo->m_nRefYAddr[1].miuAddress>>8)&0xFFFF);
659*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_ref_y_adr1_high = (MS_U16)(pBufInfo->m_nRefYAddr[1].miuAddress>>(8+16));
660*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_ref_c_adr1_low  = (MS_U16)((pBufInfo->m_nRefCAddr[1].miuAddress>>8)&0xFFFF);
661*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_ref_c_adr1_high = (MS_U16)(pBufInfo->m_nRefCAddr[1].miuAddress>>(8+16));
662*53ee8cc1Swenshuai.xi     }
663*53ee8cc1Swenshuai.xi #ifdef USE_CUR_AS_REC
664*53ee8cc1Swenshuai.xi 	MS_ASSERT(pBufInfo->m_nRecYAddr.miuAddress==pBufInfo->m_nCurYAddr.miuAddress);
665*53ee8cc1Swenshuai.xi 	MS_ASSERT(pBufInfo->m_nRecCAddr.miuAddress==pBufInfo->m_nCurCAddr.miuAddress);
666*53ee8cc1Swenshuai.xi #endif
667*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_rec_y_adr_low  = (MS_U16)((pBufInfo->m_nRecYAddr.miuAddress>>8)&0xFFFF);
668*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_rec_y_adr_high = (MS_U16)(pBufInfo->m_nRecYAddr.miuAddress>>(8+16));
669*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_rec_c_adr_low  = (MS_U16)((pBufInfo->m_nRecCAddr.miuAddress>>8)&0xFFFF);
670*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_rec_c_adr_high = (MS_U16)(pBufInfo->m_nRecCAddr.miuAddress>>(8+16));
671*53ee8cc1Swenshuai.xi 
672*53ee8cc1Swenshuai.xi 	// Output buffers: Must be 8-byte aligned.
673*53ee8cc1Swenshuai.xi #if defined(_MFE_M1_)||defined(_MFE_AGATE_)
674*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_bspobuf_hw_en = 0;
675*53ee8cc1Swenshuai.xi #if defined(USE_HW_DBL_OBUF)
676*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_bspobuf_hw_en = 1;
677*53ee8cc1Swenshuai.xi #endif
678*53ee8cc1Swenshuai.xi #else
679*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_bspobuf_sadr_low  = (MS_U16)((pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress>>3)&0xFFFF);
680*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_bspobuf_sadr_high = (MS_U16)(pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress>>(3+16));
681*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_bspobuf_eadr_low  = (MS_U16)(((pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress+pBufInfo->m_OutBufferSize-8)>>3)&0xFFFF);
682*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_bspobuf_eadr_high = (MS_U16)((pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress+pBufInfo->m_OutBufferSize-8)>>(3+16));
683*53ee8cc1Swenshuai.xi #endif
684*53ee8cc1Swenshuai.xi 	// GN
685*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_gn_sadr_low  = (MS_U16)((pBufInfo->m_nGNAddr.miuAddress>>3)&0xFFFF);
686*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_gn_sadr_high = (MS_U16)(pBufInfo->m_nGNAddr.miuAddress>>(3+16));
687*53ee8cc1Swenshuai.xi #ifdef _MFE_M1_
688*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_s_gn_sadr_mode =
689*53ee8cc1Swenshuai.xi #if defined(GN_WHOLE_FRAME)
690*53ee8cc1Swenshuai.xi         1;
691*53ee8cc1Swenshuai.xi #else
692*53ee8cc1Swenshuai.xi         0;
693*53ee8cc1Swenshuai.xi #endif
694*53ee8cc1Swenshuai.xi #endif
695*53ee8cc1Swenshuai.xi 
696*53ee8cc1Swenshuai.xi 	// MV store
697*53ee8cc1Swenshuai.xi 	if (mfe_reg->reg_mfe_g_enc_mode==REG_ENC_MODE_MPG4) {
698*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_mp4_direct_mvstore = pBufInfo->m_bEnableMvStore;
699*53ee8cc1Swenshuai.xi 		if (mfe_reg->reg_mfe_g_mp4_direct_mvstore) {
700*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_mvobuf_sadr_low  = (MS_U16)((pBufInfo->m_nMvStoreAddr.miuAddress>>3)&0xFFFF);
701*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_mvobuf_sadr_high = (MS_U16)(pBufInfo->m_nMvStoreAddr.miuAddress>>(3+16));
702*53ee8cc1Swenshuai.xi 		}
703*53ee8cc1Swenshuai.xi 		if (mfe_reg->reg_mfe_g_mp4_direct_en) {
704*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_gn_mvibuf_sadr_low  = (MS_U16)((pBufInfo->m_nMvStoreAddr.miuAddress>>3)&0xFFFF);
705*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_gn_mvibuf_sadr_high = (MS_U16)(pBufInfo->m_nMvStoreAddr.miuAddress>>(3+16));
706*53ee8cc1Swenshuai.xi 		}
707*53ee8cc1Swenshuai.xi 	}
708*53ee8cc1Swenshuai.xi #ifdef _MFE_M1_
709*53ee8cc1Swenshuai.xi 	// IMI buffer
710*53ee8cc1Swenshuai.xi     if(pConfig->MfeAdvInfo.input_imi_en) {
711*53ee8cc1Swenshuai.xi         mfe_reg->reg_mfe_s_marb_eimi_block = 0x1;
712*53ee8cc1Swenshuai.xi         WriteRegMFE(0x68, mfe_reg->reg68, (MS_S8*)("[%d] reg68"), nRegWriteCount, (MS_S8*)("IMI enable"));
713*53ee8cc1Swenshuai.xi     }
714*53ee8cc1Swenshuai.xi     else
715*53ee8cc1Swenshuai.xi         mfe_reg->reg_mfe_s_marb_eimi_block = 0x0;
716*53ee8cc1Swenshuai.xi 
717*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_marb_lbwd_mode = 0;
718*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_marb_imi_sadr_low = 0;
719*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_marb_imi_sadr_high = 0;
720*53ee8cc1Swenshuai.xi 
721*53ee8cc1Swenshuai.xi     if (pConfig->vopPredType!=I_VOP && pConfig->MfeAdvInfo.low_bandwidth_en && pConfig->imi_size>0) {
722*53ee8cc1Swenshuai.xi         mfe_reg->reg_mfe_s_marb_eimi_block = 1;
723*53ee8cc1Swenshuai.xi         mfe_reg->reg_mfe_s_marb_lbwd_mode = 1;
724*53ee8cc1Swenshuai.xi         mfe_reg->reg_mfe_s_marb_imi_sadr_low = (pConfig->imi_addr>>3)&0xFFFF;
725*53ee8cc1Swenshuai.xi         mfe_reg->reg_mfe_s_marb_imi_sadr_high = pConfig->imi_addr>>(3+16);
726*53ee8cc1Swenshuai.xi         switch (pConfig->imi_size) {
727*53ee8cc1Swenshuai.xi             // 0: 64kB, 1:32kB, 2:16kB, 3:8kB
728*53ee8cc1Swenshuai.xi         case 0x10000:
729*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_marb_imi_cache_size = 0;
730*53ee8cc1Swenshuai.xi             break;
731*53ee8cc1Swenshuai.xi         case 0x8000:
732*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_marb_imi_cache_size = 1;
733*53ee8cc1Swenshuai.xi             break;
734*53ee8cc1Swenshuai.xi         case 0x4000:
735*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_marb_imi_cache_size = 2;
736*53ee8cc1Swenshuai.xi             break;
737*53ee8cc1Swenshuai.xi         case 0x2000:
738*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_marb_imi_cache_size = 3;
739*53ee8cc1Swenshuai.xi             break;
740*53ee8cc1Swenshuai.xi         default:
741*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_marb_imi_cache_size = 0;
742*53ee8cc1Swenshuai.xi             MS_ASSERT(0);
743*53ee8cc1Swenshuai.xi         }
744*53ee8cc1Swenshuai.xi     }
745*53ee8cc1Swenshuai.xi #endif
746*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_frame_type = pConfig->vopPredType==I_VOP ? 0 : (pConfig->vopPredType==P_VOP?1:2);
747*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_ref_no = pConfig->vopPredType==P_VOP ? 0 : (pConfig->vopPredType==B_VOP&&(!pM4veInfo->nAllowDirectBMBs)&&pM4veInfo->g_ref_en!=3 ? 0 : 1);
748*53ee8cc1Swenshuai.xi 
749*53ee8cc1Swenshuai.xi 	// ME setting
750*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_ime_mesr_max_addr = (pM4veInfo->SEARCH_RANGE_Y==16 ? 95 : 83);//0x5f;
751*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_ime_mesr_min_addr = (pM4veInfo->SEARCH_RANGE_Y==16 ? 0 : 16);//0;
752*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_ime_mvx_min = -(pConfig->vopPredType==I_VOP?0:pM4veInfo->iSearchRangeForward) + 32;	// Min X is -pVopMd->iSearchRangeForward
753*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_ime_mvx_max = ((pConfig->vopPredType==I_VOP?0:pM4veInfo->iSearchRangeForward)-2) + 32;	// Max X is pVopMd->iSearchRangeForward-1
754*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_ime_mvy_min = -pM4veInfo->SEARCH_RANGE_Y + 16;					// Min Y
755*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_ime_mvy_max = (pM4veInfo->SEARCH_RANGE_Y==16 ? 15 : 8) + 16;		// Max Y
756*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_ime_sr16 = (mfe_reg->reg_mfe_s_ime_mvx_min>=16 ? 1 : 0);
757*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_mesr_adapt = pM4veInfo->IME_ADAPTIVE_WINDOW?1:0;
758*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_me_ref_en_mode = pM4veInfo->g_ref_en;
759*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_ime_ime_wait_fme = 1;
760*53ee8cc1Swenshuai.xi #ifdef FME_PIPELINE_OPEN
761*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_fme_pipeline_on = mfe_reg->reg_mfe_s_ime_ime_wait_fme ? 1 : 0;
762*53ee8cc1Swenshuai.xi #else
763*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_fme_pipeline_on = 0x0;
764*53ee8cc1Swenshuai.xi #endif
765*53ee8cc1Swenshuai.xi 
766*53ee8cc1Swenshuai.xi 	// Intra update
767*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_s_txip_irfsh_en = 0;
768*53ee8cc1Swenshuai.xi 
769*53ee8cc1Swenshuai.xi     if(mfe_reg->reg_mfe_s_txip_irfsh_en)
770*53ee8cc1Swenshuai.xi     {
771*53ee8cc1Swenshuai.xi         MS_S32 i;
772*53ee8cc1Swenshuai.xi         MS_S32 count, prv_intra;
773*53ee8cc1Swenshuai.xi         MS_S32 start[2], end[2];
774*53ee8cc1Swenshuai.xi         IntraUpdateContext* ctx = &pConfig->m_IUContext;
775*53ee8cc1Swenshuai.xi 
776*53ee8cc1Swenshuai.xi         count = 0;
777*53ee8cc1Swenshuai.xi         prv_intra = 0;
778*53ee8cc1Swenshuai.xi         for (i=0; i<ctx->nTotalMb; i++) {
779*53ee8cc1Swenshuai.xi         	if (ctx->pHwMbMap[i].intra) {
780*53ee8cc1Swenshuai.xi                 if (prv_intra==0) {
781*53ee8cc1Swenshuai.xi                     count++;
782*53ee8cc1Swenshuai.xi                     if (count>2) {
783*53ee8cc1Swenshuai.xi                         MS_ASSERT(0);
784*53ee8cc1Swenshuai.xi                     }
785*53ee8cc1Swenshuai.xi                     start[count-1] = end[count-1] = i;
786*53ee8cc1Swenshuai.xi                 }
787*53ee8cc1Swenshuai.xi                 else
788*53ee8cc1Swenshuai.xi                     end[count-1] = i;
789*53ee8cc1Swenshuai.xi         	}
790*53ee8cc1Swenshuai.xi         	prv_intra = ctx->pHwMbMap[i].intra;
791*53ee8cc1Swenshuai.xi         }
792*53ee8cc1Swenshuai.xi         if (count>0) {
793*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_txip_irfsh_en |= 1;
794*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_txip_irfsh_mb_s0 = start[0];
795*53ee8cc1Swenshuai.xi             mfe_reg->reg_mfe_s_txip_irfsh_mb_e0 = end[0];
796*53ee8cc1Swenshuai.xi         }
797*53ee8cc1Swenshuai.xi         if (count>1) {
798*53ee8cc1Swenshuai.xi         	mfe_reg->reg_mfe_s_txip_irfsh_en |= 2;
799*53ee8cc1Swenshuai.xi         	mfe_reg->reg_mfe_s_txip_irfsh_mb_s1 = start[1];
800*53ee8cc1Swenshuai.xi         	mfe_reg->reg_mfe_s_txip_irfsh_mb_e1 = end[1];
801*53ee8cc1Swenshuai.xi         }
802*53ee8cc1Swenshuai.xi     }
803*53ee8cc1Swenshuai.xi 
804*53ee8cc1Swenshuai.xi 
805*53ee8cc1Swenshuai.xi 
806*53ee8cc1Swenshuai.xi 	// LastZZ
807*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_quan_idx_last = pM4veInfo->m_nLastZZ;
808*53ee8cc1Swenshuai.xi 	if (mfe_reg->reg_mfe_s_quan_idx_last<63)
809*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_quan_idx_swlast = 1;
810*53ee8cc1Swenshuai.xi 		else
811*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_quan_idx_swlast = 0;
812*53ee8cc1Swenshuai.xi 
813*53ee8cc1Swenshuai.xi 	if (mfe_reg->reg_mfe_g_enc_mode==REG_ENC_MODE_MPG4) {	// MPEG-4
814*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_quarter_disable = 1;
815*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_half_disable = (pM4veInfo->m_nFmePrec==0);
816*53ee8cc1Swenshuai.xi 		//mfe_reg->reg_mfe_s_fme_one_mode = 0;
817*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_pmv_enable = 0;
818*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_mode_no = pConfig->vopPredType==P_VOP ? 1 : 0;
819*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_mode0_refno = pConfig->vopPredType==P_VOP ? 0 : ((pConfig->vopPredType==B_VOP&&pM4veInfo->g_ref_en!=3)?0:1);
820*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_mode1_refno = 0;
821*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_mode2_refno = 0;
822*53ee8cc1Swenshuai.xi 
823*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_mp4_rounding_ctrl = pM4veInfo->iRoundingControl;
824*53ee8cc1Swenshuai.xi 		// codeVideoPacketHeader
825*53ee8cc1Swenshuai.xi 		MS_ASSERT(pM4veInfo->m_nBitsResyncMarker==17||pM4veInfo->m_nBitsResyncMarker==18);
826*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_mdc_m4vpktpzero = (pM4veInfo->m_nBitsResyncMarker-1==17) ? 1 : 0;
827*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_mdc_m4time = pM4veInfo->m_nBitsModuloBase;
828*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_mdc_m4vop_tinc = pM4veInfo->m_iVopTimeIncr;
829*53ee8cc1Swenshuai.xi 
830*53ee8cc1Swenshuai.xi 		// B-direct mode
831*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_mp4_direct_pref = 129;
832*53ee8cc1Swenshuai.xi 		{
833*53ee8cc1Swenshuai.xi 			MS_S32 trd = pM4veInfo->m_tFutureRef - pM4veInfo->m_tPastRef;
834*53ee8cc1Swenshuai.xi 			MS_S32 trb = pM4veInfo->m_t - pM4veInfo->m_tPastRef;
835*53ee8cc1Swenshuai.xi 			if (trb&trb)
836*53ee8cc1Swenshuai.xi 				TrbTrdReduction(&trb, &trd);
837*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_mp4_direct_trb = trb;
838*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_g_mp4_direct_trd = trd;
839*53ee8cc1Swenshuai.xi 		}
840*53ee8cc1Swenshuai.xi 	}
841*53ee8cc1Swenshuai.xi 
842*53ee8cc1Swenshuai.xi 
843*53ee8cc1Swenshuai.xi 	if (mfe_reg->reg_mfe_g_enc_mode==REG_ENC_MODE_H263) {	// H263
844*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_quarter_disable = 1;
845*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_half_disable = (pM4veInfo->m_nFmePrec==0);
846*53ee8cc1Swenshuai.xi 		//mfe_reg->reg_mfe_s_fme_one_mode = 1;
847*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_pmv_enable = 0;
848*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_mode_no = 0;
849*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_mode0_refno = 0;
850*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_mode1_refno = 0;
851*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_fme_mode2_refno = 0;
852*53ee8cc1Swenshuai.xi 
853*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_s_mdc_gob_frame_id = pM4veInfo->m_iGobFrameId;
854*53ee8cc1Swenshuai.xi 	}
855*53ee8cc1Swenshuai.xi             ms_dprintf(DRV_L3,"m_rcGranularity = %d",rcCtx->m_rcGranularity);
856*53ee8cc1Swenshuai.xi 	// MBR
857*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_mbr_en = rcCtx->m_rcGranularity==MBLEVELRC ? 1 : 0;
858*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_mbr_pqp_dlimit = LEFT_QP_DIFF_LIMIT;
859*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_mbr_uqp_dlimit = TOP_QP_DIFF_LIMIT;
860*53ee8cc1Swenshuai.xi 	// er_en
861*53ee8cc1Swenshuai.xi 	if (rcCtx->m_nVPMbRow>0 && rcCtx->m_nVPSize<=0)
862*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_er_mode = 0;
863*53ee8cc1Swenshuai.xi 	else if (rcCtx->m_nVPMbRow<=0 && rcCtx->m_nVPSize>0)
864*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_er_mode = 1;
865*53ee8cc1Swenshuai.xi 	else if (rcCtx->m_nVPMbRow>0 && rcCtx->m_nVPSize>0)
866*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_er_mode = 2;
867*53ee8cc1Swenshuai.xi 	else
868*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_er_mode = 3;
869*53ee8cc1Swenshuai.xi 
870*53ee8cc1Swenshuai.xi 	if (rcCtx->m_nVPMbRow==0 || rcCtx->m_nVPMbRow==1)
871*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_er_mby = 0;
872*53ee8cc1Swenshuai.xi 	else if (rcCtx->m_nVPMbRow==2)
873*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_er_mby = 1;
874*53ee8cc1Swenshuai.xi 	else if (rcCtx->m_nVPMbRow==4)
875*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_er_mby = 2;
876*53ee8cc1Swenshuai.xi 	else if (rcCtx->m_nVPMbRow==8)
877*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_er_mby = 3;
878*53ee8cc1Swenshuai.xi 	else if (rcCtx->m_nVPMbRow>0)
879*53ee8cc1Swenshuai.xi 		MS_ASSERT(0);
880*53ee8cc1Swenshuai.xi 	if (mfe_reg->reg_mfe_g_er_mode==1 || mfe_reg->reg_mfe_g_er_mode==2)
881*53ee8cc1Swenshuai.xi 		mfe_reg->reg_mfe_g_er_bs_th = rcCtx->m_nVPSize;
882*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_qscale = pM4veInfo->intQP;
883*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_mbr_frame_qstep = rcCtx->m_nFrameQStep;
884*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_mbr_tmb_bits = rcCtx->m_nTargetMbBits;
885*53ee8cc1Swenshuai.xi 	// QP/QStep: Min, max
886*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_mbr_qp_min = rcCtx->m_nMinQP;
887*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_mbr_qp_max = rcCtx->m_nMaxQP;
888*53ee8cc1Swenshuai.xi 	MS_ASSERT(rcCtx->m_nMinQStep<(2<<7));
889*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_mbr_qstep_min = rcCtx->m_nMinQStep;
890*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_mbr_qstep_max = rcCtx->m_nMaxQStep;
891*53ee8cc1Swenshuai.xi 
892*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_rec_en = pM4veInfo->g_rec_en;
893*53ee8cc1Swenshuai.xi 
894*53ee8cc1Swenshuai.xi #ifdef HW_ECO_STARTCODE_PREVENTION
895*53ee8cc1Swenshuai.xi     mfe_reg->reg_eco_bsp_rdy_fix = 1;
896*53ee8cc1Swenshuai.xi #if defined(_MFE_EDISON_)
897*53ee8cc1Swenshuai.xi     //agate U02 cannot set this.
898*53ee8cc1Swenshuai.xi     mfe_reg->reg_eco_bsp_multi_slice_fix = 1;
899*53ee8cc1Swenshuai.xi #endif
900*53ee8cc1Swenshuai.xi #endif
901*53ee8cc1Swenshuai.xi 	//////////////////////////////////////////////////////////////////////////
902*53ee8cc1Swenshuai.xi 	// swcfg1 output
903*53ee8cc1Swenshuai.xi 	nTarWriteCount = 0;
904*53ee8cc1Swenshuai.xi 	nRegWriteCount = 0;
905*53ee8cc1Swenshuai.xi 	nTarFDCCount = 0;
906*53ee8cc1Swenshuai.xi 	nRegFDCCount = 0;
907*53ee8cc1Swenshuai.xi 	if (nFrmNum==0)
908*53ee8cc1Swenshuai.xi 		WriteQTable(mfe_reg, pM4veInfo->rgiIntraQuantizerMatrix, pM4veInfo->rgiInterQuantizerMatrix);
909*53ee8cc1Swenshuai.xi 
910*53ee8cc1Swenshuai.xi 	nRegWriteCount = 0;
911*53ee8cc1Swenshuai.xi #ifdef _MFE_M1_
912*53ee8cc1Swenshuai.xi 	//FDC
913*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_bsp_fdc_skip = 0;
914*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_s_bsp_fdc_offset = 0;
915*53ee8cc1Swenshuai.xi 	nTarFDCCount = PutFDC(mfe_reg, pBitsInfo, 1);
916*53ee8cc1Swenshuai.xi #endif
917*53ee8cc1Swenshuai.xi 
918*53ee8cc1Swenshuai.xi 	if (mfe_reg->reg_mfe_g_enc_mode==REG_ENC_MODE_MPG4) {
919*53ee8cc1Swenshuai.xi 		nTarWriteCount = (pBufInfo->m_bEnableMvStore?62:59) + (nTarFDCCount*3);
920*53ee8cc1Swenshuai.xi 	}
921*53ee8cc1Swenshuai.xi 	else if (mfe_reg->reg_mfe_g_enc_mode==REG_ENC_MODE_H263) {
922*53ee8cc1Swenshuai.xi 		nTarWriteCount = 53 + (nTarFDCCount*3);
923*53ee8cc1Swenshuai.xi 	}
924*53ee8cc1Swenshuai.xi 	nTarWriteCount++;	// reg to set fdc round
925*53ee8cc1Swenshuai.xi 
926*53ee8cc1Swenshuai.xi #ifdef CLOCK_GATING
927*53ee8cc1Swenshuai.xi     nTarWriteCount++;
928*53ee8cc1Swenshuai.xi #endif
929*53ee8cc1Swenshuai.xi 
930*53ee8cc1Swenshuai.xi 	nTarFDCCount *= 3;
931*53ee8cc1Swenshuai.xi 	nTarFDCCount++;	// reg to set fdc round
932*53ee8cc1Swenshuai.xi 
933*53ee8cc1Swenshuai.xi 	// SW reset
934*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_soft_rstz = 0;
935*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x0, mfe_reg->reg00, (MS_S8*)("[%d] reg00"), nRegWriteCount++, (MS_S8*)("SW reset 0"));
936*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_soft_rstz = 1;
937*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x0, mfe_reg->reg00, (MS_S8*)("[%d] reg00"), nRegWriteCount++, (MS_S8*)("SW reset 1"));
938*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x1, mfe_reg->reg01, (MS_S8*)("[%d] reg01"), nRegWriteCount++, (MS_S8*)("picture width"));
939*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x2, mfe_reg->reg02, (MS_S8*)("[%d] reg02"), nRegWriteCount++, (MS_S8*)("picture height"));
940*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x3, mfe_reg->reg03, (MS_S8*)("[%d] reg03"), nRegWriteCount++, (MS_S8*)("value"));
941*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x4, mfe_reg->reg04, (MS_S8*)("[%d] reg04"), nRegWriteCount++, (MS_S8*)("er_bs mode threshold"));
942*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x5, mfe_reg->reg05, (MS_S8*)("[%d] reg05"), nRegWriteCount++, (MS_S8*)("inter prediction preference"));
943*53ee8cc1Swenshuai.xi 
944*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x20, mfe_reg->reg20, (MS_S8*)("[%d] reg20"), nRegWriteCount++, (MS_S8*)("ME partition setting"));
945*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x21, mfe_reg->reg21, (MS_S8*)("[%d] reg21"), nRegWriteCount++, (MS_S8*)("value"));
946*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x22, mfe_reg->reg22, (MS_S8*)("[%d] reg22"), nRegWriteCount++, (MS_S8*)("me search range max depth"));
947*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x23, mfe_reg->reg23, (MS_S8*)("[%d] reg23"), nRegWriteCount++, (MS_S8*)("me mvx"));
948*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x24, mfe_reg->reg24, (MS_S8*)("[%d] reg24"), nRegWriteCount++, (MS_S8*)("me mvy"));
949*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x25, mfe_reg->reg25, (MS_S8*)("[%d] reg25"), nRegWriteCount++, (MS_S8*)("FME"));
950*53ee8cc1Swenshuai.xi 
951*53ee8cc1Swenshuai.xi #ifdef CLOCK_GATING
952*53ee8cc1Swenshuai.xi     WriteRegMFE(0x16, mfe_reg->reg16, (MS_S8*)("[%d] reg16"), nRegWriteCount++, (MS_S8*)("Clock gating"));
953*53ee8cc1Swenshuai.xi #endif
954*53ee8cc1Swenshuai.xi 
955*53ee8cc1Swenshuai.xi 	// Input buffers
956*53ee8cc1Swenshuai.xi 	//
957*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x06, mfe_reg->reg06, (MS_S8*)("[%d] reg06"), nRegWriteCount++, (MS_S8*)("current luma base address"));
958*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x07, mfe_reg->reg07, (MS_S8*)("[%d] reg07"), nRegWriteCount++, (MS_S8*)("current luma base address high"));
959*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x08, mfe_reg->reg08, (MS_S8*)("[%d] reg08"), nRegWriteCount++, (MS_S8*)("current chroma base address"));
960*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x09, mfe_reg->reg09, (MS_S8*)("[%d] reg09"), nRegWriteCount++, (MS_S8*)("current chroma base address high"));
961*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x0a, mfe_reg->reg0a, (MS_S8*)("[%d] reg0a"), nRegWriteCount++, (MS_S8*)("reference luma base address0"));
962*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x0b, mfe_reg->reg0b, (MS_S8*)("[%d] reg0b"), nRegWriteCount++, (MS_S8*)("reference luma base address0 high"));
963*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x0c, mfe_reg->reg0c, (MS_S8*)("[%d] reg0c"), nRegWriteCount++, (MS_S8*)("reference luma base address1"));
964*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x0d, mfe_reg->reg0d, (MS_S8*)("[%d] reg0d"), nRegWriteCount++, (MS_S8*)("reference luma base address1 high"));
965*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x0e, mfe_reg->reg0e, (MS_S8*)("[%d] reg0e"), nRegWriteCount++, (MS_S8*)("reference chroma base address0"));
966*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x0f, mfe_reg->reg0f, (MS_S8*)("[%d] reg0f"), nRegWriteCount++, (MS_S8*)("reference chroma base address0 high"));
967*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x10, mfe_reg->reg10, (MS_S8*)("[%d] reg10"), nRegWriteCount++, (MS_S8*)("reference chroma base address1"));
968*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x11, mfe_reg->reg11, (MS_S8*)("[%d] reg11"), nRegWriteCount++, (MS_S8*)("reference chroma base address1 high"));
969*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x12, mfe_reg->reg12, (MS_S8*)("[%d] reg12"), nRegWriteCount++, (MS_S8*)("reconstructed luma base address:"));
970*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x13, mfe_reg->reg13, (MS_S8*)("[%d] reg13"), nRegWriteCount++, (MS_S8*)("reconstructed luma base address high"));
971*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x14, mfe_reg->reg14, (MS_S8*)("[%d] reg14"), nRegWriteCount++, (MS_S8*)("reconstructed chroma base address:"));
972*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x15, mfe_reg->reg15, (MS_S8*)("[%d] reg15"), nRegWriteCount++, (MS_S8*)("reconstructed chroma base address: high"));
973*53ee8cc1Swenshuai.xi 
974*53ee8cc1Swenshuai.xi #if defined(_MFE_T8_)&&!defined(_MFE_AGATE_)
975*53ee8cc1Swenshuai.xi 	// Output buffer
976*53ee8cc1Swenshuai.xi     WriteRegMFE(0x3c, mfe_reg->reg3c, (MS_S8*)("[%d] reg3c"), nRegWriteCount++, (MS_S8*)("bsp obuf start address: "));
977*53ee8cc1Swenshuai.xi     WriteRegMFE(0x3d, mfe_reg->reg3d, (MS_S8*)("[%d] reg3d"), nRegWriteCount++, (MS_S8*)("bsp obuf start address high"));
978*53ee8cc1Swenshuai.xi     WriteRegMFE(0x3e, mfe_reg->reg3e, (MS_S8*)("[%d] reg3e"), nRegWriteCount++, (MS_S8*)("bsp obuf end address: "));
979*53ee8cc1Swenshuai.xi     WriteRegMFE(0x3f, mfe_reg->reg3f, (MS_S8*)("[%d] reg3f"), nRegWriteCount++, (MS_S8*)("bsp obuf end address high"));
980*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_s_bspobuf_set_adr = 1;
981*53ee8cc1Swenshuai.xi #endif
982*53ee8cc1Swenshuai.xi 	//
983*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_s_bspobuf_fifo_th = 1;
984*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_s_mvobuf_set_adr = 0;
985*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_s_mvobuf_fifo_th = 0;
986*53ee8cc1Swenshuai.xi 
987*53ee8cc1Swenshuai.xi #if defined(_MFE_T8_)&&!defined(_MFE_AGATE_)
988*53ee8cc1Swenshuai.xi     WriteRegMFE(0x3b, mfe_reg->reg3b, (MS_S8*)("[%d] reg3b"), nRegWriteCount++, (MS_S8*)("set bsp obuf"));
989*53ee8cc1Swenshuai.xi        mfe_reg->reg_mfe_s_bspobuf_set_adr = 0;    // HW is write-one-clear
990*53ee8cc1Swenshuai.xi #elif defined(_MFE_M1_)||defined(_MFE_AGATE_)
991*53ee8cc1Swenshuai.xi     // Enable set-obuf
992*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_s_bspobuf_update_adr = 1;
993*53ee8cc1Swenshuai.xi     WriteRegMFE(0x3f, mfe_reg->reg3f, (MS_S8*)("[%d] reg3f"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_bspobuf_update_adr"));
994*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_s_bspobuf_update_adr = 0;  // write-one-clear
995*53ee8cc1Swenshuai.xi #if defined(WIN32)
996*53ee8cc1Swenshuai.xi     mfe_reg->enable_obufadr_update = 0;
997*53ee8cc1Swenshuai.xi     UDMA_RIURead16(REG_BANK_MFE+0x6a, (MS_U16*)&mfe_reg->reg6a);
998*53ee8cc1Swenshuai.xi     while (mfe_reg->enable_obufadr_update!=1) {
999*53ee8cc1Swenshuai.xi         UDMA_RIURead16(REG_BANK_MFE+0x6a, (MS_U16*)&mfe_reg->reg6a);
1000*53ee8cc1Swenshuai.xi         printf("Wait for enable_obufadr_update=1!\n"));
1001*53ee8cc1Swenshuai.xi     }
1002*53ee8cc1Swenshuai.xi #endif
1003*53ee8cc1Swenshuai.xi #if defined(USE_HW_DBL_OBUF)
1004*53ee8cc1Swenshuai.xi     nRegWriteCount += SetObufAddr(mfe_reg, (MS_U32)pBufInfo->m_nOutBufAddr, pBufInfo->m_OutBufferSize, 0, 0);
1005*53ee8cc1Swenshuai.xi     nRegWriteCount += SetObufAddr(mfe_reg, (MS_U32)pBufInfo->m_nOutBufAddr+pBufInfo->m_OutBufferSize, pBufInfo->m_OutBufferSize, 1, 1);
1006*53ee8cc1Swenshuai.xi #else
1007*53ee8cc1Swenshuai.xi     nRegWriteCount += SetObufAddr(mfe_reg, (MS_U32)pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress, pBufInfo->m_OutBufferSize, 0, 1);
1008*53ee8cc1Swenshuai.xi #endif
1009*53ee8cc1Swenshuai.xi #endif
1010*53ee8cc1Swenshuai.xi 
1011*53ee8cc1Swenshuai.xi 	// MV-store
1012*53ee8cc1Swenshuai.xi 	if (mfe_reg->reg_mfe_g_enc_mode==REG_ENC_MODE_MPG4) {
1013*53ee8cc1Swenshuai.xi 		WriteRegMFE(0x19, mfe_reg->reg19, (MS_S8*)("[%d] reg19"), nRegWriteCount++, (MS_S8*)("enable mv-store"));
1014*53ee8cc1Swenshuai.xi 		if (mfe_reg->reg_mfe_g_mp4_direct_mvstore) {
1015*53ee8cc1Swenshuai.xi 			WriteRegMFE(0x40, mfe_reg->reg40, (MS_S8*)("[%d] reg40"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_mvobuf_sadr_low"));
1016*53ee8cc1Swenshuai.xi 			WriteRegMFE(0x41, mfe_reg->reg41, (MS_S8*)("[%d] reg41"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_mvobuf_sadr_high"));
1017*53ee8cc1Swenshuai.xi 			//
1018*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_bspobuf_set_adr = 0;
1019*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_bspobuf_fifo_th = 0;
1020*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_mvobuf_set_adr = 1;
1021*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_mvobuf_fifo_th = 1;
1022*53ee8cc1Swenshuai.xi 			WriteRegMFE(0x3b, mfe_reg->reg3b, (MS_S8*)("[%d] reg3b"), nRegWriteCount++, (MS_S8*)("set mv-sotre addr"));
1023*53ee8cc1Swenshuai.xi 			mfe_reg->reg_mfe_s_mvobuf_set_adr = 0;	// HW is write-one-clear
1024*53ee8cc1Swenshuai.xi 		}
1025*53ee8cc1Swenshuai.xi 		// mvibuf
1026*53ee8cc1Swenshuai.xi 		WriteRegMFE(0x4e, mfe_reg->reg4e, (MS_S8*)("[%d] reg4e"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_gn_mvibuf_sadr_low"));
1027*53ee8cc1Swenshuai.xi 		WriteRegMFE(0x4f, mfe_reg->reg4f, (MS_S8*)("[%d] reg4f"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_gn_mvibuf_sadr_high"));
1028*53ee8cc1Swenshuai.xi 	}
1029*53ee8cc1Swenshuai.xi 
1030*53ee8cc1Swenshuai.xi 
1031*53ee8cc1Swenshuai.xi 	// GN
1032*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x4c, mfe_reg->reg4c, (MS_S8*)("[%d] reg1c"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_gn_sadr_low"));
1033*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x4d, mfe_reg->reg4d, (MS_S8*)("[%d] reg4d"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_gn_sadr_high"));
1034*53ee8cc1Swenshuai.xi 
1035*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x19, mfe_reg->reg19, (MS_S8*)("[%d] reg19"), nRegWriteCount++, (MS_S8*)("value"));
1036*53ee8cc1Swenshuai.xi 	// MBR
1037*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x26, mfe_reg->reg26, (MS_S8*)("[%d] reg26"), nRegWriteCount++, (MS_S8*)("MBR: mbbits"));
1038*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x27, mfe_reg->reg27, (MS_S8*)("[%d] reg27"), nRegWriteCount++, (MS_S8*)("MBR: frame qstep"));
1039*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x29, mfe_reg->reg29, (MS_S8*)("[%d] reg29"), nRegWriteCount++, (MS_S8*)("264 qp-offset"));
1040*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x2a, mfe_reg->reg2a, (MS_S8*)("[%d] reg2a"), nRegWriteCount++, (MS_S8*)("QP min/max"));
1041*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x6e, mfe_reg->reg6e, (MS_S8*)("[%d] reg6e"), nRegWriteCount++, (MS_S8*)("QStep min"));
1042*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x6f, mfe_reg->reg6f, (MS_S8*)("[%d] reg6f"), nRegWriteCount++, (MS_S8*)("QStep max"));
1043*53ee8cc1Swenshuai.xi 
1044*53ee8cc1Swenshuai.xi 	// MDC
1045*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x39, mfe_reg->reg39, (MS_S8*)("[%d] reg39"), nRegWriteCount++, (MS_S8*)("value"));
1046*53ee8cc1Swenshuai.xi 
1047*53ee8cc1Swenshuai.xi 	// Intra Update
1048*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x2f, mfe_reg->reg2f, (MS_S8*)("[%d] reg2f"), nRegWriteCount++, (MS_S8*)("value"));
1049*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x30, mfe_reg->reg30, (MS_S8*)("[%d] reg30"), nRegWriteCount++, (MS_S8*)("value"));
1050*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x31, mfe_reg->reg31, (MS_S8*)("[%d] reg31"), nRegWriteCount++, (MS_S8*)("value"));
1051*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x32, mfe_reg->reg32, (MS_S8*)("[%d] reg32"), nRegWriteCount++, (MS_S8*)("value"));
1052*53ee8cc1Swenshuai.xi 
1053*53ee8cc1Swenshuai.xi 	if (mfe_reg->reg_mfe_g_enc_mode==REG_ENC_MODE_MPG4) {	// MPEG-4
1054*53ee8cc1Swenshuai.xi 		WriteRegMFE(0x37, mfe_reg->reg37, (MS_S8*)("[%d] reg37"), nRegWriteCount++, (MS_S8*)("MPEG4 MDC"));
1055*53ee8cc1Swenshuai.xi 		WriteRegMFE(0x38, mfe_reg->reg38, (MS_S8*)("[%d] reg38"), nRegWriteCount++, (MS_S8*)("MPEG4: vop_time_increment"));
1056*53ee8cc1Swenshuai.xi 		// B-direct
1057*53ee8cc1Swenshuai.xi 		WriteRegMFE(0x1a, mfe_reg->reg1a, (MS_S8*)("[%d] reg1a"), nRegWriteCount++, (MS_S8*)("MPEG4 BDirect"));
1058*53ee8cc1Swenshuai.xi 	}
1059*53ee8cc1Swenshuai.xi 
1060*53ee8cc1Swenshuai.xi 
1061*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_g_crc_mode = 0xC;
1062*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_g_debug_tcycle_chk_en = 0x1;
1063*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_g_debug_tcycle_chk_sel = 0x0;
1064*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_debug_en = 0; // TEST
1065*53ee8cc1Swenshuai.xi     WriteRegMFE(0x73, mfe_reg->reg73, (MS_S8*)("[%d] reg73"), nRegWriteCount++, (MS_S8*)("crc mode"));
1066*53ee8cc1Swenshuai.xi 
1067*53ee8cc1Swenshuai.xi 
1068*53ee8cc1Swenshuai.xi 
1069*53ee8cc1Swenshuai.xi    	WriteRegMFE(0x2c, mfe_reg->reg2c, (MS_S8*)("[%d] reg2c"), nRegWriteCount++, (MS_S8*)("Last zigzag"));
1070*53ee8cc1Swenshuai.xi 
1071*53ee8cc1Swenshuai.xi 	// Cross-format wrong reg setting prevention
1072*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x18, mfe_reg->reg18, (MS_S8*)("[%d] reg18"), nRegWriteCount++, (MS_S8*)("JPE encode mode"));
1073*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x1b, mfe_reg->reg1b, (MS_S8*)("[%d] reg1b"), nRegWriteCount++, (MS_S8*)("MPEG4 FieldDCT"));
1074*53ee8cc1Swenshuai.xi 
1075*53ee8cc1Swenshuai.xi #ifdef _MFE_M1_
1076*53ee8cc1Swenshuai.xi     // Prefetch & Low bandwidth mode
1077*53ee8cc1Swenshuai.xi     WriteRegMFE(0x68,mfe_reg->reg68,"[%d] reg68"), nRegWriteCount++, (MS_S8*)("Prefetch enable/disable"));
1078*53ee8cc1Swenshuai.xi     // Prefetch
1079*53ee8cc1Swenshuai.xi     WriteRegMFE(0x6d,mfe_reg->reg6d,"[%d] reg6d"), nRegWriteCount++, (MS_S8*)("Prefetch MB idle count"));
1080*53ee8cc1Swenshuai.xi 	//Low bandwidth
1081*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x6b, mfe_reg->reg6b, (MS_S8*)("[%d] reg6b"), nRegWriteCount++, (MS_S8*)("Low Bandwidth: IMI addr low"));
1082*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x6c, mfe_reg->reg6c, (MS_S8*)("[%d] reg6c"), nRegWriteCount++, (MS_S8*)("Low Bandwidth: IMI addr high"));
1083*53ee8cc1Swenshuai.xi 
1084*53ee8cc1Swenshuai.xi 	// Reset any StopAndGo or StopAndDrop setting.
1085*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_s_txip_sng_mb = 0;
1086*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x2d, mfe_reg->reg2d, (MS_S8*)("[%d] reg2d"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_txip_sng_mb=0"));
1087*53ee8cc1Swenshuai.xi 
1088*53ee8cc1Swenshuai.xi #endif
1089*53ee8cc1Swenshuai.xi 
1090*53ee8cc1Swenshuai.xi     //enable eco item
1091*53ee8cc1Swenshuai.xi     WriteRegMFE(0x7d, mfe_reg->reg7d, (MS_S8*)("[%d] reg7d"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_txip_eco0=1"));
1092*53ee8cc1Swenshuai.xi 
1093*53ee8cc1Swenshuai.xi 	ms_dprintk(DRV_L3, "In mfe_reg_m4ve.c Before En HW..\n");
1094*53ee8cc1Swenshuai.xi //	DumpAllReg(mfe_reg);
1095*53ee8cc1Swenshuai.xi 
1096*53ee8cc1Swenshuai.xi 	// Enable HW
1097*53ee8cc1Swenshuai.xi 	mfe_reg->reg_mfe_g_frame_start_sw = 1;
1098*53ee8cc1Swenshuai.xi 
1099*53ee8cc1Swenshuai.xi 	WriteRegMFE(0x00, mfe_reg->reg00, (MS_S8*)("[%d] reg00"), nRegWriteCount++, (MS_S8*)("frame start"));
1100*53ee8cc1Swenshuai.xi     mfe_reg->reg_mfe_g_frame_start_sw = 0;	// HW is write-one-clear
1101*53ee8cc1Swenshuai.xi 
1102*53ee8cc1Swenshuai.xi 	ms_dprintk(DRV_L3,"After RESET\n");
1103*53ee8cc1Swenshuai.xi 	// FDC
1104*53ee8cc1Swenshuai.xi 	nRegFDCCount = PutFDC(mfe_reg, pBitsInfo, 0);
1105*53ee8cc1Swenshuai.xi 	nRegWriteCount += nRegFDCCount;
1106*53ee8cc1Swenshuai.xi 
1107*53ee8cc1Swenshuai.xi     if(nRegFDCCount != nTarFDCCount) {
1108*53ee8cc1Swenshuai.xi         ms_dprintk(DRV_L3, "nRegFDCCount = %d, nTarFDCCount = %d\n", (int)nRegFDCCount, (int)nTarFDCCount);
1109*53ee8cc1Swenshuai.xi     }
1110*53ee8cc1Swenshuai.xi     if(nRegWriteCount != nTarWriteCount) {
1111*53ee8cc1Swenshuai.xi         ms_dprintk(DRV_L3, "nRegWriteCount = %d, nTarWriteCount = %d\n", (int)nRegWriteCount, (int)nTarWriteCount);
1112*53ee8cc1Swenshuai.xi     }
1113*53ee8cc1Swenshuai.xi 	// Only for debug
1114*53ee8cc1Swenshuai.xi //	MS_ASSERT(nRegFDCCount==nTarFDCCount);
1115*53ee8cc1Swenshuai.xi //	MS_ASSERT(nRegWriteCount==nTarWriteCount);
1116*53ee8cc1Swenshuai.xi 
1117*53ee8cc1Swenshuai.xi }
1118*53ee8cc1Swenshuai.xi 
codeM4vConfigHeaders(MFE_CONFIG * pConfig,MS_BOOL IsSkipHeader)1119*53ee8cc1Swenshuai.xi MS_S32 codeM4vConfigHeaders(MFE_CONFIG *pConfig,MS_BOOL IsSkipHeader)
1120*53ee8cc1Swenshuai.xi {
1121*53ee8cc1Swenshuai.xi 	OutStream* pStream = &pConfig->m_OutStream;
1122*53ee8cc1Swenshuai.xi //	BitsInfo* pBitsInfo = &pConfig->ctxBitsInfo;
1123*53ee8cc1Swenshuai.xi 
1124*53ee8cc1Swenshuai.xi     if(IsSkipHeader) {
1125*53ee8cc1Swenshuai.xi 	osReset(pStream);
1126*53ee8cc1Swenshuai.xi 	codeNonCodedVOPShortHead(pConfig, pStream);
1127*53ee8cc1Swenshuai.xi 	osFlushAll(&pConfig->m_OutStream);
1128*53ee8cc1Swenshuai.xi     } else {
1129*53ee8cc1Swenshuai.xi 	osReset(pStream);
1130*53ee8cc1Swenshuai.xi 	codeSequenceHead(pConfig, pStream);
1131*53ee8cc1Swenshuai.xi 	codeVOHead(pConfig, pStream);
1132*53ee8cc1Swenshuai.xi 	codeVOLHead(pConfig, pStream);
1133*53ee8cc1Swenshuai.xi 	// Finalize
1134*53ee8cc1Swenshuai.xi 	osFlushAll(&pConfig->m_OutStream);
1135*53ee8cc1Swenshuai.xi     }
1136*53ee8cc1Swenshuai.xi 	// The generated bytes start from pStream->m_pbFrameBuffer and with pStream->m_nByteCount bytes.
1137*53ee8cc1Swenshuai.xi 	return pStream->m_nByteCount;
1138*53ee8cc1Swenshuai.xi }
1139*53ee8cc1Swenshuai.xi 
1140*53ee8cc1Swenshuai.xi 
1141*53ee8cc1Swenshuai.xi 
1142