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 "parset.h"
92*53ee8cc1Swenshuai.xi #include "msRateCtrl.h"
93*53ee8cc1Swenshuai.xi #include "BufMng.h"
94*53ee8cc1Swenshuai.xi
95*53ee8cc1Swenshuai.xi #include "mfe_reg.h"
96*53ee8cc1Swenshuai.xi // Sync with cModel QExp.h
97*53ee8cc1Swenshuai.xi #define CLOCK_GATING // Enable clock gating
98*53ee8cc1Swenshuai.xi #define FME_PIPELINE_OPEN // Enable David's FME speedup version
99*53ee8cc1Swenshuai.xi #define CHECK_P8x8_BOUND_RECT
100*53ee8cc1Swenshuai.xi
101*53ee8cc1Swenshuai.xi // Memory bound addr units is 8-byte.
102*53ee8cc1Swenshuai.xi #define EIGHT_BYTE_ADDR(addr) ((addr) >> 3)
103*53ee8cc1Swenshuai.xi #define LO_WORD(val) ((val) & 0xFFFF)
104*53ee8cc1Swenshuai.xi #define HI_WORD(val) (((val) >> 16) & 0xFFFF)
105*53ee8cc1Swenshuai.xi #define MEM_BOUND_LO(addr) (LO_WORD(EIGHT_BYTE_ADDR(addr)))
106*53ee8cc1Swenshuai.xi #define MEM_BOUND_HI(addr) (HI_WORD(EIGHT_BYTE_ADDR(addr)))
107*53ee8cc1Swenshuai.xi
108*53ee8cc1Swenshuai.xi #if defined(_MFE_T8_)
109*53ee8cc1Swenshuai.xi #define MAX_REF_FRAME 2UL
110*53ee8cc1Swenshuai.xi #define SEARCH_RANGE_X 32UL
111*53ee8cc1Swenshuai.xi #define BLOCK_TYPE_4x4 1UL
112*53ee8cc1Swenshuai.xi #define BLOCK_TYPE_4x8 1UL
113*53ee8cc1Swenshuai.xi #define BLOCK_TYPE_8x4 1UL
114*53ee8cc1Swenshuai.xi #elif defined(_MFE_M1_)
115*53ee8cc1Swenshuai.xi #define MAX_REF_FRAME 1UL
116*53ee8cc1Swenshuai.xi #define SEARCH_RANGE_X 16UL
117*53ee8cc1Swenshuai.xi #define BLOCK_TYPE_4x4 0UL
118*53ee8cc1Swenshuai.xi #define BLOCK_TYPE_4x8 0UL
119*53ee8cc1Swenshuai.xi #define BLOCK_TYPE_8x4 0UL
120*53ee8cc1Swenshuai.xi #endif
121*53ee8cc1Swenshuai.xi
122*53ee8cc1Swenshuai.xi #if (DEBUG_LEVEL & DRV_L6)
123*53ee8cc1Swenshuai.xi #include "api_mfe_performance.h"
124*53ee8cc1Swenshuai.xi extern mfe_performance_t mfe_enc;
125*53ee8cc1Swenshuai.xi extern mfe_performance_t mfe_hw_enc;
126*53ee8cc1Swenshuai.xi extern mfe_performance_t mfe_duration_enc;
127*53ee8cc1Swenshuai.xi #endif
128*53ee8cc1Swenshuai.xi
129*53ee8cc1Swenshuai.xi #ifdef MFE_MIU_PROTECT
130*53ee8cc1Swenshuai.xi extern void MHal_MFE_Enable_MIU_Protection(MS_S32 MIU_TEST_MODE,MFE_CONFIG* pConfig);
131*53ee8cc1Swenshuai.xi #endif
132*53ee8cc1Swenshuai.xi void OutputSwCfg1_H264(MS_S32 nFrmNum, MFE_CONFIG* pConfig);
133*53ee8cc1Swenshuai.xi
mfeH264_DeInit(MFE_CONFIG * pConfig)134*53ee8cc1Swenshuai.xi void mfeH264_DeInit(MFE_CONFIG* pConfig)
135*53ee8cc1Swenshuai.xi {
136*53ee8cc1Swenshuai.xi MS_S32 i;
137*53ee8cc1Swenshuai.xi H264INFO* pInfo = &pConfig->ctxH264Info;
138*53ee8cc1Swenshuai.xi FreeSPSPPSBuf(pConfig);
139*53ee8cc1Swenshuai.xi if(pInfo->dpb)
140*53ee8cc1Swenshuai.xi MfeDrvMemFree((void**)&pInfo->dpb, (const MS_S8*)("pInfo->dpb"));
141*53ee8cc1Swenshuai.xi
142*53ee8cc1Swenshuai.xi
143*53ee8cc1Swenshuai.xi for(i=0;i<pInfo->BufPool.FrameBufPoolSize;i++) {
144*53ee8cc1Swenshuai.xi if(pInfo->BufPool.addr[i])
145*53ee8cc1Swenshuai.xi MfeDrvMemFree((void**)&(pInfo->BufPool.addr[i]), (const MS_S8*)("BufPool.addr[i]"));
146*53ee8cc1Swenshuai.xi }
147*53ee8cc1Swenshuai.xi if(pInfo->BufPool.addr)
148*53ee8cc1Swenshuai.xi MfeDrvMemFree((void**)&pInfo->BufPool.addr, (const MS_S8*)("BufPool.addr"));
149*53ee8cc1Swenshuai.xi if(pInfo->BufPool.available)
150*53ee8cc1Swenshuai.xi MfeDrvMemFree((void**)&pInfo->BufPool.available, (const MS_S8*)("BufPool.available"));
151*53ee8cc1Swenshuai.xi IntraUpdateClose(pConfig);
152*53ee8cc1Swenshuai.xi
153*53ee8cc1Swenshuai.xi }
mfeH264_Init(MFE_CONFIG * pConfig)154*53ee8cc1Swenshuai.xi void mfeH264_Init(MFE_CONFIG *pConfig)
155*53ee8cc1Swenshuai.xi {
156*53ee8cc1Swenshuai.xi MS_S32 i;
157*53ee8cc1Swenshuai.xi H264INFO* pInfo = &pConfig->ctxH264Info;
158*53ee8cc1Swenshuai.xi MS_S32 FrameSizeInMbs = (pConfig->nBufWidth>>4) * (pConfig->nBufHeight>>4);
159*53ee8cc1Swenshuai.xi
160*53ee8cc1Swenshuai.xi memset(pInfo, 0, sizeof(H264INFO));
161*53ee8cc1Swenshuai.xi
162*53ee8cc1Swenshuai.xi if(pConfig->UseCABAC) {
163*53ee8cc1Swenshuai.xi pInfo->ProfileIDC = 77; // Baseline
164*53ee8cc1Swenshuai.xi pInfo->LevelIDC = 40; // Up to 720x576x25 or 720x480x30
165*53ee8cc1Swenshuai.xi } else {
166*53ee8cc1Swenshuai.xi pInfo->ProfileIDC = 66; // Baseline
167*53ee8cc1Swenshuai.xi pInfo->LevelIDC = 30; // Up to 720x576x25 or 720x480x30
168*53ee8cc1Swenshuai.xi if(pConfig->nDispHeight> 576)
169*53ee8cc1Swenshuai.xi pInfo->LevelIDC = 31;
170*53ee8cc1Swenshuai.xi }
171*53ee8cc1Swenshuai.xi pInfo->PicInterlace = (pConfig->bInterlace == PROGRESSIVE)? FRAME_CODING : FIELD_CODING;
172*53ee8cc1Swenshuai.xi if (pInfo->PicInterlace==FIELD_CODING) {
173*53ee8cc1Swenshuai.xi pInfo->ProfileIDC = 77; // Forced to be main profile
174*53ee8cc1Swenshuai.xi MS_ASSERT((pConfig->nBufHeight&0x1F)==0);
175*53ee8cc1Swenshuai.xi }
176*53ee8cc1Swenshuai.xi
177*53ee8cc1Swenshuai.xi if (pConfig->setLevel != 0) {
178*53ee8cc1Swenshuai.xi pInfo->LevelIDC = pConfig->setLevel;
179*53ee8cc1Swenshuai.xi }
180*53ee8cc1Swenshuai.xi
181*53ee8cc1Swenshuai.xi if (pConfig->enableReduceBW) {
182*53ee8cc1Swenshuai.xi pInfo->nMaxP8x8Count = FrameSizeInMbs / 2;
183*53ee8cc1Swenshuai.xi } else {
184*53ee8cc1Swenshuai.xi pInfo->nMaxP8x8Count = FrameSizeInMbs;
185*53ee8cc1Swenshuai.xi }
186*53ee8cc1Swenshuai.xi pInfo->log2_max_frame_num_minus4 = 1;
187*53ee8cc1Swenshuai.xi
188*53ee8cc1Swenshuai.xi // ME
189*53ee8cc1Swenshuai.xi pInfo->num_ref_frames = MAX_REF_FRAME; // sequence-level
190*53ee8cc1Swenshuai.xi
191*53ee8cc1Swenshuai.xi if (pInfo->PicInterlace==FIELD_CODING)
192*53ee8cc1Swenshuai.xi pInfo->num_ref_frames = MAX_REF_FRAME -1; // means: 2 field pictures
193*53ee8cc1Swenshuai.xi else
194*53ee8cc1Swenshuai.xi pInfo->num_ref_frames = MAX_REF_FRAME; // means: 2 frame
195*53ee8cc1Swenshuai.xi
196*53ee8cc1Swenshuai.xi if((pConfig->nBufHeight*pConfig->nBufWidth) >= (1280*720))
197*53ee8cc1Swenshuai.xi pInfo->num_ref_frames = 1;
198*53ee8cc1Swenshuai.xi #ifdef MFE_MIU_PROFILE
199*53ee8cc1Swenshuai.xi pInfo->num_ref_frames = 1;
200*53ee8cc1Swenshuai.xi #endif
201*53ee8cc1Swenshuai.xi pInfo->iSearchRangeForward = SEARCH_RANGE_X;
202*53ee8cc1Swenshuai.xi pInfo->SEARCH_RANGE_Y = 16;
203*53ee8cc1Swenshuai.xi pInfo->IME_ADAPTIVE_WINDOW = 1;
204*53ee8cc1Swenshuai.xi pInfo->fme_precision = 2; // 0--fullpel, 1--halfpel, 2--quarterpel
205*53ee8cc1Swenshuai.xi pInfo->nMaxFmeMode = (FrameSizeInMbs>396) ? 1 : 2;
206*53ee8cc1Swenshuai.xi pInfo->no_umv = 0;
207*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][0] = 1; // PSKIP
208*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][BLOCK16x16] = 1;
209*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][BLOCK16x8] = 1;
210*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][BLOCK8x16] = 1;
211*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][BLOCK8x8] = 1;
212*53ee8cc1Swenshuai.xi if (pConfig->enableReduceBW) {
213*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][BLOCK8x4] = 0;
214*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][BLOCK4x8] = 0;
215*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][BLOCK4x4] = 0;
216*53ee8cc1Swenshuai.xi } else {
217*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][BLOCK8x4] = BLOCK_TYPE_8x4;
218*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][BLOCK4x8] = BLOCK_TYPE_4x8;
219*53ee8cc1Swenshuai.xi pInfo->InterSearch[0][BLOCK4x4] = BLOCK_TYPE_4x4;
220*53ee8cc1Swenshuai.xi }
221*53ee8cc1Swenshuai.xi for (i=0; i<=BLOCK4x4; i++)
222*53ee8cc1Swenshuai.xi pInfo->InterSearch[1][i] = 0;
223*53ee8cc1Swenshuai.xi
224*53ee8cc1Swenshuai.xi if (pInfo->PicInterlace==FIELD_CODING)
225*53ee8cc1Swenshuai.xi pInfo->num_ref_idx_l0_active_minus1 = 2*pInfo->num_ref_frames-1; // PPS info
226*53ee8cc1Swenshuai.xi else
227*53ee8cc1Swenshuai.xi pInfo->num_ref_idx_l0_active_minus1 = pInfo->num_ref_frames-1; // PPS info
228*53ee8cc1Swenshuai.xi
229*53ee8cc1Swenshuai.xi // DBF
230*53ee8cc1Swenshuai.xi pInfo->bDeblockCtrlPresent = 0;
231*53ee8cc1Swenshuai.xi pInfo->nDeblockIDC = 2; // 0--all edges; 1--no edges; 2--edges inside slice boundary
232*53ee8cc1Swenshuai.xi // NOTE: MFE does not support er_en enabled with DeblockIDC=0
233*53ee8cc1Swenshuai.xi pInfo->nDeblockAlpha = 0;
234*53ee8cc1Swenshuai.xi pInfo->nDeblockBeta = 0;
235*53ee8cc1Swenshuai.xi
236*53ee8cc1Swenshuai.xi // Frame type
237*53ee8cc1Swenshuai.xi pInfo->pic_order_cnt_type = 2; // HW only support 2
238*53ee8cc1Swenshuai.xi pInfo->structure = FRAME; // If H264 PAFF, override for each input field in MDrv_MFE_GetDispOrder()
239*53ee8cc1Swenshuai.xi pInfo->idr_flag = 1;
240*53ee8cc1Swenshuai.xi pInfo->nal_ref_idc = 1;
241*53ee8cc1Swenshuai.xi pInfo->frame_num = 0;
242*53ee8cc1Swenshuai.xi pInfo->number = 0;
243*53ee8cc1Swenshuai.xi pInfo->num_ref_idx_l0_active = 0;
244*53ee8cc1Swenshuai.xi pInfo->RefCount = 0; // frame-level 0: 1ref, 1: 2ref
245*53ee8cc1Swenshuai.xi pInfo->h264_mcc_offset[0] = pInfo->h264_mcc_offset[1] = 0;
246*53ee8cc1Swenshuai.xi pInfo->intQP = 0;
247*53ee8cc1Swenshuai.xi
248*53ee8cc1Swenshuai.xi // Slice header
249*53ee8cc1Swenshuai.xi if ((pInfo->PicInterlace==FRAME_CODING) /*&& (pInfo->MbInterlace==FRAME_CODING)*/)
250*53ee8cc1Swenshuai.xi {
251*53ee8cc1Swenshuai.xi pInfo->pic_order_present_flag = 0;
252*53ee8cc1Swenshuai.xi pInfo->delta_pic_order_cnt_bottom = 0;
253*53ee8cc1Swenshuai.xi }
254*53ee8cc1Swenshuai.xi else
255*53ee8cc1Swenshuai.xi {
256*53ee8cc1Swenshuai.xi pInfo->pic_order_present_flag = 1;
257*53ee8cc1Swenshuai.xi pInfo->delta_pic_order_cnt_bottom = 1;
258*53ee8cc1Swenshuai.xi }
259*53ee8cc1Swenshuai.xi
260*53ee8cc1Swenshuai.xi // IEAP
261*53ee8cc1Swenshuai.xi pInfo->ieap_last_mode = 8;
262*53ee8cc1Swenshuai.xi pInfo->ieap_constraint_intra = 0;
263*53ee8cc1Swenshuai.xi pInfo->ieap_ccest_en = !(pInfo->PicInterlace==FIELD_CODING) ? 1 : 0;
264*53ee8cc1Swenshuai.xi pInfo->ieap_ccest_thr = pInfo->ieap_ccest_en ? (4-1) : 0;
265*53ee8cc1Swenshuai.xi pInfo->ieap_drop_i16 = 0;
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi if (pConfig->enableFastMode) {
268*53ee8cc1Swenshuai.xi pInfo->ieap_last_mode = 2;
269*53ee8cc1Swenshuai.xi pInfo->ieap_drop_i16 = 1;
270*53ee8cc1Swenshuai.xi pInfo->fme_precision = 0;
271*53ee8cc1Swenshuai.xi }
272*53ee8cc1Swenshuai.xi
273*53ee8cc1Swenshuai.xi // Rate control
274*53ee8cc1Swenshuai.xi MfeDrvRateControlInit(pConfig);
275*53ee8cc1Swenshuai.xi // FDC header initialization
276*53ee8cc1Swenshuai.xi osCreate(&pConfig->m_OutStream);
277*53ee8cc1Swenshuai.xi
278*53ee8cc1Swenshuai.xi osSetWriteBuffer(&pConfig->m_OutStream, pConfig->m_FdcBuffer);
279*53ee8cc1Swenshuai.xi
280*53ee8cc1Swenshuai.xi // Intra-update initialization
281*53ee8cc1Swenshuai.xi IntraUpdateInit(pConfig);
282*53ee8cc1Swenshuai.xi
283*53ee8cc1Swenshuai.xi // Prepare SPS, PPS
284*53ee8cc1Swenshuai.xi MallocSPSPPSBuf(pConfig);
285*53ee8cc1Swenshuai.xi GenerateSPSPPS(pConfig);
286*53ee8cc1Swenshuai.xi
287*53ee8cc1Swenshuai.xi // DPB initialization
288*53ee8cc1Swenshuai.xi if (pInfo->PicInterlace==FIELD_CODING)
289*53ee8cc1Swenshuai.xi pInfo->dpb_size = pInfo->num_ref_frames + 1;
290*53ee8cc1Swenshuai.xi else
291*53ee8cc1Swenshuai.xi pInfo->dpb_size = pInfo->num_ref_frames;
292*53ee8cc1Swenshuai.xi pInfo->dpb = MfeDrvMemMalloc(sizeof(DPB_ITEM)*pInfo->dpb_size, (const MS_S8*)("dpb"));
293*53ee8cc1Swenshuai.xi for (i=0; i<pInfo->dpb_size; i++)
294*53ee8cc1Swenshuai.xi pInfo->dpb[i].is_used = 0;
295*53ee8cc1Swenshuai.xi
296*53ee8cc1Swenshuai.xi
297*53ee8cc1Swenshuai.xi //FrameBufPool initialization
298*53ee8cc1Swenshuai.xi pInfo->BufPool.FrameBufPoolSize = pInfo->dpb_size+1;
299*53ee8cc1Swenshuai.xi pInfo->BufPool.addr = (MEMMAP_t**)MfeDrvMemMalloc(sizeof(MEMMAP_t*)*(pInfo->BufPool.FrameBufPoolSize), (const MS_S8*)("BufPool.addr"));
300*53ee8cc1Swenshuai.xi pInfo->BufPool.available = MfeDrvMemMalloc(sizeof(MS_S32)*pInfo->BufPool.FrameBufPoolSize, (const MS_S8*)("BufPool.available"));
301*53ee8cc1Swenshuai.xi
302*53ee8cc1Swenshuai.xi if (pInfo->BufPool.addr) {
303*53ee8cc1Swenshuai.xi for (i = 0; i < pInfo->BufPool.FrameBufPoolSize; i++) {
304*53ee8cc1Swenshuai.xi pInfo->BufPool.addr[i] = (MEMMAP_t*)MfeDrvMemMalloc(sizeof(MEMMAP_t) * 2, (const MS_S8*)("BufPool.addr[i]"));
305*53ee8cc1Swenshuai.xi }
306*53ee8cc1Swenshuai.xi }
307*53ee8cc1Swenshuai.xi }
308*53ee8cc1Swenshuai.xi
309*53ee8cc1Swenshuai.xi
310*53ee8cc1Swenshuai.xi #ifdef DRV_MFE_TIME_MEASURE
311*53ee8cc1Swenshuai.xi extern void MFE_MsOS_START_TIMER (void);
312*53ee8cc1Swenshuai.xi #endif
313*53ee8cc1Swenshuai.xi
mfeH264_EncodeFrame(MFE_CONFIG * pConfig,GOPINFO * pGopInfo)314*53ee8cc1Swenshuai.xi void mfeH264_EncodeFrame(MFE_CONFIG *pConfig, GOPINFO* pGopInfo)
315*53ee8cc1Swenshuai.xi {
316*53ee8cc1Swenshuai.xi H264INFO* pInfo = &pConfig->ctxH264Info;
317*53ee8cc1Swenshuai.xi BitsInfo* pBitsInfo = &pConfig->ctxBitsInfo;
318*53ee8cc1Swenshuai.xi OutStream* pStream = &pConfig->m_OutStream;
319*53ee8cc1Swenshuai.xi const MS_U8 gBITMASK[8] = { 0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe };
320*53ee8cc1Swenshuai.xi // This is done in msAPI_MFE_EnOneFrm()
321*53ee8cc1Swenshuai.xi //mfeSetVopType(pConfig, pGopInfo); // Will set pConfig->vopPredType
322*53ee8cc1Swenshuai.xi #ifdef SPS_PPS_IN_EACH_I
323*53ee8cc1Swenshuai.xi pInfo->idr_flag = pConfig->vopPredType==I_VOP ? 1 : 0;
324*53ee8cc1Swenshuai.xi //#elif defined(NO_SPS_PPS)
325*53ee8cc1Swenshuai.xi // pInfo->idr_flag = 0;
326*53ee8cc1Swenshuai.xi #else
327*53ee8cc1Swenshuai.xi /*
328*53ee8cc1Swenshuai.xi // Frame type
329*53ee8cc1Swenshuai.xi if (pGopInfo->nCodingOrder==0)
330*53ee8cc1Swenshuai.xi pInfo->idr_flag = pConfig->vopPredType==I_VOP ? 1 : 0;
331*53ee8cc1Swenshuai.xi else
332*53ee8cc1Swenshuai.xi pInfo->idr_flag = 0;
333*53ee8cc1Swenshuai.xi */
334*53ee8cc1Swenshuai.xi pInfo->idr_flag = pConfig->vopPredType==I_VOP ? 1 : 0;
335*53ee8cc1Swenshuai.xi #endif
336*53ee8cc1Swenshuai.xi pInfo->nal_ref_idc = (get_NALU_1stbyte(pInfo, pConfig->vopPredType)>>5)&0x3;
337*53ee8cc1Swenshuai.xi if (pInfo->idr_flag) {
338*53ee8cc1Swenshuai.xi //pInfo->number = 0;
339*53ee8cc1Swenshuai.xi pInfo->frame_num = 0;
340*53ee8cc1Swenshuai.xi }
341*53ee8cc1Swenshuai.xi //pInfo->frame_num, pInfo->number
342*53ee8cc1Swenshuai.xi if (pInfo->idr_flag)//(pConfig->vopPredType==I_VOP)
343*53ee8cc1Swenshuai.xi pInfo->num_ref_idx_l0_active = 0;
344*53ee8cc1Swenshuai.xi else {
345*53ee8cc1Swenshuai.xi if (pInfo->num_ref_idx_l0_active<pInfo->num_ref_idx_l0_active_minus1+1)
346*53ee8cc1Swenshuai.xi pInfo->num_ref_idx_l0_active++;
347*53ee8cc1Swenshuai.xi }
348*53ee8cc1Swenshuai.xi
349*53ee8cc1Swenshuai.xi if(pInfo->PicInterlace==FIELD_CODING){
350*53ee8cc1Swenshuai.xi if(pInfo->structure==BOTTOM_FIELD){
351*53ee8cc1Swenshuai.xi //always set bottom field to override.
352*53ee8cc1Swenshuai.xi if (pInfo->num_ref_idx_l0_active==(pInfo->num_ref_idx_l0_active_minus1+1))
353*53ee8cc1Swenshuai.xi pInfo->num_ref_idx_l0_active -= 1;
354*53ee8cc1Swenshuai.xi }
355*53ee8cc1Swenshuai.xi }
356*53ee8cc1Swenshuai.xi
357*53ee8cc1Swenshuai.xi pInfo->RefCount = pConfig->vopPredType==I_VOP ? 0 : pInfo->num_ref_idx_l0_active;
358*53ee8cc1Swenshuai.xi pInfo->h264_mcc_offset[0] = pInfo->h264_mcc_offset[1] = 0; // If PAFF, will possibly override in h264GetBufferAddr()
359*53ee8cc1Swenshuai.xi
360*53ee8cc1Swenshuai.xi if(pConfig->VTMode) {
361*53ee8cc1Swenshuai.xi MS_S8 chFrameType;
362*53ee8cc1Swenshuai.xi if(pConfig->vopPredType==I_VOP)
363*53ee8cc1Swenshuai.xi chFrameType = 'I';
364*53ee8cc1Swenshuai.xi else
365*53ee8cc1Swenshuai.xi chFrameType = 'P';
366*53ee8cc1Swenshuai.xi pInfo->intQP = rc_InitFrame(&pConfig->VTRateCtrl, chFrameType);
367*53ee8cc1Swenshuai.xi }
368*53ee8cc1Swenshuai.xi else
369*53ee8cc1Swenshuai.xi pInfo->intQP = cvbr_InitFrame(&pConfig->ctxRateControl, pConfig->vopPredType, pInfo->structure);
370*53ee8cc1Swenshuai.xi
371*53ee8cc1Swenshuai.xi // Buffer management
372*53ee8cc1Swenshuai.xi h264GetBufferAddr(pConfig);
373*53ee8cc1Swenshuai.xi
374*53ee8cc1Swenshuai.xi // Prepare header
375*53ee8cc1Swenshuai.xi osReset(pStream);
376*53ee8cc1Swenshuai.xi #if 0//ndef _MFE_M1_
377*53ee8cc1Swenshuai.xi // SPS, PPS
378*53ee8cc1Swenshuai.xi if (pGopInfo->nCodingOrder==0||pInfo->idr_flag) {
379*53ee8cc1Swenshuai.xi codeSPSPPS(pConfig,pStream);
380*53ee8cc1Swenshuai.xi }
381*53ee8cc1Swenshuai.xi #endif
382*53ee8cc1Swenshuai.xi // First slice header
383*53ee8cc1Swenshuai.xi codeSliceHeader(pConfig, pStream);
384*53ee8cc1Swenshuai.xi // Finalize
385*53ee8cc1Swenshuai.xi osFlushAll(pStream);
386*53ee8cc1Swenshuai.xi pBitsInfo->ptr = pStream->m_pbFrameBuffer;
387*53ee8cc1Swenshuai.xi pBitsInfo->len = pStream->m_nByteCount;
388*53ee8cc1Swenshuai.xi if ((pStream->BC_nCumulativeBits&7)==0) {
389*53ee8cc1Swenshuai.xi pBitsInfo->bit_len = 0;
390*53ee8cc1Swenshuai.xi pBitsInfo->bits = 0;
391*53ee8cc1Swenshuai.xi }
392*53ee8cc1Swenshuai.xi else {
393*53ee8cc1Swenshuai.xi pBitsInfo->len--;
394*53ee8cc1Swenshuai.xi pBitsInfo->bit_len = pStream->BC_nCumulativeBits&7;
395*53ee8cc1Swenshuai.xi pBitsInfo->bits = pStream->m_pbFrameBuffer[pStream->BC_nCumulativeBits>>3] & gBITMASK[pBitsInfo->bit_len];
396*53ee8cc1Swenshuai.xi }
397*53ee8cc1Swenshuai.xi
398*53ee8cc1Swenshuai.xi
399*53ee8cc1Swenshuai.xi
400*53ee8cc1Swenshuai.xi
401*53ee8cc1Swenshuai.xi //MODE 0: (Checking range > real range ) reg_mfe_s_marb_miu_bound_err = 0
402*53ee8cc1Swenshuai.xi //MODE 1: (Checking range < real range ) reg_mfe_s_marb_miu_bound_err = 1
403*53ee8cc1Swenshuai.xi //#define TEST_MIU_PROTECTION_MODE 0UL
404*53ee8cc1Swenshuai.xi #ifdef MFE_MIU_PROTECT
405*53ee8cc1Swenshuai.xi MHal_MFE_Enable_MIU_Protection(TEST_MIU_PROTECTION_MODE,pConfig);
406*53ee8cc1Swenshuai.xi #endif
407*53ee8cc1Swenshuai.xi /*
408*53ee8cc1Swenshuai.xi { // DEBUG codes
409*53ee8cc1Swenshuai.xi MS_S32 i;
410*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L3,"FDC bitcount %d ==> "), pBitsInfo->len*8+pBitsInfo->bit_len);
411*53ee8cc1Swenshuai.xi for (i=0; i<pBitsInfo->len; i++) {
412*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L3,"%02x "), pBitsInfo->ptr[i]);
413*53ee8cc1Swenshuai.xi }
414*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L3,"%02x(msb %d bits)\n"), pBitsInfo->bits, pBitsInfo->bit_len);
415*53ee8cc1Swenshuai.xi }
416*53ee8cc1Swenshuai.xi */
417*53ee8cc1Swenshuai.xi #if (DEBUG_LEVEL & DRV_L6)
418*53ee8cc1Swenshuai.xi mfe_enc.mfe_starttime = MsOS_GetSystemTime();
419*53ee8cc1Swenshuai.xi #endif
420*53ee8cc1Swenshuai.xi // Set reg and start encoding
421*53ee8cc1Swenshuai.xi // DumpAllReg(mfe_reg);
422*53ee8cc1Swenshuai.xi OutputSwCfg1_H264(pGopInfo->nCodingOrder, pConfig);
423*53ee8cc1Swenshuai.xi
424*53ee8cc1Swenshuai.xi // printf("DumpAllReg After delay OutputSwCfg1_H264\n"));
425*53ee8cc1Swenshuai.xi // DumpAllReg(mfe_reg);
426*53ee8cc1Swenshuai.xi
427*53ee8cc1Swenshuai.xi
428*53ee8cc1Swenshuai.xi }
429*53ee8cc1Swenshuai.xi
mfeH264_EncodeDummyFrame(MFE_CONFIG * pConfig,GOPINFO * pGopInfo)430*53ee8cc1Swenshuai.xi void mfeH264_EncodeDummyFrame(MFE_CONFIG *pConfig, GOPINFO* pGopInfo)
431*53ee8cc1Swenshuai.xi {
432*53ee8cc1Swenshuai.xi H264INFO* pInfo = &pConfig->ctxH264Info;
433*53ee8cc1Swenshuai.xi BitsInfo* pBitsInfo = &pConfig->ctxBitsInfo;
434*53ee8cc1Swenshuai.xi OutStream* pStream = &pConfig->m_OutStream;
435*53ee8cc1Swenshuai.xi const MS_U8 gBITMASK[8] = { 0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe };
436*53ee8cc1Swenshuai.xi
437*53ee8cc1Swenshuai.xi pInfo->RefCount = pInfo->num_ref_idx_l0_active; // frame-level 0: 1ref, 1: 2ref
438*53ee8cc1Swenshuai.xi pInfo->h264_mcc_offset[0] = pInfo->h264_mcc_offset[1] = 0;
439*53ee8cc1Swenshuai.xi
440*53ee8cc1Swenshuai.xi // Prepare header
441*53ee8cc1Swenshuai.xi osReset(pStream);
442*53ee8cc1Swenshuai.xi // First slice header
443*53ee8cc1Swenshuai.xi codeDummySliceHeader(pConfig, pStream);
444*53ee8cc1Swenshuai.xi // Finalize
445*53ee8cc1Swenshuai.xi osFlushAll(pStream);
446*53ee8cc1Swenshuai.xi pBitsInfo->ptr = pStream->m_pbFrameBuffer;
447*53ee8cc1Swenshuai.xi pBitsInfo->len = pStream->m_nByteCount;
448*53ee8cc1Swenshuai.xi if ((pStream->BC_nCumulativeBits&7)==0) {
449*53ee8cc1Swenshuai.xi pBitsInfo->bit_len = 0;
450*53ee8cc1Swenshuai.xi pBitsInfo->bits = 0;
451*53ee8cc1Swenshuai.xi }
452*53ee8cc1Swenshuai.xi else {
453*53ee8cc1Swenshuai.xi pBitsInfo->len--;
454*53ee8cc1Swenshuai.xi pBitsInfo->bit_len = pStream->BC_nCumulativeBits&7;
455*53ee8cc1Swenshuai.xi pBitsInfo->bits = pStream->m_pbFrameBuffer[pStream->BC_nCumulativeBits>>3] & gBITMASK[pBitsInfo->bit_len];
456*53ee8cc1Swenshuai.xi }
457*53ee8cc1Swenshuai.xi }
458*53ee8cc1Swenshuai.xi
mfeH264_UpdateFrame(MFE_CONFIG * pConfig)459*53ee8cc1Swenshuai.xi void mfeH264_UpdateFrame(MFE_CONFIG *pConfig)
460*53ee8cc1Swenshuai.xi {
461*53ee8cc1Swenshuai.xi H264INFO* pInfo = &pConfig->ctxH264Info;
462*53ee8cc1Swenshuai.xi MS_S32 max_frame_num = 1 << (pInfo->log2_max_frame_num_minus4 + 4);
463*53ee8cc1Swenshuai.xi //if (pConfig->vopPredType==I_VOP)
464*53ee8cc1Swenshuai.xi // IntraUpdateInit(pConfig);
465*53ee8cc1Swenshuai.xi IntraUpdateFrame(pConfig);
466*53ee8cc1Swenshuai.xi
467*53ee8cc1Swenshuai.xi // Rate control
468*53ee8cc1Swenshuai.xi MfeDrvRateControlUpdate(pConfig, pInfo->structure);
469*53ee8cc1Swenshuai.xi
470*53ee8cc1Swenshuai.xi h264DpbHandling(pConfig);
471*53ee8cc1Swenshuai.xi
472*53ee8cc1Swenshuai.xi if (pInfo->structure!=TOP_FIELD)
473*53ee8cc1Swenshuai.xi {
474*53ee8cc1Swenshuai.xi pInfo->frame_num++;
475*53ee8cc1Swenshuai.xi pInfo->frame_num %= max_frame_num;
476*53ee8cc1Swenshuai.xi }
477*53ee8cc1Swenshuai.xi pInfo->number++;
478*53ee8cc1Swenshuai.xi //pInfo->number++;
479*53ee8cc1Swenshuai.xi
480*53ee8cc1Swenshuai.xi // If PAFF, always assume top-field first.
481*53ee8cc1Swenshuai.xi // A trick here: restore to top type for correct mfeSetVopType()
482*53ee8cc1Swenshuai.xi if (pInfo->structure==BOTTOM_FIELD)
483*53ee8cc1Swenshuai.xi pConfig->vopPredType = pInfo->vopPredType_FirstField;
484*53ee8cc1Swenshuai.xi
485*53ee8cc1Swenshuai.xi }
486*53ee8cc1Swenshuai.xi
OutputSwCfg1_H264(MS_S32 nFrmNum,MFE_CONFIG * pConfig)487*53ee8cc1Swenshuai.xi void OutputSwCfg1_H264(MS_S32 nFrmNum, MFE_CONFIG* pConfig)
488*53ee8cc1Swenshuai.xi {
489*53ee8cc1Swenshuai.xi MS_S32 nTarWriteCount;
490*53ee8cc1Swenshuai.xi MS_S32 nRegWriteCount;
491*53ee8cc1Swenshuai.xi MS_S32 nTarFDCCount;
492*53ee8cc1Swenshuai.xi MS_S32 nRegFDCCount;
493*53ee8cc1Swenshuai.xi
494*53ee8cc1Swenshuai.xi H264INFO* pInfo = &pConfig->ctxH264Info;
495*53ee8cc1Swenshuai.xi BufInfo* pBufInfo = &pConfig->ctxBufInfo;
496*53ee8cc1Swenshuai.xi BitsInfo *pBitsInfo = &pConfig->ctxBitsInfo;
497*53ee8cc1Swenshuai.xi CVBRRateControl* rcCtx = &pConfig->ctxRateControl;
498*53ee8cc1Swenshuai.xi MFE_REG* mfe_reg = &pConfig->mfe_reg;
499*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
500*53ee8cc1Swenshuai.xi MFE_REG1* mfe_reg1 = &pConfig->mfe_reg1;
501*53ee8cc1Swenshuai.xi #endif
502*53ee8cc1Swenshuai.xi void* pContext = (void*)pBitsInfo;
503*53ee8cc1Swenshuai.xi
504*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////////////////////////////
505*53ee8cc1Swenshuai.xi // Sequence-wide settings
506*53ee8cc1Swenshuai.xi
507*53ee8cc1Swenshuai.xi if (nFrmNum==0) {
508*53ee8cc1Swenshuai.xi memset(mfe_reg, 0, sizeof(MFE_REG)); // Initial
509*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_enc_mode = REG_ENC_MODE_H264;
510*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_pic_width = pConfig->nBufWidth;
511*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_pic_height = (pInfo->PicInterlace==FIELD_CODING) ? (pConfig->nBufHeight>>1) : pConfig->nBufHeight;
512*53ee8cc1Swenshuai.xi
513*53ee8cc1Swenshuai.xi // Qtable
514*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_qmode = 0;
515*53ee8cc1Swenshuai.xi #if defined(_MFE_M1_)||defined(_MFE_AGATE_)
516*53ee8cc1Swenshuai.xi if(0) {
517*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_mb_pitch_en = 1;
518*53ee8cc1Swenshuai.xi //pirch for x-axle
519*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_mb_pitch = 0;//g_nMBPitch;//mfe_reg.reg_mfe_g_pic_width;
520*53ee8cc1Swenshuai.xi }
521*53ee8cc1Swenshuai.xi else {
522*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_mb_pitch_en = 0;
523*53ee8cc1Swenshuai.xi //pirch for x-axle
524*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_mb_pitch = mfe_reg->reg_mfe_g_pic_width/16;
525*53ee8cc1Swenshuai.xi }
526*53ee8cc1Swenshuai.xi #endif
527*53ee8cc1Swenshuai.xi //Field Coding
528*53ee8cc1Swenshuai.xi if (pInfo->PicInterlace==FIELD_CODING) {
529*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_fldpic_en = 1;
530*53ee8cc1Swenshuai.xi #if defined(_MFE_AGATE_)
531*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_mstar_tile_field_split = (pConfig->bInterlace ==INTERLACE_SPLITED)? 1:0 ;
532*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_fldpic_idx = 0; //top
533*53ee8cc1Swenshuai.xi #endif
534*53ee8cc1Swenshuai.xi }
535*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
536*53ee8cc1Swenshuai.xi //Entropy coding mode
537*53ee8cc1Swenshuai.xi if(pConfig->UseCABAC==1)
538*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_cabac_en = 1;
539*53ee8cc1Swenshuai.xi else
540*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_cabac_en = 0;
541*53ee8cc1Swenshuai.xi #endif
542*53ee8cc1Swenshuai.xi #if defined(_MFE_AGATE_)
543*53ee8cc1Swenshuai.xi if(pConfig->bColorFormat != YUVTILE)
544*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_mstar_tile = 1;
545*53ee8cc1Swenshuai.xi else
546*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_mstar_tile = 0;
547*53ee8cc1Swenshuai.xi #endif
548*53ee8cc1Swenshuai.xi
549*53ee8cc1Swenshuai.xi // ME partition type
550*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_me_16x16_disable = !pInfo->InterSearch[0][BLOCK16x16];
551*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_me_8x8_disable = !pInfo->InterSearch[0][BLOCK8x8];
552*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_me_16x8_disable = !pInfo->InterSearch[0][BLOCK16x8];
553*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_me_8x16_disable = !pInfo->InterSearch[0][BLOCK8x16];
554*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_me_8x4_disable = !pInfo->InterSearch[0][BLOCK8x4];
555*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_me_4x8_disable = !pInfo->InterSearch[0][BLOCK4x8];
556*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_me_4x4_disable = !pInfo->InterSearch[0][BLOCK4x4];
557*53ee8cc1Swenshuai.xi
558*53ee8cc1Swenshuai.xi // MDC
559*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mbr_qp_cidx_offset = 0;//active_pps->chroma_qp_index_offset;
560*53ee8cc1Swenshuai.xi #if defined(_MFE_M1_)||defined(_MFE_AGATE_)
561*53ee8cc1Swenshuai.xi // pre-fetch
562*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_prfh_cryc_en = 1;
563*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_prfh_refy_en = 1;
564*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_prfh_cryc_idle_cnt = 0;
565*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_prfh_refy_idle_cnt = 0;
566*53ee8cc1Swenshuai.xi #ifdef SW_BUF_MODE
567*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_sw_buffer_mode = 1;
568*53ee8cc1Swenshuai.xi #else
569*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_sw_buffer_mode = 0;
570*53ee8cc1Swenshuai.xi #endif
571*53ee8cc1Swenshuai.xi
572*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_jpe_buffer_mode = 1; // frame-mode
573*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_jpe_fsvs_mode = 0;
574*53ee8cc1Swenshuai.xi #endif
575*53ee8cc1Swenshuai.xi }
576*53ee8cc1Swenshuai.xi else {
577*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_frame_start_sw = 0;
578*53ee8cc1Swenshuai.xi #if defined(_MFE_AGATE_)
579*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_fldpic_idx = ~mfe_reg->reg_mfe_g_fldpic_idx; //change top and bottom.
580*53ee8cc1Swenshuai.xi #endif
581*53ee8cc1Swenshuai.xi }
582*53ee8cc1Swenshuai.xi
583*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
584*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_jpd_hsk_en = 0;
585*53ee8cc1Swenshuai.xi if(pConfig->g_nUseYUV422 != 0) {
586*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_packed422_en = 1;
587*53ee8cc1Swenshuai.xi }
588*53ee8cc1Swenshuai.xi else {
589*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_packed422_en = 0;
590*53ee8cc1Swenshuai.xi }
591*53ee8cc1Swenshuai.xi
592*53ee8cc1Swenshuai.xi if(pConfig->g_nUseYUV422 == 1){
593*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_packed422_uv_swap = 0;
594*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_packed422_yc_swap = 0;
595*53ee8cc1Swenshuai.xi }
596*53ee8cc1Swenshuai.xi else if(pConfig->g_nUseYUV422 == 2) {
597*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_packed422_uv_swap = 1;
598*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_packed422_yc_swap = 0;
599*53ee8cc1Swenshuai.xi }
600*53ee8cc1Swenshuai.xi else if(pConfig->g_nUseYUV422 == 3) {
601*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_packed422_uv_swap = 0;
602*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_packed422_yc_swap = 1;
603*53ee8cc1Swenshuai.xi }
604*53ee8cc1Swenshuai.xi else if(pConfig->g_nUseYUV422 == 4) {
605*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_packed422_uv_swap = 1;
606*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_packed422_yc_swap = 1;
607*53ee8cc1Swenshuai.xi }
608*53ee8cc1Swenshuai.xi #endif
609*53ee8cc1Swenshuai.xi
610*53ee8cc1Swenshuai.xi #if defined(MFE_YUV_LOADER)
611*53ee8cc1Swenshuai.xi mfe_reg1->reg0b = 0;
612*53ee8cc1Swenshuai.xi mfe_reg1->reg56 = 0;
613*53ee8cc1Swenshuai.xi
614*53ee8cc1Swenshuai.xi if (YUVTILE != pConfig->bColorFormat) {
615*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_yuvldr_en = 1;
616*53ee8cc1Swenshuai.xi if (MFE_EVDTILE == pConfig->bColorFormat) {
617*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_hevd_tile = 1;
618*53ee8cc1Swenshuai.xi }
619*53ee8cc1Swenshuai.xi else if (MFE_32x32TILE == pConfig->bColorFormat) {
620*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_hevd_tile32 = 1;
621*53ee8cc1Swenshuai.xi }
622*53ee8cc1Swenshuai.xi else if (MFE_NV12 == pConfig->bColorFormat) {
623*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_yuv420_semi = 1;
624*53ee8cc1Swenshuai.xi }
625*53ee8cc1Swenshuai.xi else if (MFE_NV21 == pConfig->bColorFormat) {
626*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_yuv420_semi = 1;
627*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_yuv420_semi_uv_swap = 1;
628*53ee8cc1Swenshuai.xi }
629*53ee8cc1Swenshuai.xi else if (pConfig->g_nUseYUV422 != 0) {
630*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_mb_pitch = pConfig->nBufWidth / 16;
631*53ee8cc1Swenshuai.xi }
632*53ee8cc1Swenshuai.xi }
633*53ee8cc1Swenshuai.xi #endif
634*53ee8cc1Swenshuai.xi
635*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////////////////////////////
636*53ee8cc1Swenshuai.xi // Frame-wide settings
637*53ee8cc1Swenshuai.xi #ifdef CLOCK_GATING
638*53ee8cc1Swenshuai.xi mfe_reg->reg16 = 0xffff; // clock gating
639*53ee8cc1Swenshuai.xi #endif
640*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L3," RecY:0x%x, RecC:0x%x\n", (unsigned int)pBufInfo->m_nRecYAddr.miuAddress, (unsigned int)pBufInfo->m_nRecCAddr.miuAddress);
641*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L3,"[0]RefY:0x%x, RefC:0x%x\n", (unsigned int)pBufInfo->m_nRefYAddr[0].miuAddress, (unsigned int)pBufInfo->m_nRefCAddr[0].miuAddress);
642*53ee8cc1Swenshuai.xi if(pInfo->num_ref_frames==2)
643*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L3,"[1]RefY:0x%x, RefC:0x%x\n", (unsigned int)pBufInfo->m_nRefYAddr[1].miuAddress, (unsigned int)pBufInfo->m_nRefCAddr[1].miuAddress);
644*53ee8cc1Swenshuai.xi
645*53ee8cc1Swenshuai.xi if(pConfig->g_nUseYUV422 != 0) {
646*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
647*53ee8cc1Swenshuai.xi MS_ASSERT((pBufInfo->m_nCurYAddr.miuAddress&0xF)==0);
648*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_enc_cury_offset = 0;
649*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_enc_cury_adr_low = (MS_U16)((pBufInfo->m_nCurYAddr.miuAddress>>3)& 0x1FFF); //13bit
650*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_g_enc_cury_adr_high = (MS_U16)(pBufInfo->m_nCurYAddr.miuAddress >> (13+3));
651*53ee8cc1Swenshuai.xi #else
652*53ee8cc1Swenshuai.xi MS_ASSERT(0); // 422 mode didnot supported at old chip.
653*53ee8cc1Swenshuai.xi #endif
654*53ee8cc1Swenshuai.xi } else {
655*53ee8cc1Swenshuai.xi // Input buffer address: Must be 256-byte aligned.
656*53ee8cc1Swenshuai.xi MS_ASSERT((pBufInfo->m_nCurYAddr.miuAddress&0xFF)==0);
657*53ee8cc1Swenshuai.xi MS_ASSERT((pBufInfo->m_nCurCAddr.miuAddress&0xFF)==0);
658*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_cur_y_adr_low = (MS_U16)((pBufInfo->m_nCurYAddr.miuAddress>>8)&0xFFFF);
659*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_cur_y_adr_high = (MS_U16)(pBufInfo->m_nCurYAddr.miuAddress>>(8+16));
660*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_cur_c_adr_low = (MS_U16)((pBufInfo->m_nCurCAddr.miuAddress>>8)&0xFFFF);
661*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_cur_c_adr_high = (MS_U16)(pBufInfo->m_nCurCAddr.miuAddress>>(8+16));
662*53ee8cc1Swenshuai.xi }
663*53ee8cc1Swenshuai.xi MS_ASSERT((pBufInfo->m_nRefYAddr[0].miuAddress&0xFF)==0);
664*53ee8cc1Swenshuai.xi MS_ASSERT((pBufInfo->m_nRefCAddr[0].miuAddress&0xFF)==0);
665*53ee8cc1Swenshuai.xi #ifndef _MFE_M1_
666*53ee8cc1Swenshuai.xi MS_ASSERT((pBufInfo->m_nRefYAddr[1].miuAddress&0xFF)==0);
667*53ee8cc1Swenshuai.xi MS_ASSERT((pBufInfo->m_nRefCAddr[1].miuAddress&0xFF)==0);
668*53ee8cc1Swenshuai.xi #endif
669*53ee8cc1Swenshuai.xi if(!pConfig->SecurityMode) {
670*53ee8cc1Swenshuai.xi MS_ASSERT((pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress&0x7)==0);
671*53ee8cc1Swenshuai.xi }
672*53ee8cc1Swenshuai.xi
673*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ref_y_adr0_low = (MS_U16)((pBufInfo->m_nRefYAddr[0].miuAddress>>8)&0xFFFF);
674*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ref_y_adr0_high = (MS_U16)(pBufInfo->m_nRefYAddr[0].miuAddress>>(8+16));
675*53ee8cc1Swenshuai.xi #ifndef _MFE_M1_
676*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ref_y_adr1_low = (MS_U16)((pBufInfo->m_nRefYAddr[1].miuAddress>>8)&0xFFFF);
677*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ref_y_adr1_high = (MS_U16)(pBufInfo->m_nRefYAddr[1].miuAddress>>(8+16));
678*53ee8cc1Swenshuai.xi #endif
679*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ref_c_adr0_low = (MS_U16)((pBufInfo->m_nRefCAddr[0].miuAddress>>8)&0xFFFF);
680*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ref_c_adr0_high = (MS_U16)(pBufInfo->m_nRefCAddr[0].miuAddress>>(8+16));
681*53ee8cc1Swenshuai.xi #ifndef _MFE_M1_
682*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ref_c_adr1_low = (MS_U16)((pBufInfo->m_nRefCAddr[1].miuAddress>>8)&0xFFFF);
683*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ref_c_adr1_high = (MS_U16)(pBufInfo->m_nRefCAddr[1].miuAddress>>(8+16));
684*53ee8cc1Swenshuai.xi #endif
685*53ee8cc1Swenshuai.xi
686*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_rec_y_adr_low = (MS_U16)((pBufInfo->m_nRecYAddr.miuAddress>>8)&0xFFFF);
687*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_rec_y_adr_high = (MS_U16)(pBufInfo->m_nRecYAddr.miuAddress>>(8+16));
688*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_rec_c_adr_low = (MS_U16)((pBufInfo->m_nRecCAddr.miuAddress>>8)&0xFFFF);
689*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_rec_c_adr_high = (MS_U16)(pBufInfo->m_nRecCAddr.miuAddress>>(8+16));
690*53ee8cc1Swenshuai.xi
691*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L3, "field = %d, Rec = 0x%x, Ref0 = 0x%x, Ref1 = 0x%x\n",
692*53ee8cc1Swenshuai.xi pInfo->structure, (unsigned int)pBufInfo->m_nRecYAddr.miuAddress,
693*53ee8cc1Swenshuai.xi (unsigned int)pBufInfo->m_nRefCAddr[0].miuAddress, (unsigned int)pBufInfo->m_nRefCAddr[1].miuAddress);
694*53ee8cc1Swenshuai.xi
695*53ee8cc1Swenshuai.xi // Output buffers: Must be 8-byte aligned.
696*53ee8cc1Swenshuai.xi #if defined(_MFE_M1_)||defined(_MFE_AGATE_)
697*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_hw_en = 0;
698*53ee8cc1Swenshuai.xi #if defined(USE_HW_DBL_OBUF)
699*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_hw_en = 1;
700*53ee8cc1Swenshuai.xi #endif
701*53ee8cc1Swenshuai.xi #else
702*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_sadr_low = (MS_U16)((pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress>>3)&0xFFFF);
703*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_sadr_high = (MS_U16)(pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress>>(3+16));
704*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_eadr_low = (MS_U16)(((pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress+pBufInfo->m_OutBufferSize-8)>>3)&0xFFFF);
705*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_eadr_high = (MS_U16)((pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress+pBufInfo->m_OutBufferSize-8)>>(3+16));
706*53ee8cc1Swenshuai.xi #endif
707*53ee8cc1Swenshuai.xi
708*53ee8cc1Swenshuai.xi // GN
709*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_gn_sadr_low = (MS_U16)((pBufInfo->m_nGNAddr.miuAddress>>3)&0xFFFF);
710*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_gn_sadr_high = (MS_U16)(pBufInfo->m_nGNAddr.miuAddress>>(3+16));
711*53ee8cc1Swenshuai.xi #ifdef _MFE_M1_
712*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_gn_sadr_mode =
713*53ee8cc1Swenshuai.xi #if defined(GN_WHOLE_FRAME)
714*53ee8cc1Swenshuai.xi 1;
715*53ee8cc1Swenshuai.xi #else
716*53ee8cc1Swenshuai.xi 0;
717*53ee8cc1Swenshuai.xi #endif
718*53ee8cc1Swenshuai.xi
719*53ee8cc1Swenshuai.xi // IMI buffer
720*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_eimi_block = 0;
721*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_lbwd_mode = 0;
722*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_imi_sadr_low = 0;
723*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_imi_sadr_high = 0;
724*53ee8cc1Swenshuai.xi
725*53ee8cc1Swenshuai.xi if (pConfig->vopPredType!=I_VOP && pConfig->MfeAdvInfo.low_bandwidth_en && pConfig->imi_size>0) {
726*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_eimi_block = 1;
727*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_lbwd_mode = 1;
728*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_imi_sadr_low = (pConfig->imi_addr>>3)&0xFFFF;
729*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_imi_sadr_high = pConfig->imi_addr>>(3+16);
730*53ee8cc1Swenshuai.xi switch (pConfig->imi_size) {
731*53ee8cc1Swenshuai.xi // 0: 64kB, 1:32kB, 2:16kB, 3:8kB
732*53ee8cc1Swenshuai.xi case 0x10000:
733*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_imi_cache_size = 0;
734*53ee8cc1Swenshuai.xi break;
735*53ee8cc1Swenshuai.xi case 0x8000:
736*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_imi_cache_size = 1;
737*53ee8cc1Swenshuai.xi break;
738*53ee8cc1Swenshuai.xi case 0x4000:
739*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_imi_cache_size = 2;
740*53ee8cc1Swenshuai.xi break;
741*53ee8cc1Swenshuai.xi case 0x2000:
742*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_imi_cache_size = 3;
743*53ee8cc1Swenshuai.xi break;
744*53ee8cc1Swenshuai.xi default:
745*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_imi_cache_size = 0;
746*53ee8cc1Swenshuai.xi MS_ASSERT(0);
747*53ee8cc1Swenshuai.xi }
748*53ee8cc1Swenshuai.xi }
749*53ee8cc1Swenshuai.xi
750*53ee8cc1Swenshuai.xi #endif
751*53ee8cc1Swenshuai.xi
752*53ee8cc1Swenshuai.xi #if defined(MFE_DBF_PACKED_MODE)
753*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_gn_bwr_mode |= 0x2;
754*53ee8cc1Swenshuai.xi #endif
755*53ee8cc1Swenshuai.xi
756*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_frame_type = pConfig->vopPredType==I_VOP?0:(pConfig->vopPredType==P_VOP?1:2);
757*53ee8cc1Swenshuai.xi
758*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ref_no = pInfo->RefCount==2 ? 1 : 0;
759*53ee8cc1Swenshuai.xi /*
760*53ee8cc1Swenshuai.xi if(pInfo->PicInterlace==FIELD_CODING){
761*53ee8cc1Swenshuai.xi if(pInfo->structure==BOTTOM_FIELD){
762*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ref_no = 0;
763*53ee8cc1Swenshuai.xi }
764*53ee8cc1Swenshuai.xi }
765*53ee8cc1Swenshuai.xi */
766*53ee8cc1Swenshuai.xi // ME setting
767*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_mesr_max_addr = (pInfo->SEARCH_RANGE_Y==16 ? 95 : /*83*/85);//0x5f;
768*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_mesr_min_addr =(pInfo->SEARCH_RANGE_Y==16 ? 0 : /*16*/10);//0;
769*53ee8cc1Swenshuai.xi
770*53ee8cc1Swenshuai.xi #if defined(MFE_SUPPORT_720P)
771*53ee8cc1Swenshuai.xi // If force encoding frame size bigger than 720p on 720p/30fps chip,
772*53ee8cc1Swenshuai.xi // reduce ime search range to improve encoding speed.
773*53ee8cc1Swenshuai.xi if (pConfig->nBufWidth * pConfig->nBufHeight > 1280 * 736)
774*53ee8cc1Swenshuai.xi {
775*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_mvx_min = 0x10;
776*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_mvx_max = 0x2e;
777*53ee8cc1Swenshuai.xi }
778*53ee8cc1Swenshuai.xi else
779*53ee8cc1Swenshuai.xi #endif
780*53ee8cc1Swenshuai.xi {
781*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_mvx_min = -(pInfo->iSearchRangeForward) + 32; // Min X is -pVopMd->iSearchRangeForward
782*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_mvx_max = (pInfo->iSearchRangeForward-2) + 32; // Max X is pVopMd->iSearchRangeForward-1
783*53ee8cc1Swenshuai.xi }
784*53ee8cc1Swenshuai.xi
785*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_mvy_min = -pInfo->SEARCH_RANGE_Y + 16; // Min Y
786*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_mvy_max = (pInfo->SEARCH_RANGE_Y==16 ? 15 : 8) + 16; // Max Y
787*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_sr16 = (mfe_reg->reg_mfe_s_ime_mvx_min>=16 ? 1 : 0);
788*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_umv_disable = pInfo->no_umv;
789*53ee8cc1Swenshuai.xi
790*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_ime_wait_fme = 1;
791*53ee8cc1Swenshuai.xi #ifdef FME_PIPELINE_OPEN
792*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_pipeline_on = mfe_reg->reg_mfe_s_ime_ime_wait_fme ? 1 : 0;
793*53ee8cc1Swenshuai.xi #else
794*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_pipeline_on = 0x0;
795*53ee8cc1Swenshuai.xi #endif
796*53ee8cc1Swenshuai.xi
797*53ee8cc1Swenshuai.xi #ifdef CHECK_P8x8_BOUND_RECT
798*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_boundrect_en = (pInfo->ProfileIDC==66 && pInfo->LevelIDC<=30) ? 1 : 0;
799*53ee8cc1Swenshuai.xi #endif
800*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_h264_p8x8_ctrl_en = pInfo->nMaxP8x8Count<(mfe_reg->reg_mfe_g_pic_width>>4)*(mfe_reg->reg_mfe_g_pic_height>>4) ? 1 : 0;
801*53ee8cc1Swenshuai.xi if (mfe_reg->reg_mfe_s_ime_h264_p8x8_ctrl_en)
802*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ime_h264_p8x8_max = pInfo->nMaxP8x8Count>>4;
803*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mesr_adapt = pInfo->IME_ADAPTIVE_WINDOW?1:0;
804*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_me_ref_en_mode = pInfo->RefCount==2 ? 0x3 : (pInfo->RefCount==1 ? 0x1 : 0);
805*53ee8cc1Swenshuai.xi
806*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_quarter_disable = (pInfo->fme_precision!=2);
807*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_half_disable = (pInfo->fme_precision==0);
808*53ee8cc1Swenshuai.xi //mfe_reg->reg_mfe_s_fme_one_mode = 1;
809*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_pmv_enable = (/*(PSKIP_PREFERRED==3) &&*/ pInfo->InterSearch[0][0]);
810*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_mode_no = pInfo->nMaxFmeMode-1;
811*53ee8cc1Swenshuai.xi
812*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_mode0_refno = 1;
813*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_mode1_refno = 1;
814*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_mode2_refno = 1;
815*53ee8cc1Swenshuai.xi /*
816*53ee8cc1Swenshuai.xi if(pInfo->PicInterlace==FIELD_CODING){
817*53ee8cc1Swenshuai.xi if(pInfo->structure==BOTTOM_FIELD){
818*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_mode0_refno = 0;
819*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_mode1_refno = 0;
820*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_fme_mode2_refno = 0;
821*53ee8cc1Swenshuai.xi }
822*53ee8cc1Swenshuai.xi }
823*53ee8cc1Swenshuai.xi */
824*53ee8cc1Swenshuai.xi // Intra update
825*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_txip_irfsh_en = 0;
826*53ee8cc1Swenshuai.xi
827*53ee8cc1Swenshuai.xi if(mfe_reg->reg_mfe_s_txip_irfsh_en)
828*53ee8cc1Swenshuai.xi {
829*53ee8cc1Swenshuai.xi MS_S32 i;
830*53ee8cc1Swenshuai.xi MS_S32 count, prv_intra;
831*53ee8cc1Swenshuai.xi MS_S32 start[2], end[2];
832*53ee8cc1Swenshuai.xi IntraUpdateContext* ctx = &pConfig->m_IUContext;
833*53ee8cc1Swenshuai.xi
834*53ee8cc1Swenshuai.xi count = 0;
835*53ee8cc1Swenshuai.xi prv_intra = 0;
836*53ee8cc1Swenshuai.xi for (i=0; i<ctx->nTotalMb; i++) {
837*53ee8cc1Swenshuai.xi if (ctx->pHwMbMap[i].intra) {
838*53ee8cc1Swenshuai.xi if (prv_intra==0) {
839*53ee8cc1Swenshuai.xi count++;
840*53ee8cc1Swenshuai.xi if (count>2) {
841*53ee8cc1Swenshuai.xi MS_ASSERT(0);
842*53ee8cc1Swenshuai.xi }
843*53ee8cc1Swenshuai.xi start[count-1] = end[count-1] = i;
844*53ee8cc1Swenshuai.xi }
845*53ee8cc1Swenshuai.xi else
846*53ee8cc1Swenshuai.xi end[count-1] = i;
847*53ee8cc1Swenshuai.xi }
848*53ee8cc1Swenshuai.xi prv_intra = ctx->pHwMbMap[i].intra;
849*53ee8cc1Swenshuai.xi }
850*53ee8cc1Swenshuai.xi if (count>0) {
851*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_txip_irfsh_en |= 1;
852*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_txip_irfsh_mb_s0 = start[0];
853*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_txip_irfsh_mb_e0 = end[0];
854*53ee8cc1Swenshuai.xi }
855*53ee8cc1Swenshuai.xi if (count>1) {
856*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_txip_irfsh_en |= 2;
857*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_txip_irfsh_mb_s1 = start[1];
858*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_txip_irfsh_mb_e1 = end[1];
859*53ee8cc1Swenshuai.xi }
860*53ee8cc1Swenshuai.xi }
861*53ee8cc1Swenshuai.xi
862*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mdc_h264_nal_ref_idc = pInfo->nal_ref_idc;
863*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mdc_h264_nal_unit_type = pInfo->idr_flag ? 1 : 0;
864*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mdc_h264_fnum_bits = pInfo->log2_max_frame_num_minus4+4-5;
865*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mdc_h264_dbf_control = pInfo->bDeblockCtrlPresent;
866*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mdc_h264_fnum_value = pInfo->frame_num;//img->frame_num;
867*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mdc_h264_idr_pic_id = (pInfo->number/*img->number*/ % 2);
868*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mdc_h264_disable_dbf_idc = pInfo->nDeblockIDC;//img->LFDisableIdc==1?1:2;
869*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mdc_h264_alpha = pInfo->nDeblockAlpha;//img->LFAlphaC0Offset/2;
870*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mdc_h264_beta = pInfo->nDeblockBeta;//img->LFBetaOffset/2;
871*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mdc_h264_ridx_aor_flag = ((pInfo->num_ref_idx_l0_active != (pInfo->num_ref_idx_l0_active_minus1 +1)) ? 1 : 0);
872*53ee8cc1Swenshuai.xi
873*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_quan_idx_last = 63;
874*53ee8cc1Swenshuai.xi if (mfe_reg->reg_mfe_s_quan_idx_last<63)
875*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_quan_idx_swlast = 1;
876*53ee8cc1Swenshuai.xi else
877*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_quan_idx_swlast = 0;
878*53ee8cc1Swenshuai.xi
879*53ee8cc1Swenshuai.xi // MBR
880*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_mbr_en = rcCtx->m_rcGranularity==MBLEVELRC ? 1 : 0;
881*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mbr_pqp_dlimit = LEFT_QP_DIFF_LIMIT;
882*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mbr_uqp_dlimit = TOP_QP_DIFF_LIMIT;
883*53ee8cc1Swenshuai.xi
884*53ee8cc1Swenshuai.xi // er_en
885*53ee8cc1Swenshuai.xi if (rcCtx->m_nVPMbRow>0 && rcCtx->m_nVPSize<=0)
886*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_er_mode = 0;
887*53ee8cc1Swenshuai.xi else if (rcCtx->m_nVPMbRow<=0 && rcCtx->m_nVPSize>0)
888*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_er_mode = 1;
889*53ee8cc1Swenshuai.xi else if (rcCtx->m_nVPMbRow>0 && rcCtx->m_nVPSize>0)
890*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_er_mode = 2;
891*53ee8cc1Swenshuai.xi else
892*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_er_mode = 3;
893*53ee8cc1Swenshuai.xi if (rcCtx->m_nVPMbRow==0 || rcCtx->m_nVPMbRow==1)
894*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_er_mby = 0;
895*53ee8cc1Swenshuai.xi else if (rcCtx->m_nVPMbRow==2)
896*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_er_mby = 1;
897*53ee8cc1Swenshuai.xi else if (rcCtx->m_nVPMbRow==4)
898*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_er_mby = 2;
899*53ee8cc1Swenshuai.xi else if (rcCtx->m_nVPMbRow==8)
900*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_er_mby = 3;
901*53ee8cc1Swenshuai.xi else if (rcCtx->m_nVPMbRow>0) {
902*53ee8cc1Swenshuai.xi MS_ASSERT(0);
903*53ee8cc1Swenshuai.xi }
904*53ee8cc1Swenshuai.xi if (mfe_reg->reg_mfe_g_er_mode==1 || mfe_reg->reg_mfe_g_er_mode==2)
905*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_er_bs_th = rcCtx->m_nVPSize;
906*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_qscale = pInfo->intQP;
907*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mbr_frame_qstep = rcCtx->m_nFrameQStep;
908*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mbr_tmb_bits = rcCtx->m_nTargetMbBits;
909*53ee8cc1Swenshuai.xi // QP/QStep: Min, max
910*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mbr_qp_min = rcCtx->m_nMinQP;
911*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mbr_qp_max = rcCtx->m_nMaxQP;
912*53ee8cc1Swenshuai.xi MS_ASSERT(rcCtx->m_nMinQStep<(2<<7));
913*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mbr_qstep_min = rcCtx->m_nMinQStep;
914*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mbr_qstep_max = rcCtx->m_nMaxQStep;
915*53ee8cc1Swenshuai.xi
916*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_rec_en = 1;
917*53ee8cc1Swenshuai.xi
918*53ee8cc1Swenshuai.xi // IEAP
919*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ieap_last_mode = pInfo->ieap_last_mode;
920*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ieap_constraint_intra = pInfo->ieap_constraint_intra;
921*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ieap_ccest_en = pInfo->ieap_ccest_en;
922*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ieap_ccest_thr = pInfo->ieap_ccest_thr;
923*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ieap_drop_i16 = pInfo->ieap_drop_i16;
924*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
925*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_ieap_early_termination = 1;
926*53ee8cc1Swenshuai.xi #endif
927*53ee8cc1Swenshuai.xi // Field coding
928*53ee8cc1Swenshuai.xi switch (pInfo->h264_mcc_offset[0]) {
929*53ee8cc1Swenshuai.xi case 0:
930*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mvdctl_ref0_offset = 0;
931*53ee8cc1Swenshuai.xi break;
932*53ee8cc1Swenshuai.xi case 2:
933*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mvdctl_ref0_offset = 1;
934*53ee8cc1Swenshuai.xi break;
935*53ee8cc1Swenshuai.xi case -2:
936*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mvdctl_ref0_offset = 2;
937*53ee8cc1Swenshuai.xi break;
938*53ee8cc1Swenshuai.xi }
939*53ee8cc1Swenshuai.xi switch (pInfo->h264_mcc_offset[1]) {
940*53ee8cc1Swenshuai.xi case 0:
941*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mvdctl_ref1_offset = 0;
942*53ee8cc1Swenshuai.xi break;
943*53ee8cc1Swenshuai.xi case 2:
944*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mvdctl_ref1_offset = 1;
945*53ee8cc1Swenshuai.xi break;
946*53ee8cc1Swenshuai.xi case -2:
947*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mvdctl_ref1_offset = 2;
948*53ee8cc1Swenshuai.xi break;
949*53ee8cc1Swenshuai.xi }
950*53ee8cc1Swenshuai.xi
951*53ee8cc1Swenshuai.xi #if defined(MFE_MIU_WRITE_PROTECTION)
952*53ee8cc1Swenshuai.xi {
953*53ee8cc1Swenshuai.xi MS_U32 gn_buf_size = (pConfig->nBufWidth / 16) * 128;
954*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_lbound_3_low = MEM_BOUND_LO(pBufInfo->m_nGNAddr.miuAddress);
955*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_lbound_3_high = MEM_BOUND_HI(pBufInfo->m_nGNAddr.miuAddress);
956*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_ubound_3_low = MEM_BOUND_LO(pBufInfo->m_nGNAddr.miuAddress + gn_buf_size);
957*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_ubound_3_high = MEM_BOUND_HI(pBufInfo->m_nGNAddr.miuAddress + gn_buf_size);
958*53ee8cc1Swenshuai.xi
959*53ee8cc1Swenshuai.xi // write ports 2 and 3 share the same buffer
960*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_lbound_2_low = mfe_reg->reg_mfe_s_marb_lbound_3_low;
961*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_lbound_2_high = mfe_reg->reg_mfe_s_marb_lbound_3_high;
962*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_ubound_2_low = mfe_reg->reg_mfe_s_marb_ubound_3_low;
963*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_ubound_2_high = mfe_reg->reg_mfe_s_marb_ubound_3_high;
964*53ee8cc1Swenshuai.xi
965*53ee8cc1Swenshuai.xi // bsp obuf
966*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_lbound_0_low = MEM_BOUND_LO(pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress);
967*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_lbound_0_high = MEM_BOUND_HI(pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress);
968*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_ubound_0_low = MEM_BOUND_LO(pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress + pBufInfo->m_OutBufferSize);
969*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_ubound_0_high = MEM_BOUND_HI(pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress + pBufInfo->m_OutBufferSize);
970*53ee8cc1Swenshuai.xi
971*53ee8cc1Swenshuai.xi // recon frames (between gn buf and bsp obuf)
972*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_lbound_1_low = mfe_reg->reg_mfe_s_marb_ubound_3_low;
973*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_lbound_1_high = mfe_reg->reg_mfe_s_marb_ubound_3_high;
974*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_ubound_1_low = mfe_reg->reg_mfe_s_marb_lbound_0_low;
975*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_ubound_1_high = mfe_reg->reg_mfe_s_marb_lbound_0_high;
976*53ee8cc1Swenshuai.xi
977*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_miu_bound_en_0 = 1;
978*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_miu_bound_en_1 = 1;
979*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_miu_bound_en_2 = 1;
980*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_miu_bound_en_3 = 1;
981*53ee8cc1Swenshuai.xi }
982*53ee8cc1Swenshuai.xi #endif
983*53ee8cc1Swenshuai.xi
984*53ee8cc1Swenshuai.xi #ifdef HW_ECO_STARTCODE_PREVENTION
985*53ee8cc1Swenshuai.xi mfe_reg->reg_eco_bsp_rdy_fix = 1;
986*53ee8cc1Swenshuai.xi #if defined(_MFE_EDISON_)
987*53ee8cc1Swenshuai.xi //agate U02 cannot set this.
988*53ee8cc1Swenshuai.xi mfe_reg->reg_eco_bsp_multi_slice_fix = 1;
989*53ee8cc1Swenshuai.xi #endif
990*53ee8cc1Swenshuai.xi #endif
991*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
992*53ee8cc1Swenshuai.xi mfe_reg->reg_eco_bsp_stuffing = 1;
993*53ee8cc1Swenshuai.xi #endif
994*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////////////////////////////
995*53ee8cc1Swenshuai.xi // swcfg1 output
996*53ee8cc1Swenshuai.xi nTarWriteCount = 0;
997*53ee8cc1Swenshuai.xi nRegWriteCount = 0;
998*53ee8cc1Swenshuai.xi nTarFDCCount = 0;
999*53ee8cc1Swenshuai.xi nRegFDCCount = 0;
1000*53ee8cc1Swenshuai.xi if (nFrmNum==0) {
1001*53ee8cc1Swenshuai.xi nTarWriteCount = 2;
1002*53ee8cc1Swenshuai.xi // Switch to sw mode
1003*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_tbc_mode = 0;
1004*53ee8cc1Swenshuai.xi WriteRegMFE(0x3, mfe_reg->reg03, (MS_S8*)("[%d] reg03"), nRegWriteCount++, (MS_S8*)("tbc_mode=0"));
1005*53ee8cc1Swenshuai.xi // Switch to hw mode
1006*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_tbc_mode = 1;
1007*53ee8cc1Swenshuai.xi WriteRegMFE(0x3, mfe_reg->reg03, (MS_S8*)("[%d] reg03"), nRegWriteCount++, (MS_S8*)("tbc_mode=1"));
1008*53ee8cc1Swenshuai.xi MS_ASSERT(nRegWriteCount==nTarWriteCount);
1009*53ee8cc1Swenshuai.xi }
1010*53ee8cc1Swenshuai.xi
1011*53ee8cc1Swenshuai.xi nRegWriteCount = 0;
1012*53ee8cc1Swenshuai.xi nTarFDCCount = PutFDC(mfe_reg, pContext, 1);
1013*53ee8cc1Swenshuai.xi nTarWriteCount = 54+(nTarFDCCount*3);
1014*53ee8cc1Swenshuai.xi
1015*53ee8cc1Swenshuai.xi nTarWriteCount++; // reg to set fdc round
1016*53ee8cc1Swenshuai.xi nTarWriteCount++; // reset 0/1: MPEG4 enable/disable p skip mode
1017*53ee8cc1Swenshuai.xi
1018*53ee8cc1Swenshuai.xi #ifdef CLOCK_GATING
1019*53ee8cc1Swenshuai.xi nTarWriteCount++;
1020*53ee8cc1Swenshuai.xi #endif
1021*53ee8cc1Swenshuai.xi #ifdef MFE_SUPPORT_TLB
1022*53ee8cc1Swenshuai.xi nTarWriteCount++; // mfe_reg1.reg36
1023*53ee8cc1Swenshuai.xi #endif
1024*53ee8cc1Swenshuai.xi #ifdef MFE_YUV_LOADER
1025*53ee8cc1Swenshuai.xi nTarWriteCount += 2; // mfe_reg1.reg56, mfe_reg1.reg0b
1026*53ee8cc1Swenshuai.xi #endif
1027*53ee8cc1Swenshuai.xi #ifdef MFE_DBF_PACKED_MODE
1028*53ee8cc1Swenshuai.xi nTarWriteCount++; // mfe_reg.reg4f
1029*53ee8cc1Swenshuai.xi #endif
1030*53ee8cc1Swenshuai.xi #if defined(MFE_MIU_WRITE_PROTECTION)
1031*53ee8cc1Swenshuai.xi nTarWriteCount += 16; // mfe_reg.reg58 ~ mfe_reg.reg67
1032*53ee8cc1Swenshuai.xi #endif
1033*53ee8cc1Swenshuai.xi
1034*53ee8cc1Swenshuai.xi nTarFDCCount *= 3;
1035*53ee8cc1Swenshuai.xi nTarFDCCount++; // reg to set fdc round
1036*53ee8cc1Swenshuai.xi
1037*53ee8cc1Swenshuai.xi // SW reset
1038*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_soft_rstz = 0;
1039*53ee8cc1Swenshuai.xi WriteRegMFE(0x0, mfe_reg->reg00, (MS_S8*)("[%d] reg00"), nRegWriteCount++, (MS_S8*)("SW reset 0"));
1040*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_soft_rstz = 1;
1041*53ee8cc1Swenshuai.xi WriteRegMFE(0x0, mfe_reg->reg00, (MS_S8*)("[%d] reg00"), nRegWriteCount++, (MS_S8*)("SW reset 1"));
1042*53ee8cc1Swenshuai.xi WriteRegMFE(0x1, mfe_reg->reg01, (MS_S8*)("[%d] reg01"), nRegWriteCount++, (MS_S8*)("picture width"));
1043*53ee8cc1Swenshuai.xi WriteRegMFE(0x2, mfe_reg->reg02, (MS_S8*)("[%d] reg02"), nRegWriteCount++, (MS_S8*)("picture height"));
1044*53ee8cc1Swenshuai.xi WriteRegMFE(0x3, mfe_reg->reg03, (MS_S8*)("[%d] reg03"), nRegWriteCount++, (MS_S8*)("value"));
1045*53ee8cc1Swenshuai.xi WriteRegMFE(0x4, mfe_reg->reg04, (MS_S8*)("[%d] reg04"), nRegWriteCount++, (MS_S8*)("er_bs mode threshold"));
1046*53ee8cc1Swenshuai.xi WriteRegMFE(0x5, mfe_reg->reg05, (MS_S8*)("[%d] reg05"), nRegWriteCount++, (MS_S8*)("inter prediction preference"));
1047*53ee8cc1Swenshuai.xi
1048*53ee8cc1Swenshuai.xi WriteRegMFE(0x20, mfe_reg->reg20, (MS_S8*)("[%d] reg20"), nRegWriteCount++, (MS_S8*)("ME partition setting"));
1049*53ee8cc1Swenshuai.xi WriteRegMFE(0x21, mfe_reg->reg21, (MS_S8*)("[%d] reg21"), nRegWriteCount++, (MS_S8*)("value"));
1050*53ee8cc1Swenshuai.xi WriteRegMFE(0x22, mfe_reg->reg22, (MS_S8*)("[%d] reg22"), nRegWriteCount++, (MS_S8*)("me search range max depth"));
1051*53ee8cc1Swenshuai.xi WriteRegMFE(0x23, mfe_reg->reg23, (MS_S8*)("[%d] reg23"), nRegWriteCount++, (MS_S8*)("me mvx"));
1052*53ee8cc1Swenshuai.xi WriteRegMFE(0x24, mfe_reg->reg24, (MS_S8*)("[%d] reg24"), nRegWriteCount++, (MS_S8*)("me mvy"));
1053*53ee8cc1Swenshuai.xi WriteRegMFE(0x25, mfe_reg->reg25, (MS_S8*)("[%d] reg25"), nRegWriteCount++, (MS_S8*)("FME"));
1054*53ee8cc1Swenshuai.xi
1055*53ee8cc1Swenshuai.xi #ifdef CLOCK_GATING
1056*53ee8cc1Swenshuai.xi WriteRegMFE(0x16, mfe_reg->reg16, (MS_S8*)("[%d] reg16"), nRegWriteCount++, (MS_S8*)("Clock gating"));
1057*53ee8cc1Swenshuai.xi #endif
1058*53ee8cc1Swenshuai.xi
1059*53ee8cc1Swenshuai.xi // Input buffers
1060*53ee8cc1Swenshuai.xi //
1061*53ee8cc1Swenshuai.xi if(pConfig->g_nUseYUV422 == 0) {
1062*53ee8cc1Swenshuai.xi WriteRegMFE(0x06, mfe_reg->reg06, (MS_S8*)("[%d] reg06"), nRegWriteCount++, (MS_S8*)("current luma base address"));
1063*53ee8cc1Swenshuai.xi WriteRegMFE(0x07, mfe_reg->reg07, (MS_S8*)("[%d] reg07"), nRegWriteCount++, (MS_S8*)("current luma base address high"));
1064*53ee8cc1Swenshuai.xi WriteRegMFE(0x08, mfe_reg->reg08, (MS_S8*)("[%d] reg08"), nRegWriteCount++, (MS_S8*)("current chroma base address"));
1065*53ee8cc1Swenshuai.xi WriteRegMFE(0x09, mfe_reg->reg09, (MS_S8*)("[%d] reg09"), nRegWriteCount++, (MS_S8*)("current chroma base address high"));
1066*53ee8cc1Swenshuai.xi }
1067*53ee8cc1Swenshuai.xi WriteRegMFE(0x0a, mfe_reg->reg0a, (MS_S8*)("[%d] reg0a"), nRegWriteCount++, (MS_S8*)("reference luma base address0"));
1068*53ee8cc1Swenshuai.xi WriteRegMFE(0x0b, mfe_reg->reg0b, (MS_S8*)("[%d] reg0b"), nRegWriteCount++, (MS_S8*)("reference luma base address0 high"));
1069*53ee8cc1Swenshuai.xi WriteRegMFE(0x0c, mfe_reg->reg0c, (MS_S8*)("[%d] reg0c"), nRegWriteCount++, (MS_S8*)("reference luma base address1"));
1070*53ee8cc1Swenshuai.xi WriteRegMFE(0x0d, mfe_reg->reg0d, (MS_S8*)("[%d] reg0d"), nRegWriteCount++, (MS_S8*)("reference luma base address1 high"));
1071*53ee8cc1Swenshuai.xi WriteRegMFE(0x0e, mfe_reg->reg0e, (MS_S8*)("[%d] reg0e"), nRegWriteCount++, (MS_S8*)("reference chroma base address0"));
1072*53ee8cc1Swenshuai.xi WriteRegMFE(0x0f, mfe_reg->reg0f, (MS_S8*)("[%d] reg0f"), nRegWriteCount++, (MS_S8*)("reference chroma base address0 high"));
1073*53ee8cc1Swenshuai.xi WriteRegMFE(0x10, mfe_reg->reg10, (MS_S8*)("[%d] reg10"), nRegWriteCount++, (MS_S8*)("reference chroma base address1"));
1074*53ee8cc1Swenshuai.xi WriteRegMFE(0x11, mfe_reg->reg11, (MS_S8*)("[%d] reg11"), nRegWriteCount++, (MS_S8*)("reference chroma base address1 high"));
1075*53ee8cc1Swenshuai.xi WriteRegMFE(0x12, mfe_reg->reg12, (MS_S8*)("[%d] reg12"), nRegWriteCount++, (MS_S8*)("reconstructed luma base address:"));
1076*53ee8cc1Swenshuai.xi WriteRegMFE(0x13, mfe_reg->reg13, (MS_S8*)("[%d] reg13"), nRegWriteCount++, (MS_S8*)("reconstructed luma base address high"));
1077*53ee8cc1Swenshuai.xi WriteRegMFE(0x14, mfe_reg->reg14, (MS_S8*)("[%d] reg14"), nRegWriteCount++, (MS_S8*)("reconstructed chroma base address:"));
1078*53ee8cc1Swenshuai.xi WriteRegMFE(0x15, mfe_reg->reg15, (MS_S8*)("[%d] reg15"), nRegWriteCount++, (MS_S8*)("reconstructed chroma base address: high"));
1079*53ee8cc1Swenshuai.xi
1080*53ee8cc1Swenshuai.xi #if defined(_MFE_T8_)&&!defined(_MFE_AGATE_)
1081*53ee8cc1Swenshuai.xi // Output buffer
1082*53ee8cc1Swenshuai.xi WriteRegMFE(0x3c, mfe_reg->reg3c, (MS_S8*)("[%d] reg3c"), nRegWriteCount++, (MS_S8*)("bsp obuf start address: "));
1083*53ee8cc1Swenshuai.xi WriteRegMFE(0x3d, mfe_reg->reg3d, (MS_S8*)("[%d] reg3d"), nRegWriteCount++, (MS_S8*)("bsp obuf start address high"));
1084*53ee8cc1Swenshuai.xi WriteRegMFE(0x3e, mfe_reg->reg3e, (MS_S8*)("[%d] reg3e"), nRegWriteCount++, (MS_S8*)("bsp obuf end address: "));
1085*53ee8cc1Swenshuai.xi WriteRegMFE(0x3f, mfe_reg->reg3f, (MS_S8*)("[%d] reg3f"), nRegWriteCount++, (MS_S8*)("bsp obuf end address high"));
1086*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_set_adr = 1;
1087*53ee8cc1Swenshuai.xi #endif
1088*53ee8cc1Swenshuai.xi //
1089*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_fifo_th = 1;
1090*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mvobuf_set_adr = 0;
1091*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mvobuf_fifo_th = 0;
1092*53ee8cc1Swenshuai.xi
1093*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
1094*53ee8cc1Swenshuai.xi if(!pConfig->SecurityMode)
1095*53ee8cc1Swenshuai.xi #endif
1096*53ee8cc1Swenshuai.xi {
1097*53ee8cc1Swenshuai.xi #if defined(_MFE_T8_)&&!defined(_MFE_AGATE_)
1098*53ee8cc1Swenshuai.xi WriteRegMFE(0x3b, mfe_reg->reg3b, (MS_S8*)("[%d] reg3b"), nRegWriteCount++, (MS_S8*)("set bsp obuf"));
1099*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_set_adr = 0; // HW is write-one-clear
1100*53ee8cc1Swenshuai.xi #elif defined(_MFE_M1_)||defined(_MFE_AGATE_)
1101*53ee8cc1Swenshuai.xi // Enable set-obuf
1102*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_update_adr = 1;
1103*53ee8cc1Swenshuai.xi WriteRegMFE(0x3f, mfe_reg->reg3f, (MS_S8*)("[%d] reg3f"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_bspobuf_update_adr"));
1104*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_bspobuf_update_adr = 0; // write-one-clear
1105*53ee8cc1Swenshuai.xi #if defined(WIN32)
1106*53ee8cc1Swenshuai.xi mfe_reg->enable_obufadr_update = 0;
1107*53ee8cc1Swenshuai.xi UDMA_RIURead16(REG_BANK_MFE+0x6a, (MS_U16*)&mfe_reg->reg6a);
1108*53ee8cc1Swenshuai.xi while (mfe_reg->enable_obufadr_update!=1) {
1109*53ee8cc1Swenshuai.xi UDMA_RIURead16(REG_BANK_MFE+0x6a, (MS_U16*)&mfe_reg->reg6a);
1110*53ee8cc1Swenshuai.xi printf("Wait for enable_obufadr_update=1!\n"));
1111*53ee8cc1Swenshuai.xi }
1112*53ee8cc1Swenshuai.xi #endif
1113*53ee8cc1Swenshuai.xi #if defined(USE_HW_DBL_OBUF)
1114*53ee8cc1Swenshuai.xi nRegWriteCount += SetObufAddr((MS_U32)pBufInfo->m_nOutBufAddr, pBufInfo->m_OutBufferSize, 0, 0);
1115*53ee8cc1Swenshuai.xi nRegWriteCount += SetObufAddr((MS_U32)pBufInfo->m_nOutBufAddr+pBufInfo->m_OutBufferSize, pBufInfo->m_OutBufferSize, 1, 1);
1116*53ee8cc1Swenshuai.xi #else
1117*53ee8cc1Swenshuai.xi /*
1118*53ee8cc1Swenshuai.xi #define CEILING_ALIGN(value, align) (((MEF_U32)(value)+((align)-1UL)) & ~((align)-1UL))
1119*53ee8cc1Swenshuai.xi #define IN_SIZE (CEILING_ALIGN(720UL,32UL)*1280UL+CEILING_ALIGN(720UL,64UL)*1280UL/2UL+0x100UL)
1120*53ee8cc1Swenshuai.xi
1121*53ee8cc1Swenshuai.xi pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress = 0x000ABEA000 + IN_SIZE;
1122*53ee8cc1Swenshuai.xi pBufInfo->m_OutBufferSize = 1024*1024;
1123*53ee8cc1Swenshuai.xi */
1124*53ee8cc1Swenshuai.xi nRegWriteCount += SetObufAddr(mfe_reg, (MS_U32)pBufInfo->m_nOutBufAddr[pConfig->nOBufIndex].miuAddress, pBufInfo->m_OutBufferSize, 0, 1);
1125*53ee8cc1Swenshuai.xi #endif
1126*53ee8cc1Swenshuai.xi #endif
1127*53ee8cc1Swenshuai.xi }
1128*53ee8cc1Swenshuai.xi // GN
1129*53ee8cc1Swenshuai.xi WriteRegMFE(0x4c, mfe_reg->reg4c, (MS_S8*)("[%d] reg4c"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_gn_sadr_low"));
1130*53ee8cc1Swenshuai.xi WriteRegMFE(0x4d, mfe_reg->reg4d, (MS_S8*)("[%d] reg4d"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_gn_sadr_high"));
1131*53ee8cc1Swenshuai.xi
1132*53ee8cc1Swenshuai.xi // MBR
1133*53ee8cc1Swenshuai.xi WriteRegMFE(0x26, mfe_reg->reg26, (MS_S8*)("[%d] reg26"), nRegWriteCount++, (MS_S8*)("MBR: mbbits"));
1134*53ee8cc1Swenshuai.xi WriteRegMFE(0x27, mfe_reg->reg27, (MS_S8*)("[%d] reg27"), nRegWriteCount++, (MS_S8*)("MBR: frame qstep"));
1135*53ee8cc1Swenshuai.xi WriteRegMFE(0x29, mfe_reg->reg29, (MS_S8*)("[%d] reg29"), nRegWriteCount++, (MS_S8*)("264 qp-offset"));
1136*53ee8cc1Swenshuai.xi WriteRegMFE(0x2a, mfe_reg->reg2a, (MS_S8*)("[%d] reg2a"), nRegWriteCount++, (MS_S8*)("QP min/max"));
1137*53ee8cc1Swenshuai.xi WriteRegMFE(0x6e, mfe_reg->reg6e, (MS_S8*)("[%d] reg6e"), nRegWriteCount++, (MS_S8*)("QStep min"));
1138*53ee8cc1Swenshuai.xi WriteRegMFE(0x6f, mfe_reg->reg6f, (MS_S8*)("[%d] reg6f"), nRegWriteCount++, (MS_S8*)("QStep max"));
1139*53ee8cc1Swenshuai.xi
1140*53ee8cc1Swenshuai.xi // MDC
1141*53ee8cc1Swenshuai.xi WriteRegMFE(0x39, mfe_reg->reg39, (MS_S8*)("[%d] reg39"), nRegWriteCount++, (MS_S8*)("value"));
1142*53ee8cc1Swenshuai.xi
1143*53ee8cc1Swenshuai.xi // Intra Update
1144*53ee8cc1Swenshuai.xi WriteRegMFE(0x2f, mfe_reg->reg2f, (MS_S8*)("[%d] reg2f"), nRegWriteCount++, (MS_S8*)("value"));
1145*53ee8cc1Swenshuai.xi WriteRegMFE(0x30, mfe_reg->reg30, (MS_S8*)("[%d] reg30"), nRegWriteCount++, (MS_S8*)("value"));
1146*53ee8cc1Swenshuai.xi WriteRegMFE(0x31, mfe_reg->reg31, (MS_S8*)("[%d] reg31"), nRegWriteCount++, (MS_S8*)("value"));
1147*53ee8cc1Swenshuai.xi WriteRegMFE(0x32, mfe_reg->reg32, (MS_S8*)("[%d] reg32"), nRegWriteCount++, (MS_S8*)("value"));
1148*53ee8cc1Swenshuai.xi
1149*53ee8cc1Swenshuai.xi // DBF
1150*53ee8cc1Swenshuai.xi WriteRegMFE(0x3a, mfe_reg->reg3a, (MS_S8*)("[%d] reg3a"), nRegWriteCount++, (MS_S8*)("value"));
1151*53ee8cc1Swenshuai.xi
1152*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_crc_mode = 0xC;
1153*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_debug_tcycle_chk_en = 0x1;
1154*53ee8cc1Swenshuai.xi //#ifdef TEST_CRC_MODE
1155*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_debug_tcycle_chk_sel = 0x0;
1156*53ee8cc1Swenshuai.xi //#endif
1157*53ee8cc1Swenshuai.xi
1158*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_debug_en = 0; // TEST
1159*53ee8cc1Swenshuai.xi WriteRegMFE(0x73, mfe_reg->reg73, (MS_S8*)("[%d] reg73"), nRegWriteCount++, (MS_S8*)("crc mode"));
1160*53ee8cc1Swenshuai.xi
1161*53ee8cc1Swenshuai.xi //mfe_reg->reg_mfe_s_txip_idle_cnt = 160;
1162*53ee8cc1Swenshuai.xi //WriteRegMFE(0x33, mfe_reg->reg33, (MS_S8*)("[%d] reg33"), nRegWriteCount++, (MS_S8*)("txip_idle_cnt"));
1163*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
1164*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_ieap_sram_4x2_swap = 1;
1165*53ee8cc1Swenshuai.xi #endif
1166*53ee8cc1Swenshuai.xi WriteRegMFE(0x2c, mfe_reg->reg2c, (MS_S8*)("[%d] reg2c"), nRegWriteCount++, (MS_S8*)("Last zigzag"));
1167*53ee8cc1Swenshuai.xi
1168*53ee8cc1Swenshuai.xi // IEAP
1169*53ee8cc1Swenshuai.xi WriteRegMFE(0x2b, mfe_reg->reg2b, (MS_S8*)("[%d] reg2b"), nRegWriteCount++, (MS_S8*)("ieap"));
1170*53ee8cc1Swenshuai.xi
1171*53ee8cc1Swenshuai.xi // Cross-format wrong reg setting prevention
1172*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_viu_soft_rstz = 1;
1173*53ee8cc1Swenshuai.xi WriteRegMFE(0x18, mfe_reg->reg18, (MS_S8*)("[%d] reg18"), nRegWriteCount++, (MS_S8*)("JPE encode mode"));
1174*53ee8cc1Swenshuai.xi WriteRegMFE(0x1b, mfe_reg->reg1b, (MS_S8*)("[%d] reg1b"), nRegWriteCount++, (MS_S8*)("MPEG4 FieldDCT"));
1175*53ee8cc1Swenshuai.xi MS_ASSERT(mfe_reg->reg19==0);
1176*53ee8cc1Swenshuai.xi WriteRegMFE(0x19,0, (MS_S8*)("[%d] reg19"), nRegWriteCount++, (MS_S8*)("0/1: MPEG4 enable/disable p skip mode"));
1177*53ee8cc1Swenshuai.xi #if defined(_MFE_MUJI_) || defined(_MFE_MONET_) || defined(_MFE_MESSI_) || defined(_MFE_MANHATTAN_) || defined(_MFE_MASERATI_) || defined(_MFE_MAXIM_) || defined(_MFE_KANO_) || defined(_MFE_K6_)
1178*53ee8cc1Swenshuai.xi WriteRegMFE_BANK1(0x52, mfe_reg1->reg52, (MS_S8*)("[%d] reg52"), nRegWriteCount++, (MS_S8*)("YUV422 and handshake mode"));
1179*53ee8cc1Swenshuai.xi
1180*53ee8cc1Swenshuai.xi if(pConfig->g_nUseYUV422 != 0) {
1181*53ee8cc1Swenshuai.xi WriteRegMFE_BANK1(0x12, mfe_reg1->reg12, (MS_S8*)("[%d] reg12"), nRegWriteCount++, (MS_S8*)("enc curr_y addr"));
1182*53ee8cc1Swenshuai.xi WriteRegMFE_BANK1(0x13, mfe_reg1->reg13, (MS_S8*)("[%d] reg13"), nRegWriteCount++, (MS_S8*)("enc curr_y addr"));
1183*53ee8cc1Swenshuai.xi }
1184*53ee8cc1Swenshuai.xi #endif
1185*53ee8cc1Swenshuai.xi
1186*53ee8cc1Swenshuai.xi #if defined(MFE_YUV_LOADER)
1187*53ee8cc1Swenshuai.xi WriteRegMFE_BANK1(0x0b, mfe_reg1->reg0b, (MS_S8*)("[%d] reg0b"), nRegWriteCount++, (MS_S8*)("YUV422 pitch"));
1188*53ee8cc1Swenshuai.xi WriteRegMFE_BANK1(0x56, mfe_reg1->reg56, (MS_S8*)("[%d] reg56"), nRegWriteCount++, (MS_S8*)("YUV Loader"));
1189*53ee8cc1Swenshuai.xi #endif
1190*53ee8cc1Swenshuai.xi
1191*53ee8cc1Swenshuai.xi #ifdef _MFE_T8_
1192*53ee8cc1Swenshuai.xi if (mfe_reg->reg_mfe_g_enc_mode !=REG_ENC_MODE_MPG4) { // MPEG-4
1193*53ee8cc1Swenshuai.xi WriteRegMFE(0x37, mfe_reg->reg37=0, (MS_S8*)("[%d] reg37"), nRegWriteCount, (MS_S8*)("MPEG4 MDC"));
1194*53ee8cc1Swenshuai.xi WriteRegMFE(0x38, mfe_reg->reg38=0, (MS_S8*)("[%d] reg38"), nRegWriteCount, (MS_S8*)("MPEG4: vop_time_increment"));
1195*53ee8cc1Swenshuai.xi // B-direct
1196*53ee8cc1Swenshuai.xi WriteRegMFE(0x1a, mfe_reg->reg1a=0, (MS_S8*)("[%d] reg1a"), nRegWriteCount, (MS_S8*)("MPEG4 BDirect"));
1197*53ee8cc1Swenshuai.xi }
1198*53ee8cc1Swenshuai.xi #endif
1199*53ee8cc1Swenshuai.xi #if defined(_MFE_M1_)||defined(_MFE_AGATE_)
1200*53ee8cc1Swenshuai.xi // Prefetch & Low bandwidth mode
1201*53ee8cc1Swenshuai.xi WriteRegMFE(0x68,mfe_reg->reg68, (MS_S8*)("[%d] reg68"), nRegWriteCount++, (MS_S8*)("Prefetch & Low bandwidth mode"));
1202*53ee8cc1Swenshuai.xi // Prefetch
1203*53ee8cc1Swenshuai.xi WriteRegMFE(0x6d,mfe_reg->reg6d, (MS_S8*)("[%d] reg6d"), nRegWriteCount++, (MS_S8*)("Prefetch MB idle count"));
1204*53ee8cc1Swenshuai.xi //Low BandWidth
1205*53ee8cc1Swenshuai.xi WriteRegMFE(0x6b, mfe_reg->reg6b, (MS_S8*)("[%d] reg6b"), nRegWriteCount++, (MS_S8*)("Low Bandwidth: IMI addr low"));
1206*53ee8cc1Swenshuai.xi WriteRegMFE(0x6c, mfe_reg->reg6c, (MS_S8*)("[%d] reg6c"), nRegWriteCount++, (MS_S8*)("Low Bandwidth: IMI addr high"));
1207*53ee8cc1Swenshuai.xi
1208*53ee8cc1Swenshuai.xi #if defined(MFE_DBF_PACKED_MODE)
1209*53ee8cc1Swenshuai.xi WriteRegMFE(0x4f, mfe_reg->reg4f, (MS_S8*)("[%d] reg4f"), nRegWriteCount++, (MS_S8*)("DBF packed mode"));
1210*53ee8cc1Swenshuai.xi #endif
1211*53ee8cc1Swenshuai.xi
1212*53ee8cc1Swenshuai.xi // Reset any StopAndGo or StopAndDrop setting.
1213*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_txip_sng_mb = 0;
1214*53ee8cc1Swenshuai.xi WriteRegMFE(0x2d, mfe_reg->reg2d, (MS_S8*)("[%d] reg2d"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_txip_sng_mb=0"));
1215*53ee8cc1Swenshuai.xi
1216*53ee8cc1Swenshuai.xi #endif
1217*53ee8cc1Swenshuai.xi //hw bug, disable it.
1218*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_mcc_prldr_mode = 0;
1219*53ee8cc1Swenshuai.xi WriteRegMFE(0x7f, mfe_reg->reg7f, (MS_S8*)("[%d] reg7f"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_mcc_prldr_mode=0"));
1220*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_rp0_promote = 0x0;
1221*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_rp1_promote = 0x0;
1222*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_rp2_promote = 0x0;
1223*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_rp3_promote = 0x0;
1224*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_mrpriority_thd = 0xf;
1225*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_mwpriority_thd = 0xf;
1226*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_rp4_occupy = 0x0;
1227*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_s_marb_rp4_promote = 0x0;
1228*53ee8cc1Swenshuai.xi WriteRegMFE(0x51, mfe_reg->reg51, (MS_S8*)("[%d] reg51"), nRegWriteCount++, (MS_S8*)("marb_rp_promote"));
1229*53ee8cc1Swenshuai.xi WriteRegMFE(0x55, mfe_reg->reg55, (MS_S8*)("[%d] reg55"), nRegWriteCount++, (MS_S8*)("marb_rp4_promote"));
1230*53ee8cc1Swenshuai.xi
1231*53ee8cc1Swenshuai.xi //enable eco item
1232*53ee8cc1Swenshuai.xi WriteRegMFE(0x7d, mfe_reg->reg7d, (MS_S8*)("[%d] reg7d"), nRegWriteCount++, (MS_S8*)("reg_mfe_s_txip_eco0=1"));
1233*53ee8cc1Swenshuai.xi
1234*53ee8cc1Swenshuai.xi #if defined(TEST_MB_STOPANDGO) || defined(TEST_MB_STOPANDDROP)
1235*53ee8cc1Swenshuai.xi if (nFrmNum==STOP_FRAME)
1236*53ee8cc1Swenshuai.xi TestStopAtMb();
1237*53ee8cc1Swenshuai.xi #endif
1238*53ee8cc1Swenshuai.xi #ifdef MFE_MIU_PROFILE
1239*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_rhist_en = 1;
1240*53ee8cc1Swenshuai.xi WriteRegMFE_BANK1(0x45, mfe_reg1->reg45, (MS_S8*)("[%d] reg45"), nRegWriteCount++, (MS_S8*)("Read histogram enable"));
1241*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_s_whist_en = 1;
1242*53ee8cc1Swenshuai.xi WriteRegMFE_BANK1(0x40, mfe_reg1->reg40, (MS_S8*)("[%d] reg40"), nRegWriteCount++, (MS_S8*)("Write histogram enable"));
1243*53ee8cc1Swenshuai.xi #endif
1244*53ee8cc1Swenshuai.xi
1245*53ee8cc1Swenshuai.xi #ifdef MFE_SUPPORT_TLB
1246*53ee8cc1Swenshuai.xi mfe_reg1->reg_mfe_tlb = pConfig->bEnableTLB ? 1 : 0;
1247*53ee8cc1Swenshuai.xi WriteRegMFE_BANK1(0x36, mfe_reg1->reg36, (MS_S8*)("[%d] reg36"), nRegWriteCount++, (MS_S8*)("Enable TLB"));
1248*53ee8cc1Swenshuai.xi #endif
1249*53ee8cc1Swenshuai.xi
1250*53ee8cc1Swenshuai.xi #if defined(MFE_MIU_WRITE_PROTECTION)
1251*53ee8cc1Swenshuai.xi WriteRegMFE(0x58, mfe_reg->reg58, (MS_S8*)("[%d] reg58"), nRegWriteCount++, (MS_S8*)("MIU upper bound 0"));
1252*53ee8cc1Swenshuai.xi WriteRegMFE(0x59, mfe_reg->reg59, (MS_S8*)("[%d] reg59"), nRegWriteCount++, (MS_S8*)("MIU upper bound 0"));
1253*53ee8cc1Swenshuai.xi WriteRegMFE(0x5a, mfe_reg->reg5a, (MS_S8*)("[%d] reg5a"), nRegWriteCount++, (MS_S8*)("MIU lower bound 0"));
1254*53ee8cc1Swenshuai.xi WriteRegMFE(0x5b, mfe_reg->reg5b, (MS_S8*)("[%d] reg5b"), nRegWriteCount++, (MS_S8*)("MIU lower bound 0"));
1255*53ee8cc1Swenshuai.xi WriteRegMFE(0x5c, mfe_reg->reg5c, (MS_S8*)("[%d] reg5c"), nRegWriteCount++, (MS_S8*)("MIU upper bound 1"));
1256*53ee8cc1Swenshuai.xi WriteRegMFE(0x5d, mfe_reg->reg5d, (MS_S8*)("[%d] reg5d"), nRegWriteCount++, (MS_S8*)("MIU upper bound 1"));
1257*53ee8cc1Swenshuai.xi WriteRegMFE(0x5e, mfe_reg->reg5e, (MS_S8*)("[%d] reg5e"), nRegWriteCount++, (MS_S8*)("MIU lower bound 1"));
1258*53ee8cc1Swenshuai.xi WriteRegMFE(0x5f, mfe_reg->reg5f, (MS_S8*)("[%d] reg5f"), nRegWriteCount++, (MS_S8*)("MIU lower bound 1"));
1259*53ee8cc1Swenshuai.xi WriteRegMFE(0x60, mfe_reg->reg60, (MS_S8*)("[%d] reg60"), nRegWriteCount++, (MS_S8*)("MIU upper bound 2"));
1260*53ee8cc1Swenshuai.xi WriteRegMFE(0x61, mfe_reg->reg61, (MS_S8*)("[%d] reg61"), nRegWriteCount++, (MS_S8*)("MIU upper bound 2"));
1261*53ee8cc1Swenshuai.xi WriteRegMFE(0x62, mfe_reg->reg62, (MS_S8*)("[%d] reg62"), nRegWriteCount++, (MS_S8*)("MIU lower bound 2"));
1262*53ee8cc1Swenshuai.xi WriteRegMFE(0x63, mfe_reg->reg63, (MS_S8*)("[%d] reg63"), nRegWriteCount++, (MS_S8*)("MIU lower bound 2"));
1263*53ee8cc1Swenshuai.xi WriteRegMFE(0x64, mfe_reg->reg64, (MS_S8*)("[%d] reg64"), nRegWriteCount++, (MS_S8*)("MIU upper bound 3"));
1264*53ee8cc1Swenshuai.xi WriteRegMFE(0x65, mfe_reg->reg65, (MS_S8*)("[%d] reg65"), nRegWriteCount++, (MS_S8*)("MIU upper bound 3"));
1265*53ee8cc1Swenshuai.xi WriteRegMFE(0x66, mfe_reg->reg66, (MS_S8*)("[%d] reg66"), nRegWriteCount++, (MS_S8*)("MIU lower bound 3"));
1266*53ee8cc1Swenshuai.xi WriteRegMFE(0x67, mfe_reg->reg67, (MS_S8*)("[%d] reg67"), nRegWriteCount++, (MS_S8*)("MIU lower bound 3"));
1267*53ee8cc1Swenshuai.xi #endif
1268*53ee8cc1Swenshuai.xi
1269*53ee8cc1Swenshuai.xi //DumpAllReg();
1270*53ee8cc1Swenshuai.xi // Enable HW
1271*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_frame_start_sw = 1;
1272*53ee8cc1Swenshuai.xi WriteRegMFE(0x00, mfe_reg->reg00, (MS_S8*)("[%d] reg00"), nRegWriteCount++, (MS_S8*)("frame start"));
1273*53ee8cc1Swenshuai.xi mfe_reg->reg_mfe_g_frame_start_sw = 0; // HW is write-one-clear
1274*53ee8cc1Swenshuai.xi
1275*53ee8cc1Swenshuai.xi
1276*53ee8cc1Swenshuai.xi nRegFDCCount = PutFDC(mfe_reg, pContext, 0);
1277*53ee8cc1Swenshuai.xi nRegWriteCount += nRegFDCCount;
1278*53ee8cc1Swenshuai.xi
1279*53ee8cc1Swenshuai.xi #if defined(TEST_STOPANDGO) || defined(TEST_STOPANDDROP)
1280*53ee8cc1Swenshuai.xi if (nFrmNum==STOP_FRAME)
1281*53ee8cc1Swenshuai.xi TestStop();
1282*53ee8cc1Swenshuai.xi #endif
1283*53ee8cc1Swenshuai.xi
1284*53ee8cc1Swenshuai.xi if(nRegFDCCount != nTarFDCCount) {
1285*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L3, "nRegFDCCount = %d, nTarFDCCount = %d\n", (int)nRegFDCCount, (int)nTarFDCCount);
1286*53ee8cc1Swenshuai.xi }
1287*53ee8cc1Swenshuai.xi if(nRegWriteCount != nTarWriteCount) {
1288*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L3, "nRegWriteCount = %d, nTarWriteCount = %d\n", (int)nRegWriteCount, (int)nTarWriteCount);
1289*53ee8cc1Swenshuai.xi }
1290*53ee8cc1Swenshuai.xi // Only for debug
1291*53ee8cc1Swenshuai.xi //MS_ASSERT(nRegFDCCount==nTarFDCCount);
1292*53ee8cc1Swenshuai.xi //MS_ASSERT(nRegWriteCount==nTarWriteCount);
1293*53ee8cc1Swenshuai.xi }
1294*53ee8cc1Swenshuai.xi
1295*53ee8cc1Swenshuai.xi
1296