vpp: fix the vskip overflow when playing interlace video

PD#164722: vpp: fix the vskip overflow when playing interlace video

Change-Id: Id65e8c58aedf35da4762280ae19cf933f08786f9
Signed-off-by: Brian Zhu <brian.zhu@amlogic.com>
This commit is contained in:
Brian Zhu
2018-05-05 16:49:12 +08:00
committed by Yixun Lan
parent 9e0f07a639
commit 4b9e9da925
2 changed files with 30 additions and 28 deletions

View File

@@ -5091,9 +5091,7 @@ SET_FILTER:
#endif
if (platform_type == 1) {
if ((cur_frame_par->hscale_skip_count)
&& cur_dispbuf &&
(cur_dispbuf->type & VIDTYPE_VIU_FIELD)) {
if (cur_frame_par->hscale_skip_count) {
VSYNC_WR_MPEG_REG_BITS(VIU_VD1_FMT_CTRL +
cur_dev->viu_off, 1, 20, 1);
/* HFORMATTER_EN */

View File

@@ -849,7 +849,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;
u32 vskip_step;
if (get_cpu_type() >= MESON_CPU_MAJOR_ID_GXTVBB) {
if (likely(w_in >
@@ -891,8 +891,18 @@ vpp_set_filters2(u32 process_3d_type, u32 width_in,
if (vpp_flags & VPP_FLAG_INTERLACE_OUT)
height_shift++;
RESTART:
if (vpp_flags & VPP_FLAG_INTERLACE_IN)
vskip_step = 2;
#ifdef TV_3D_FUNCTION_OPEN
else if ((next_frame_par->vpp_3d_mode
== VPP_3D_MODE_LA)
&& (process_3d_type & MODE_3D_ENABLE))
vskip_step = 2;
#endif
else
vskip_step = 1;
RESTART:
aspect_factor = (vpp_flags & VPP_FLAG_AR_MASK) >> VPP_FLAG_AR_BITS;
wide_mode = vpp_flags & VPP_FLAG_WIDEMODE_MASK;
@@ -1348,14 +1358,6 @@ RESTART:
next_frame_par->VPP_hsc_endp = end;
}
next_frame_par->video_input_h = next_frame_par->VPP_vd_end_lines_ -
next_frame_par->VPP_vd_start_lines_ + 1;
next_frame_par->video_input_h = next_frame_par->video_input_h /
(next_frame_par->vscale_skip_count + 1);
next_frame_par->video_input_w = next_frame_par->VPP_hd_end_lines_ -
next_frame_par->VPP_hd_start_lines_ + 1;
next_frame_par->video_input_w = next_frame_par->video_input_w /
(next_frame_par->hscale_skip_count + 1);
if ((wide_mode == VIDEO_WIDEOPTION_NONLINEAR) && (end > start)) {
calculate_non_linear_ratio(ratio_x, end - start,
@@ -1370,9 +1372,9 @@ RESTART:
* if we need skip half resolution on source side for progressive
* frames.
*/
/* one more time to check skip for trigger h skip */
if ((next_frame_par->vscale_skip_count
< (MAX_VSKIP_COUNT + 1))
/* check vskip and hskip */
if (((next_frame_par->vscale_skip_count < MAX_VSKIP_COUNT)
|| !next_frame_par->hscale_skip_count)
&& (!(vpp_flags & VPP_FLAG_VSCALE_DISABLE))) {
int skip = vpp_process_speed_check(
(next_frame_par->VPP_hd_end_lines_ -
@@ -1390,18 +1392,11 @@ RESTART:
vf);
if (skip == SPEED_CHECK_VSKIP) {
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
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;
#endif
else
next_frame_par->vscale_skip_count++;
cur_skip_count++;
u32 next_vskip =
next_frame_par->vscale_skip_count + vskip_step;
if (next_vskip <= MAX_VSKIP_COUNT) {
next_frame_par->vscale_skip_count = next_vskip;
goto RESTART;
} else
next_frame_par->hscale_skip_count = 1;
@@ -1444,6 +1439,15 @@ RESTART:
}
}
next_frame_par->video_input_h = next_frame_par->VPP_vd_end_lines_ -
next_frame_par->VPP_vd_start_lines_ + 1;
next_frame_par->video_input_h = next_frame_par->video_input_h /
(next_frame_par->vscale_skip_count + 1);
next_frame_par->video_input_w = next_frame_par->VPP_hd_end_lines_ -
next_frame_par->VPP_hd_start_lines_ + 1;
next_frame_par->video_input_w = next_frame_par->video_input_w /
(next_frame_par->hscale_skip_count + 1);
filter->vpp_hsc_start_phase_step = ratio_x << 6;
/* coeff selection before skip and apply pre_scaler */