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