vpp: increase the vskip count to 8 for scale down
authorBrian Zhu <brian.zhu@amlogic.com>
Thu, 29 Mar 2018 10:01:20 +0000 (18:01 +0800)
committerYixun Lan <yixun.lan@amlogic.com>
Tue, 10 Apr 2018 08:54:27 +0000 (00:54 -0800)
PD#163431: vpp: increase the vskip count to 8 for scale down

Change-Id: I2022a031a95c0598ad31276e7a2aebd5ba2a977c
Signed-off-by: Brian Zhu <brian.zhu@amlogic.com>
drivers/amlogic/media/video_sink/video.c
drivers/amlogic/media/video_sink/vpp.c
include/linux/amlogic/media/video_sink/vpp.h

index 03c2ff9..44bd093 100644 (file)
@@ -2579,7 +2579,8 @@ static void viu_set_dcu(struct vpp_frame_par_s *frame_par, struct vframe_s *vf)
        u32 r;
        u32 vphase, vini_phase, vformatter;
        u32 pat, loop;
-       static const u32 vpat[] = { 0, 0x8, 0x9, 0xa, 0xb, 0xc };
+       static const u32 vpat[MAX_VSKIP_COUNT + 1] = {
+               0, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
        u32 u, v;
        u32 type = vf->type, bit_mode = 0;
        bool vf_with_el = false;
@@ -3131,7 +3132,8 @@ static void vd2_set_dcu(struct vpp_frame_par_s *frame_par, struct vframe_s *vf)
        u32 r;
        u32 vphase, vini_phase;
        u32 pat, loop;
-       static const u32 vpat[] = { 0, 0x8, 0x9, 0xa, 0xb, 0xc };
+       static const u32 vpat[MAX_VSKIP_COUNT + 1] = {
+               0, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
        u32 u, v;
        u32 type = vf->type, bit_mode = 0;
 
@@ -3432,8 +3434,8 @@ static void vd2_set_dcu(struct vpp_frame_par_s *frame_par, struct vframe_s *vf)
        if (type & VIDTYPE_VIU_FIELD) {
                loop = 0;
 
-       if (type & VIDTYPE_INTERLACE)
-               pat = vpat[frame_par->vscale_skip_count >> 1];
+               if (type & VIDTYPE_INTERLACE)
+                       pat = vpat[frame_par->vscale_skip_count >> 1];
        } else if (type & VIDTYPE_MVC) {
                loop = 0x11;
                pat = 0x80;
index 1f1c754..b45c16a 100644 (file)
@@ -841,6 +841,7 @@ vpp_set_filters2(u32 process_3d_type, u32 width_in,
        u32 orig_aspect = 0;
        u32 screen_aspect = 0;
        bool skip_policy_check = true;
+       int cur_skip_count = 0;
 
        if (get_cpu_type() >= MESON_CPU_MAJOR_ID_GXTVBB) {
                if (likely(w_in >
@@ -1352,7 +1353,9 @@ RESTART:
         * if we need skip half resolution on source side for progressive
         * frames.
         */
-       if ((next_frame_par->vscale_skip_count < 4)
+       /* one more time to check skip for trigger h skip */
+       if ((next_frame_par->vscale_skip_count
+               < (MAX_VSKIP_COUNT + 1))
                && (!(vpp_flags & VPP_FLAG_VSCALE_DISABLE))) {
                int skip = vpp_process_speed_check(
                        (next_frame_par->VPP_hd_end_lines_ -
@@ -1370,20 +1373,21 @@ RESTART:
                        vf);
 
                if (skip == SPEED_CHECK_VSKIP) {
-                       if (vpp_flags & VPP_FLAG_INTERLACE_IN)
-                               next_frame_par->vscale_skip_count += 2;
-                       else {
+                       if (cur_skip_count < MAX_VSKIP_COUNT) {
+                               if (vpp_flags & VPP_FLAG_INTERLACE_IN)
+                                       next_frame_par->vscale_skip_count += 2;
 #ifdef TV_3D_FUNCTION_OPEN
-                               if ((next_frame_par->vpp_3d_mode ==
+                               else if ((next_frame_par->vpp_3d_mode ==
                                        VPP_3D_MODE_LA)
                                        && (process_3d_type & MODE_3D_ENABLE))
                                        next_frame_par->vscale_skip_count += 2;
-                               else
 #endif
+                               else
                                        next_frame_par->vscale_skip_count++;
-                       }
-                       goto RESTART;
-
+                               cur_skip_count++;
+                               goto RESTART;
+                       } else
+                               next_frame_par->hscale_skip_count = 1;
                } else if (skip == SPEED_CHECK_HSKIP)
                        next_frame_par->hscale_skip_count = 1;
        }
index 19653df..e162ee4 100644 (file)
@@ -37,6 +37,8 @@
 #define ASPECT_4_3      ((3<<8)/4)
 #define ASPECT_16_9     ((9<<8)/16)
 
+#define MAX_VSKIP_COUNT        8
+
 #define SPEED_CHECK_DONE       0
 #define SPEED_CHECK_HSKIP      1
 #define SPEED_CHECK_VSKIP      2