blob: d2f17ac453702794476ae474b7dea2965c30f7c9 [file] [log] [blame]
/*
* drivers/amlogic/media/deinterlace/film_mode_fmw/vof_soft_top.c
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include "film_vof_soft.h"
int cmb32_blw_wnd = 180; /*192 */
module_param(cmb32_blw_wnd, int, 0644);
MODULE_PARM_DESC(cmb32_blw_wnd, "cmb32_blw_wnd");
static int cmb32_wnd_ext = 11;
module_param(cmb32_wnd_ext, int, 0644);
MODULE_PARM_DESC(cmb32_wnd_ext, "cmb32_wnd_ext");
int cmb32_wnd_tol = 4;
module_param(cmb32_wnd_tol, int, 0644);
MODULE_PARM_DESC(cmb32_wnd_tol, "cmb32_wnd_tol");
int cmb32_frm_nocmb = 40;
module_param(cmb32_frm_nocmb, int, 0644);
MODULE_PARM_DESC(cmb32_frm_nocmb, "cmb32_frm_nocmb");
int cmb32_min02_sft = 7;
module_param(cmb32_min02_sft, int, 0644);
MODULE_PARM_DESC(cmb32_min02_sft, "cmb32_min02_sft");
int cmb32_cmb_tol = 10;
module_param(cmb32_cmb_tol, int, 0644);
MODULE_PARM_DESC(cmb32_cmb_tol, "cmb32_cmb_tol");
int cmb32_avg_dff = 48; /* if avg dif32 > dff>>4 */
module_param(cmb32_avg_dff, int, 0644);
MODULE_PARM_DESC(cmb32_avg_dff, "cmb32_avg_dff");
int cmb32_smfrm_num = 4;
module_param(cmb32_smfrm_num, int, 0644);
MODULE_PARM_DESC(cmb32_smfrm_num, "cmb32_smfrm_num");
int cmb32_nocmb_num = 20;
module_param(cmb32_nocmb_num, int, 0644);
MODULE_PARM_DESC(cmb32_nocmb_num, "cmb32_nocmb_num");
int cmb22_gcmb_rnum = 8;
module_param(cmb22_gcmb_rnum, int, 0644);
MODULE_PARM_DESC(cmb22_gcmb_rnum, "cmb22_gcmb_rnum");
int flmxx_cal_lcmb = 1;
module_param(flmxx_cal_lcmb, int, 0644);
MODULE_PARM_DESC(flmxx_cal_lcmb, "flmxx_cal_lcmb");
/* 15: 8-7 */
/* 12: 3-2-3-2-2 */
/* 10: 6-4 */
/* 10: 5-5 */
/* 10: 2-2-2-4 */
/* 10: 2-3-3-2 */
/* 10: 3-2-3-2 */
/* row * flmxx_no_cmb >> 6 */
static unsigned int flmxx_no_cmb[7] = {8, 32, 8, 8, 8, 32, 32};
static unsigned int flmxx_nn_cmb = 7;
module_param_array(flmxx_no_cmb, uint, &flmxx_nn_cmb, 0664);
/* Get 1-Row combing information, 1bit */
/* iHSCMB[9]; 9x32=288 */
static UINT8 Get1RCmb(UINT32 *iHSCMB, UINT32 iRow, int nRow)
{
UINT8 nR1 = 0;
UINT8 nBt = 0;
if (nRow > 288)
iRow >>= 1;
nR1 = ((iRow >> 5) & 0xf);/* iRow/32; 0--8 */
iHSCMB[nR1] = nR1 > 8 ? 0 : iHSCMB[nR1];
nBt = (iRow & 0x1f);/* iRow%32 */
return (iHSCMB[nR1] >> nBt) & 0x1;
}
int VOFSftTop(UINT8 *rFlmPstGCm, UINT8 *rFlmSltPre, UINT8 *rFlmPstMod,
UShort *rPstCYWnd0, UShort *rPstCYWnd1,
UShort *rPstCYWnd2, UShort *rPstCYWnd3, int nMod,
UINT32 *rROCmbInf, struct sFlmDatSt *pRDat,
struct sFlmSftPar *pPar, int nROW, int nCOL, bool reverse)
{
/* HSCMB[hist10][9(32bit)] */
static UINT32 HSCMB[HISCMBNUM][ROWCMBLEN];
/* 6-history,10-5Wnd(bgn/end) */
static int CWND[HISDETNUM][2 * VOFWNDNUM];
static UINT8 BGN;
static UINT8 frmNoCmb; /* counter from No combing */
static UINT8 CmbFlds; /* counter of combing field */
static UINT8 NumSmFd; /* counter for same field */
int mDly = pPar->mPstDlyPre;
int flm22_flag = pPar->flm22_flag;
int cmb22_nocmb_num = pPar->cmb22_nocmb_num;
int cmb32_blw_wnd_rel = cmb32_blw_wnd;
/* UINT8 *PREWV = pRDat.pFlg32; or pRDat.pFlg22 */
/* static int TCNm[HISCMBNUM]; history: the number of combing-rows */
int *TCNm = pRDat->TCNm;
static int NWND[HISDETNUM];/* 6-history,the number of combing windows */
static int WGlb[HISDETNUM]; /* Global combing */
static unsigned int pFlgXx;
static UINT8 pCmbXx[PDXX_PT_NUM];
UINT8 *pFlg32 = pRDat->pFlg32; /* [HISDETNUM]; //history information */
UINT8 *pMod32 = pRDat->pMod32; /* [HISDETNUM]; */
UINT8 *pFlg22 = pRDat->pFlg22;
UINT8 *pMod22 = pRDat->pMod22;
UINT8 *mNum32 = pRDat->mNum32;
UINT32 *DIF02 = pRDat->rROFrmDif02; /* windows */
int VOFWnd[2 * VOFWNDNUM]; /* VOF windows 5*(bgn/end) */
int nCSum = 0; /* Combine sum */
int nWCmb = 0; /* Total Window combing */
int nBCmb = 0; /* combing line of below */
UINT32 nCb32 = 0;
UINT32 nRCmbAd[ROWCMBLEN];
int nDif02Min = ((nROW * nCOL) >> cmb32_min02_sft);
int nT0 = 0;
int nT1 = 0;
int nT2 = 0;
int nT3 = 0;
pFlgXx = (((pFlgXx >> 1) << 2) |
(pRDat->pFlgXx[HISDETNUM - 2] << 1) |
(pRDat->pFlgXx[HISDETNUM - 1]));
/* for 1080i */
if (nROW > 288)
cmb32_blw_wnd_rel = 70;
/* Initialization */
if (BGN == 0) {
for (nT0 = 0; nT0 < HISCMBNUM; nT0++) {
/* (288/32) */
for (nT1 = 0; nT1 < ROWCMBLEN; nT1++) {
/* 32-bit (all 1) */
HSCMB[nT0][nT1] = 0xffffffff;
}
TCNm[nT0] = 0;
}
for (nT0 = 0; nT0 < HISDETNUM; nT0++) {
NWND[nT0] = 15;
WGlb[nT0] = 0;
for (nT1 = 0; nT1 < 2 * VOFWNDNUM; nT1++)
CWND[nT0][nT1] = 0;
}
BGN = 1;
}
for (nT0 = 1; nT0 < HISCMBNUM; nT0++) {
for (nT1 = 0; nT1 < ROWCMBLEN; nT1++)
HSCMB[nT0 - 1][nT1] = HSCMB[nT0][nT1];
TCNm[nT0 - 1] = TCNm[nT0];
}
/* static int CWND[6][10]; */
/* 6-history, 10-5Wnd(bgn/end) */
for (nT0 = 0; nT0 < HISDETNUM - 1; nT0++) {
for (nT1 = 0; nT1 < 2 * VOFWNDNUM; nT1++)
CWND[nT0][nT1] = CWND[nT0 + 1][nT1];
}
for (nT1 = 0; nT1 < 2 * VOFWNDNUM; nT1++) {
CWND[HISDETNUM - 1][nT1] = 0;/* f(t-0) vs f(t-1) */
VOFWnd[nT1] = 0; /* initialization */
}
/* nS0 = 0; */
nCSum = 0;
for (nT0 = 0; nT0 < ROWCMBLEN; nT0++) {
nCb32 = rROCmbInf[nT0];
/* Inf[0]-[31:0], First-[31], Lst-[0] */
HSCMB[HISCMBNUM - 1][nT0] = nCb32;
for (nT1 = 0; nT1 < 32; nT1++) {
nCSum += (nCb32 & 0x1);
nCb32 = nCb32 >> 1;
}
}
if (nCSum > nROW)
nCSum = nROW;
TCNm[HISCMBNUM - 1] = nCSum; /* the number of combing row */
for (nT0 = 0; nT0 < HISDETNUM-1; nT0++) {
NWND[nT0] = NWND[nT0+1];
WGlb[nT0] = WGlb[nT0+1];
}
prt_flg = ((pr_pd >> 5) & 0x1);
if (prt_flg)
sprintf(debug_str, "#CMB-Dbg\nnCSum=%03d\n", nCSum);
nT1 = 0;
if (pMod32[HISDETNUM - 1] == 3) {
if (pFlg32[HISDETNUM - 1] & 0x1)
nT1 = 1;
else
nT1 = 2;
/* TODO: Check here */
WGlb[HISDETNUM-1] = 0;
for (nT0 = 0; nT0 < ROWCMBLEN; nT0++)
nRCmbAd[nT0] = HSCMB[HISCMBNUM - nT1][nT0];
for (nT1 = nT1 + 1; nT1 <= 5; nT1++) {
if (pFlg32[HISDETNUM - nT1] & 0x1) {
for (nT0 = 0; nT0 < ROWCMBLEN; nT0++) {
nRCmbAd[nT0] =
(nRCmbAd[nT0] &
HSCMB[HISCMBNUM - nT1][nT0]);
}
}
}
if (prt_flg)
for (nT0 = 0; nT0 < ROWCMBLEN; nT0++)
sprintf(debug_str + strlen(debug_str),
"nCmd32([%d])=[%08x]\n",
nT0, nRCmbAd[nT0]);
/* return: the number of windows */
nT1 = VOFDetSub1(VOFWnd, &nCSum, 3, nRCmbAd, nROW, pPar);
nWCmb = 0;
nBCmb = 0;
for (nT0 = 0; nT0 < nT1; nT0++) {
if (VOFWnd[2*nT0] > (cmb32_blw_wnd_rel * nROW >> 8)) {
CWND[HISDETNUM-1][2*nT0] =
VOFWnd[2*nT0] - cmb32_wnd_ext;
CWND[HISDETNUM-1][2*nT0+1] =
VOFWnd[2*nT0+1] + cmb32_wnd_ext;
if (reverse) {
if (CWND[HISDETNUM-1][2*nT0+1] >=
nROW - 1)
CWND[HISDETNUM-1][2*nT0+1]
= nROW - 1;
CWND[HISDETNUM-1][2*nT0] = nROW - 1
- CWND[HISDETNUM-1][2*nT0+1];
CWND[HISDETNUM-1][2*nT0+1] = nROW
- 1 - (VOFWnd[2*nT0] - cmb32_wnd_ext);
}
nBCmb = VOFWnd[2*nT0+1]-VOFWnd[2*nT0]+1;
/* patch for MIT32Mix ending vof */
if (CWND[4][2*nT0] < CWND[5][2*nT0])
nT2 = CWND[5][2*nT0] - CWND[4][2*nT0];
else
nT2 = CWND[4][2*nT0] - CWND[5][2*nT0];
if (CWND[4][2*nT0+1] < CWND[5][2*nT0+1])
nT3 = CWND[5][2*nT0+1]
- CWND[4][2*nT0+1];
else
nT3 = CWND[4][2*nT0+1]
- CWND[5][2*nT0+1];
if ((nT2 <= cmb32_wnd_tol) &&
(nT3 <= cmb32_wnd_tol)) {
if (CWND[4][2*nT0] < CWND[5][2*nT0])
CWND[5][2*nT0] = CWND[4][2*nT0];
if (CWND[4][2*nT0+1]
> CWND[5][2*nT0+1])
CWND[5][2*nT0+1]
= CWND[4][2*nT0+1];
}
/* patch for MIT32Mix ending vof */
}
nWCmb += VOFWnd[2*nT0+1]-VOFWnd[2*nT0]+1;
if (prt_flg)
sprintf(debug_str + strlen(debug_str),
"Wnd32[%d]=[%3d~%3d]\n", nT0,
VOFWnd[2 * nT0], VOFWnd[2 * nT0 + 1]);
}
if (prt_flg)
sprintf(debug_str + strlen(debug_str),
"frmNoCm=%02d CmbFld=%02d\n",
frmNoCmb, CmbFlds);
/* VOF using last ones */
if (nBCmb == 0) {
if ((frmNoCmb > cmb32_frm_nocmb) ||
(DIF02[0] < nDif02Min))
CmbFlds = 0;
if (frmNoCmb < 255)
frmNoCmb = frmNoCmb+1;
} else {
/* noCombing => combing => noCombing */
if (frmNoCmb >= cmb32_cmb_tol)
CmbFlds = 0;
frmNoCmb = 0;
if (CmbFlds < 255)
CmbFlds = CmbFlds+1;
}
/* parameter setting */
if ((nBCmb == 0) && (frmNoCmb < cmb32_frm_nocmb) &&
(CmbFlds > (cmb32_cmb_tol >> 1)) &&
(DIF02[0] > nDif02Min))
for (nT0 = 0; nT0 < 2 * VOFWNDNUM; nT0++)
CWND[HISDETNUM-1][nT0] = CWND[HISDETNUM-2][nT0];
/* VOF using last ones */
/* patch for cadence-32 */
if ((NumSmFd > cmb32_smfrm_num) &&
(mNum32[HISDETNUM-1] > cmb32_nocmb_num)) {
for (nT0 = 0; nT0 < 2*VOFWNDNUM; nT0++)
CWND[HISDETNUM-1][nT0] = 0;
if (prt_flg)
sprintf(debug_str + strlen(debug_str),
"NumSmFd=%03d\n", NumSmFd);
}
/* patch for cadence-32 */
if (prt_flg)
sprintf(debug_str + strlen(debug_str),
"nCSum32=%03d, nWndCmb=%03d\n",
nCSum, nWCmb);
/*
* if ( nCSum > (nROW>>1) ) {
* WGlb[HISDETNUM-1] = 1;
* }
*/
/* here for vertical moving VOF */
/* HQV: Mix32- piano+vertical VOF */
/* here can be set as parameters */
if (pFlg32[HISDETNUM-1] == 5) {
/* patch for cadence-32 */
if (DIF02[0] < nDif02Min) {
if (NumSmFd < 255)
NumSmFd = NumSmFd+1;
} else
NumSmFd = 0;
/* patch for cadence-32 */
/* 256/16 = 16 */
/* 64/16 = 4 for 8-bit */
/* vertical vof copyright */
if (nWCmb < 10)
nWCmb = 10;
nT1 = (nWCmb * nCOL * cmb32_avg_dff + 8) >> 4;
if ((DIF02[0] >= nT1) && (nWCmb > nBCmb+10))
mNum32[HISDETNUM-1] = 0;
if (prt_flg)
sprintf(debug_str + strlen(debug_str),
"AvgDif=%d (%d > (%d + 10)\n",
DIF02[0]/nCOL/nWCmb, nWCmb, nBCmb);
} /* here for vertical moving VOF */
} else if ((pMod22[HISDETNUM-1] == 2) &&
(pFlg22[HISDETNUM-1] & 0x1)) {
if (flm22_flag)
nT2 = 288 - cmb22_nocmb_num;
else
nT2 = ((nROW * cmb22_gcmb_rnum + 8) >> 4);
if (nCSum > nT2)
WGlb[HISDETNUM-1] = 1; /*global combing*/
else
WGlb[HISDETNUM-1] = 0; /*global combing*/
if (prt_flg)
sprintf(debug_str + strlen(debug_str),
"WGlb22=%d\n", WGlb[HISDETNUM-1]);
for (nT0 = 0; nT0 < ROWCMBLEN; nT0++)
nRCmbAd[nT0] = HSCMB[HISCMBNUM-1][nT0];
for (nT1 = 3; nT1 <= 5; nT1 += 2)
for (nT0 = 0; nT0 < ROWCMBLEN; nT0++)
nRCmbAd[nT0] = (nRCmbAd[nT0]
& HSCMB[HISCMBNUM-nT1][nT0]);
if (prt_flg)
for (nT0 = 0; nT0 < ROWCMBLEN; nT0++)
sprintf(debug_str + strlen(debug_str),
"nCmd22([%d])=[%08x]\n",
nT0, nRCmbAd[nT0]);
/* return: the number of windows */
nT1 = VOFDetSub1(VOFWnd, &nCSum, 2, nRCmbAd, nROW, pPar);
for (nT0 = 0; nT0 < nT1; nT0++) {
CWND[HISDETNUM-1][2*nT0] = VOFWnd[2*nT0];
CWND[HISDETNUM-1][2*nT0+1] = VOFWnd[2*nT0+1];
if (reverse) {
CWND[HISDETNUM-1][2*nT0] =
nROW - 1 - VOFWnd[2*nT0+1];
CWND[HISDETNUM-1][2*nT0+1] =
nROW - 1 - VOFWnd[2*nT0];
}
if (prt_flg)
sprintf(debug_str + strlen(debug_str),
"Wnd22[%d]=[%3d~%3d]\n",
nT0, VOFWnd[2*nT0], VOFWnd[2*nT0+1]);
}
}
if (prt_flg)
pr_info("%s", debug_str);
if ((pRDat->pLvlXx[HISDETNUM - 1] > flmxx_cal_lcmb) &&
(pRDat->pModXx[HISDETNUM - 1] != 6)) {
if ((pFlgXx & 0x1) || (DIF02[0] < nDif02Min))
nT1 = 1;
else
nT1 = 2;
if (prt_flg)
sprintf(debug_str, "ModXx=%d, LvlXx=%d, FlgXx=%08x\n",
pRDat->pModXx[HISDETNUM - 1],
pRDat->pLvlXx[HISDETNUM - 1],
pFlgXx);
for (nT0 = 0; nT0 < ROWCMBLEN; nT0++)
nRCmbAd[nT0] = HSCMB[HISCMBNUM - nT1][nT0];
for (nT1 = nT1 + 1; nT1 <= 10; nT1++) {
if ((pFlgXx >> (nT1 - 1)) & 0x1) {
for (nT0 = 0; nT0 < ROWCMBLEN; nT0++) {
nRCmbAd[nT0] =
(nRCmbAd[nT0] &
HSCMB[HISCMBNUM - nT1][nT0]);
}
}
}
if (prt_flg)
for (nT0 = 0; nT0 < ROWCMBLEN; nT0++)
sprintf(debug_str + strlen(debug_str),
"nCmdXx([%d])=[%08x]\n",
nT0, nRCmbAd[nT0]);
nT0 = 4 + pRDat->pModXx[HISDETNUM - 1];
/* return: the number of windows */
nT1 = VOFDetSub1(VOFWnd, &nCSum, nT0, nRCmbAd, nROW, pPar);
nWCmb = 0;
for (nT0 = 0; nT0 < nT1; nT0++) {
CWND[HISDETNUM-1][2*nT0] = VOFWnd[2*nT0];
CWND[HISDETNUM-1][2*nT0+1] = VOFWnd[2*nT0+1];
if (reverse) {
CWND[HISDETNUM-1][2*nT0] =
nROW - 1 - VOFWnd[2*nT0+1];
CWND[HISDETNUM-1][2*nT0+1] =
nROW - 1 - VOFWnd[2*nT0];
}
if (prt_flg)
sprintf(debug_str + strlen(debug_str),
"WndXx[%d]=[%3d~%3d]\n",
nT0, VOFWnd[2*nT0], VOFWnd[2*nT0+1]);
nWCmb += VOFWnd[2*nT0+1]-VOFWnd[2*nT0]+1;
}
nT1 = pRDat->pModXx[HISDETNUM - 1];
for (nT0 = 0; nT0 < HISDETNUM; nT0++) {
if ((nT0 == nT1) &&
(nWCmb < ((flmxx_no_cmb[nT1] * nROW) >> 6)))
pCmbXx[nT0] = pCmbXx[nT0] + 1;
else
pCmbXx[nT0] = 0;
}
if (prt_flg)
sprintf(debug_str + strlen(debug_str),
"nCSum=%3d, nWCmb=%3d, pCmbXx=%d\n",
nCSum, nWCmb, pCmbXx[nT1]);
nT1 = pRDat->pLvlXx[HISDETNUM - 1] + pCmbXx[nT1];
if (nT1 > 255)
nT1 = 255;
pRDat->pLvlXx[HISDETNUM - 1] = nT1;
if (prt_flg)
pr_info("%s", debug_str);
}
prt_flg = ((pr_pd >> 1) & 0x1);
if (prt_flg)
sprintf(debug_str, "#Pre-VOF:\n");
/* film-mode: pMod22[5-mDly] or pMod32[5-mDly] */
if ((*rFlmPstMod == 1) || (*rFlmPstMod == 2)) {
/* weaver with pre-field */
if (*rFlmSltPre == 1) {
/* Interpolation method:0-mtn,1-with-buffer,2-ei,3-di */
rPstCYWnd0[0] = CWND[HISDETNUM - 1 - mDly][0];/* bgn */
rPstCYWnd0[1] = CWND[HISDETNUM - 1 - mDly][1];/* end */
rPstCYWnd0[2] = 3;/* 0-mtn,1-with-buffer,2-ei,3-di */
rPstCYWnd1[0] = CWND[HISDETNUM - 1 - mDly][2];/* bgn */
rPstCYWnd1[1] = CWND[HISDETNUM - 1 - mDly][3];/* end */
rPstCYWnd1[2] = 3;/* 0-mtn,1-with-buffer,2-ei,3-di */
rPstCYWnd2[0] = CWND[HISDETNUM - 1 - mDly][4];/* bgn */
rPstCYWnd2[1] = CWND[HISDETNUM - 1 - mDly][5];/* end */
rPstCYWnd2[2] = 3;/* 0-mtn,1-with-buffer,2-ei,3-di */
rPstCYWnd3[0] = CWND[HISDETNUM - 1 - mDly][6];/* bgn */
rPstCYWnd3[1] = CWND[HISDETNUM - 1 - mDly][7];/* end */
rPstCYWnd3[2] = 3;/* 0-mtn,1-with-buffer,2-ei,3-di */
/* pFMReg->rFlmPstGCm = WGlb[5-mDly]; */
*rFlmPstGCm = WGlb[HISDETNUM - 1 - mDly];
if (prt_flg) {
sprintf(debug_str + strlen(debug_str),
"rFlmPstGCm-5=%d\n", *rFlmPstGCm);
sprintf(debug_str + strlen(debug_str),
"pFlg32=%d, pFlg22=%d\n",
pFlg32[HISDETNUM - 1 - mDly],
pFlg22[HISDETNUM - 1 - mDly]);
}
} else {
/* weaver with nxt-field */
/* Interpolation method: 0-EI,1-MTN,2-MA,3-Weaver */
rPstCYWnd0[0] = CWND[HISDETNUM - mDly][0];/* bgn */
rPstCYWnd0[1] = CWND[HISDETNUM - mDly][1];/* end */
rPstCYWnd0[2] = 3;/* 0-mtn,1-with-buffer,2-ei,3-di */
rPstCYWnd1[0] = CWND[HISDETNUM - mDly][2];/* bgn */
rPstCYWnd1[1] = CWND[HISDETNUM - mDly][3];/* end */
rPstCYWnd1[2] = 3;/* 0-mtn,1-with-buffer,2-ei,3-di */
rPstCYWnd2[0] = CWND[HISDETNUM - mDly][4];/* bgn */
rPstCYWnd2[1] = CWND[HISDETNUM - mDly][5];/* end */
rPstCYWnd2[2] = 3;/* 0-mtn,1-with-buffer,2-ei,3-di */
rPstCYWnd3[0] = CWND[HISDETNUM - mDly][6];/* bgn */
rPstCYWnd3[1] = CWND[HISDETNUM - mDly][7];/* end */
rPstCYWnd3[2] = 3;/* 0-mtn,1-with-buffer,2-ei,3-di */
*rFlmPstGCm = WGlb[HISDETNUM - mDly];
if (prt_flg) {
sprintf(debug_str + strlen(debug_str),
"rFlmPstGCm-6=%d\n", *rFlmPstGCm);
sprintf(debug_str + strlen(debug_str),
"pFlg32=%d, pFlg22=%d\n",
pFlg32[HISDETNUM - 1 - mDly],
pFlg22[HISDETNUM - 1 - mDly]);
}
}
} else {
rPstCYWnd0[0] = 0; /* bgn */
rPstCYWnd0[1] = 0; /* end */
rPstCYWnd0[2] = 3; /* 0-mtn,1-with-buffer,2-ei,3-di */
rPstCYWnd1[0] = 0; /* bgn */
rPstCYWnd1[1] = 0; /* end */
rPstCYWnd1[2] = 3; /* 0-mtn,1-with-buffer,2-ei,3-di */
rPstCYWnd2[0] = 0; /* bgn */
rPstCYWnd2[1] = 0; /* end */
rPstCYWnd2[2] = 3; /* 0-mtn,1-with-buffer,2-ei,3-di */
rPstCYWnd3[0] = 0; /* bgn */
rPstCYWnd3[1] = 0; /* end */
rPstCYWnd3[2] = 3; /* 0-mtn,1-with-buffer,2-ei,3-di */
*rFlmPstGCm = 1;
if (prt_flg)
sprintf(debug_str + strlen(debug_str),
"rFlmPstGCm-1=%d\n", *rFlmPstGCm);
}
if (prt_flg) {
sprintf(debug_str + strlen(debug_str),
"rPstCYWnd=(%d, %d), (%d, %d), (%d, %d), (%d, %d)\n\n",
rPstCYWnd0[0], rPstCYWnd0[1],
rPstCYWnd1[0], rPstCYWnd1[1],
rPstCYWnd2[0], rPstCYWnd2[1],
rPstCYWnd3[0], rPstCYWnd3[1]);
pr_info("%s", debug_str);
}
return nCSum;
}
/* int *PREWV:5*2 */
/* nCNum: total rows of combing */
int VOFDetSub1(int *VOFWnd, int *nCNum, int nMod, UINT32 *nRCmb, int nROW,
struct sFlmSftPar *pPar)
{
int rCmbRwMinCt0 = 0; /* 8; //for film 3-2 */
int rCmbRwMinCt1 = 0; /* =7; //for film 2-2 */
/* int rCmbRwMaxStp=1; //fill in the hole */
int rCmbRwMinCt = 0;
int nCSUM = 0; /* Combing sum (nCSUM>rCmbRwMinCt0) */
int nMIN = 0;
int nT0 = 0;
int nT1 = 0;
int nT2 = 0;
int nCNM = 0;
int nBgn = 0;
int nEnd = 0;
int fEND = 0;
int pIDx[VOFWNDNUM + 1][2]; /* Maximum-5windows */
int nIDx = 0;
rCmbRwMinCt = rCmbRwMinCt1;
if (nMod == 3)
rCmbRwMinCt = rCmbRwMinCt0;
if (IS_ERR(pPar)) {
pr_err("%s:%d pPar = 0x%p.\n",
__func__, __LINE__, pPar);
return -1;
}
rCmbRwMinCt0 = pPar->rCmbRwMinCt0; /* 8; //for film 3-2 */
rCmbRwMinCt1 = pPar->rCmbRwMinCt1; /* =7; //for film 2-2 */
for (nT0 = 0; (nT0 < nROW) && (nIDx <= VOFWNDNUM); nT0++) {
fEND = 0;
nT1 = nROW - 1 - nT0;
/* if(nRCmb[nT0]==1) */
if (Get1RCmb(nRCmb, nT1, nROW)) {
nCSUM += 1; /* Total */
if (nT0 == 0)
nBgn = nT0;
else if (nT0 == nROW - 1) {
if (Get1RCmb(nRCmb, 1, nROW)) {
/* at least (2-Row combing) */
nEnd = nT0;
fEND = 1;
}
} else if (!Get1RCmb(nRCmb, nT1 + 1, nROW)) {
/* (nRCmb[nT0-1]==0) */
nBgn = nT0;
}
} else {
/* nRCmb[nT0]==0 */
if (nT0 != 0 && Get1RCmb(nRCmb, nT1 + 1, nROW)) {
nEnd = nT0; /* nT0-1 */
fEND = 1;
}
}
if (fEND == 0)
continue;
nCNM = nEnd - nBgn + 1;
if (nCNM > rCmbRwMinCt || nEnd == nROW - 1) {
if (nIDx == VOFWNDNUM) {
nMIN = nCNM;
nT2 = VOFWNDNUM;
for (nT1 = 0; nT1 < VOFWNDNUM; nT1++)
if ((pIDx[nT1][1] -
pIDx[nT1][0] + 1) < nMIN) {
nMIN = pIDx[nT1][1]
- pIDx[nT1][0] + 1;
nT2 = nT1;
}
if (nT2 != VOFWNDNUM) {
pIDx[nT2][0] = nBgn;
pIDx[nT2][1] = nEnd;
}
} else {
pIDx[nIDx][0] = nBgn;
pIDx[nIDx][1] = nEnd;
nIDx += 1;
}
}
}
*nCNum = nCSUM;
for (nT0 = 0; nT0 < nIDx; nT0++) {
VOFWnd[2 * nT0] = pIDx[nT0][0];/* nBgn */
VOFWnd[2 * nT0 + 1] = pIDx[nT0][1];/* nEnd */
}
return nIDx;
}