di: fix image jitter when play DTV 3 channels [1/1]
authorWenfeng Guo <wenfeng.guo@amlogic.com>
Wed, 22 May 2019 09:10:18 +0000 (17:10 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Wed, 29 May 2019 02:20:17 +0000 (19:20 -0700)
PD#SWPL-4508

Problem:
image jitter when play DTV 3 channels

Solution:
1.force entry pulldown22

Verify:
tl1

Change-Id: I3d15ec21458fb3a6e3ae0b59910a8f350a3b1d72
Signed-off-by: Wenfeng Guo <wenfeng.guo@amlogic.com>
drivers/amlogic/media/deinterlace/film_mode_fmw/film_fw1.c
drivers/amlogic/media/deinterlace/film_mode_fmw/film_vof_soft.h
drivers/amlogic/media/deinterlace/pulldown_drv.c

index 609d08b..e55bd20 100644 (file)
@@ -60,6 +60,7 @@ UINT8 FlmVOFSftInt(struct sFlmSftPar *pPar)
        pPar->flm22_en = 1;
        pPar->flm32_en = 1;
        pPar->flm22_flag = 1;
+       pPar->flm22_avg_flag = 0;
        pPar->flm2224_flag = 1;
        pPar->flm22_comlev = 22;
        pPar->flm22_comlev1 = 8;
@@ -262,6 +263,9 @@ int FlmVOFSftTop(UINT8 *rCmb32Spcl, unsigned short *rPstCYWnd0,
        static int comsumpre;
        static int nS1pre;
        int dif01th = 0;
+       int avg_flag = 0;
+       int flm22_min = 0;
+       int flm22_th = 0;
 
        int nDIF01[HISDIFNUM];
        int nDIF02[HISDIFNUM];
@@ -276,6 +280,7 @@ int FlmVOFSftTop(UINT8 *rCmb32Spcl, unsigned short *rPstCYWnd0,
        int flm22_flag = pPar->flm22_flag;
        int flm2224_flag = pPar->flm2224_flag;
        int flm22_comth = pPar->flm22_comth;
+       int flm22_avg_flag = pPar->flm22_avg_flag;
        int comdif = 0;
        int dif01avg = 0;
 
@@ -431,6 +436,17 @@ int FlmVOFSftTop(UINT8 *rCmb32Spcl, unsigned short *rPstCYWnd0,
        /* pFMReg->rFlmPstGCm = 0; */
        *rFlmPstGCm = 0;
        *frame_diff_avg = DIF02[HISDIFNUM-1] / (glb_frame_mot_num + 1);
+       /*-----------------*/
+       /*force entry pulldown22 to fix image jitter when play DTV*/
+       /*3 channels by vlsi-yanling*/
+       flm22_min = nDIF01[HISDIFNUM-1] > nDIF01[HISDIFNUM-2]
+               ? nDIF01[HISDIFNUM-2] : nDIF01[HISDIFNUM-1];
+       flm22_th = flm22_min/2;
+       avg_flag = abs(nDIF01[HISDIFNUM-1] - nDIF01[HISDIFNUM-2]) > flm22_th
+               ? 1:0;
+       avg_flag = (nDIF01[HISDIFNUM-1] > (1<<16) && pRDat.iHeight == 288)
+               ? avg_flag : 0;
+       /*-----------------*/
        /* rFlmPstGCm = 1; */
        if (pRDat.pMod32[HISDETNUM - 1 - mDly] == 3) {
                nT0 = pRDat.pFlg32[HISDETNUM - 1 - mDly] % 2;
@@ -462,8 +478,10 @@ int FlmVOFSftTop(UINT8 *rCmb32Spcl, unsigned short *rPstCYWnd0,
                        flm22_mim_numb = flm22_mim_smfrms;
 
                if (pr_pd)
-                       pr_info("diff02-avg=%4d\n", *frame_diff_avg);
-               if (*frame_diff_avg > flm22_frmdif_max) {
+                       pr_info("diff02-avg=%4d, flm22_min=%4d,flm22_th=%4d, avg_flag=%d\n",
+                               *frame_diff_avg, flm22_min, flm22_th, avg_flag);
+               if ((*frame_diff_avg > flm22_frmdif_max)
+                       && (avg_flag == 0 || flm22_avg_flag == 1)) {
                        ntmp = *frame_diff_avg - flm22_frmdif_max;
                        if (ntmp > flm22_minus_cntmax)
                                ntmp = flm22_minus_cntmax;
@@ -482,7 +500,8 @@ int FlmVOFSftTop(UINT8 *rCmb32Spcl, unsigned short *rPstCYWnd0,
 
                        if (pr_pd)
                                pr_info("diff01-avg=%4d\n", ntmp);
-                       if (ntmp > flm22_flddif_max) {
+                       if ((ntmp > flm22_flddif_max)
+                               && (avg_flag == 0 || flm22_avg_flag == 1)) {
                                ntmp = ntmp - flm22_flddif_max;
 
                                if (ntmp > flm22_minus_cntmax)
@@ -506,7 +525,8 @@ int FlmVOFSftTop(UINT8 *rCmb32Spcl, unsigned short *rPstCYWnd0,
                                        nS1 = 0;
                                else
                                        nS1 = nS1 - pPar->flm22_comlev;
-                       } else if (dif01avg > pPar->flm22_dif01_avgth) {
+                       } else if ((dif01avg > pPar->flm22_dif01_avgth)
+                               && (avg_flag == 0)) {
                                if (nS1 < pPar->flm22_comlev)
                                        nS1 = 0;
                                else
index 0fa9ac8..784f107 100644 (file)
@@ -120,6 +120,7 @@ struct sFlmSftPar {
        int flm22_en;
        int flm32_en;
        int flm22_flag;
+       int flm22_avg_flag;
        int flm2224_flag;
        int flm22_comlev;
        int flm22_comlev1;
index 7ab71aa..5d08f6f 100644 (file)
@@ -394,6 +394,8 @@ static struct pd_param_s pd_params[] = {
             &(pd_param.flm32_en)   },
        { "flm22_flag",
          &(pd_param.flm22_flag)    },
+       { "flm22_avg_flag",
+               &(pd_param.flm22_avg_flag)},
        { "flm2224_flag",
        &(pd_param.flm2224_flag)    },
        { "flm22_comlev",