From 4fbf58c98ede83ea665aedb29f65cd474fcfda6d Mon Sep 17 00:00:00 2001 From: Pengcheng Chen Date: Mon, 15 Dec 2025 08:34:48 +0000 Subject: [PATCH] vpp: used pre frame when frc phase0 and input size changed [2/2] PD#SWPL-252854 Problem: used pre frame when frc phase0 and input size changed Solution: used pre frame when frc phase0 and input size changed Verify: t6x Change-Id: I834fe123a22d589741f2e50bb15883c387bfb35d Signed-off-by: Pengcheng Chen --- drivers/media/video_sink/video_func.c | 56 +++-- drivers/media/video_sink/video_hw.c | 46 ++-- drivers/media/video_sink/video_priv.h | 1 + drivers/media/video_sink/vpp.c | 213 ++++++++++++++----- include/linux/amlogic/media/video_sink/vpp.h | 21 ++ 5 files changed, 249 insertions(+), 88 deletions(-) diff --git a/drivers/media/video_sink/video_func.c b/drivers/media/video_sink/video_func.c index 700ab97d8..06031819b 100644 --- a/drivers/media/video_sink/video_func.c +++ b/drivers/media/video_sink/video_func.c @@ -1420,16 +1420,19 @@ void set_video_zorder_ext(int layer_index, int zorder) void get_video_input_info(struct video_input_info *input_info) { - if (!cur_frame_par[0]) + struct vpp_frame_par_s *cur_frame_par; + + cur_frame_par = get_cur_frame_par(&vd_layer[0]); + if (!cur_frame_par) return; - input_info->height = cur_frame_par[0]->video_input_h; - input_info->width = cur_frame_par[0]->video_input_w; - input_info->crop_top = cur_frame_par[0]->crop_top; - input_info->crop_bottom = cur_frame_par[0]->crop_bottom; - input_info->crop_left = cur_frame_par[0]->crop_left; - input_info->crop_right = cur_frame_par[0]->crop_right; - input_info->vscale_skip_count = cur_frame_par[0]->vscale_skip_count; - input_info->hscale_skip_count = cur_frame_par[0]->hscale_skip_count; + input_info->height = cur_frame_par->video_input_h; + input_info->width = cur_frame_par->video_input_w; + input_info->crop_top = cur_frame_par->crop_top; + input_info->crop_bottom = cur_frame_par->crop_bottom; + input_info->crop_left = cur_frame_par->crop_left; + input_info->crop_right = cur_frame_par->crop_right; + input_info->vscale_skip_count = cur_frame_par->vscale_skip_count; + input_info->hscale_skip_count = cur_frame_par->hscale_skip_count; } bool is_crop_from_vf(struct vframe_s *vf) @@ -1827,7 +1830,8 @@ s32 primary_render_frame(struct video_layer_s *layer, force_setting = true; glayer_info[layer->layer_id].fgrain_force_update = false; } - frame_par = layer->cur_frame_par; + //frame_par = layer->cur_frame_par; + frame_par = get_cur_frame_par(layer); if (layer->switch_vf && layer->vf_ext) dispbuf = layer->vf_ext; else @@ -3261,14 +3265,17 @@ static int amvideo_early_proc(u8 layer_id) hdmi_in_delay_maxmin_old(vf); #if defined(CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM) - if (cur_frame_par[0] && + struct vpp_frame_par_s *cur_frame_par = NULL; + + cur_frame_par = get_cur_frame_par(&vd_layer[0]); + if (cur_frame_par && (vd1_path_id == VFM_PATH_AMVIDEO || vd1_path_id == VFM_PATH_DEF)) { /*need call every vsync*/ if (vf_tmp) - frame_lock_process(vf_tmp, cur_frame_par[0], line); + frame_lock_process(vf_tmp, cur_frame_par, line); else - frame_lock_process(NULL, cur_frame_par[0], line); + frame_lock_process(NULL, cur_frame_par, line); } #endif @@ -3722,6 +3729,7 @@ static struct vframe_s *do_renderx_toggle_frame #if defined(CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM) u16 line = glayer_info[0].layer_top; #endif + struct vpp_frame_par_s *cur_frame_par = NULL; /* video_render.x toggle frame */ if (gvideo_recv[path_index]) { @@ -3740,18 +3748,19 @@ static struct vframe_s *do_renderx_toggle_frame if (tvin_vf_is_keeped(gvideo_recv[0]->cur_buf)) new_frame_count = 0; } + cur_frame_par = get_cur_frame_par(&vd_layer[0]); #if defined(CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM) if (vd_path_id[0] == VFM_PATH_VIDEO_RENDER0 && - cur_frame_par[0]) { + cur_frame_par) { /*need call every vsync*/ if (path_new_frame) frame_lock_process(path_new_frame, - cur_frame_par[0], line); + cur_frame_par, line); else if (vd_layer[0].dispbuf) frame_lock_process(vd_layer[0].dispbuf, - cur_frame_par[0], line); + cur_frame_par, line); else - frame_lock_process(NULL, cur_frame_par[0], line); + frame_lock_process(NULL, cur_frame_par, line); } #endif } @@ -6260,12 +6269,15 @@ LATE_PROC: int get_current_frame_para(int *top, int *left, int *bottom, int *right) { - if (!cur_frame_par[0]) + struct vpp_frame_par_s *cur_frame_par; + + cur_frame_par = get_cur_frame_par(&vd_layer[0]); + if (!cur_frame_par) return -1; - *top = cur_frame_par[0]->VPP_vd_start_lines_; - *left = cur_frame_par[0]->VPP_hd_start_lines_; - *bottom = cur_frame_par[0]->VPP_vd_end_lines_; - *right = cur_frame_par[0]->VPP_hd_end_lines_; + *top = cur_frame_par->VPP_vd_start_lines_; + *left = cur_frame_par->VPP_hd_start_lines_; + *bottom = cur_frame_par->VPP_vd_end_lines_; + *right = cur_frame_par->VPP_hd_end_lines_; return 0; } diff --git a/drivers/media/video_sink/video_hw.c b/drivers/media/video_sink/video_hw.c index 3e216f821..f86b2795a 100644 --- a/drivers/media/video_sink/video_hw.c +++ b/drivers/media/video_sink/video_hw.c @@ -8517,7 +8517,8 @@ void config_dvel_position(struct video_layer_s *layer, return; bl_vf = layer->dispbuf; - cur_frame_par = layer->cur_frame_par; + //cur_frame_par = layer->cur_frame_par; + cur_frame_par = get_cur_frame_par(layer); setting->id = 1; setting->p_vd_mif_reg = &vd_layer[1].vd_mif_reg; @@ -8600,7 +8601,7 @@ void config_dvel_position(struct video_layer_s *layer, } if ((bl_vf->type & VIDTYPE_COMPRESS) && - !layer->cur_frame_par->nocomp) + !cur_frame_par->nocomp) setting->skip_afbc = false; else setting->skip_afbc = true; @@ -8650,7 +8651,8 @@ s32 config_dvel_pps(struct video_layer_s *layer, setting->support = glayer_info[1].pps_support; - setting->frame_par = layer->cur_frame_par; + //setting->frame_par = layer->cur_frame_par; + setting->frame_par = get_cur_frame_par(layer); setting->id = 1; setting->misc_reg_offt = vd_layer[1].misc_reg_offt; @@ -8673,7 +8675,8 @@ s32 config_dvel_blend(struct video_layer_s *layer, if (!layer || !layer->cur_frame_par || !setting) return -1; - setting->frame_par = layer->cur_frame_par; + //setting->frame_par = layer->cur_frame_par; + setting->frame_par = get_cur_frame_par(layer); setting->id = 1; setting->misc_reg_offt = vd_layer[1].misc_reg_offt; setting->layer_alpha = layer->layer_alpha; @@ -8715,7 +8718,8 @@ static void get_3d_horz_pos(struct video_layer_s *layer, if (!vf || !layer->cur_frame_par) return; - cur_frame_par = layer->cur_frame_par; + //cur_frame_par = layer->cur_frame_par; + cur_frame_par = get_cur_frame_par(layer); vpp_3d_mode = cur_frame_par->vpp_3d_mode; crop_sx = info->crop_left; crop_ex = info->crop_right; @@ -8777,7 +8781,8 @@ static void get_3d_vert_pos(struct video_layer_s *layer, if (!vf || !layer->cur_frame_par) return; - cur_frame_par = layer->cur_frame_par; + //cur_frame_par = layer->cur_frame_par; + cur_frame_par = get_cur_frame_par(layer); vpp_3d_mode = cur_frame_par->vpp_3d_mode; crop_sy = info->crop_top; crop_ey = info->crop_bottom; @@ -8973,7 +8978,8 @@ s32 config_3d_vd2_blend(struct video_layer_s *layer, memcpy(setting, &layer->bld_setting, sizeof(struct blend_setting_s)); setting->id = 1; - cur_frame_par = layer->cur_frame_par; + //cur_frame_par = layer->cur_frame_par; + cur_frame_par = get_cur_frame_par(layer); x_lines = layer->end_x_lines / (cur_frame_par->hscale_skip_count + 1); y_lines = layer->end_y_lines / @@ -9066,7 +9072,8 @@ void switch_3d_view_per_vsync(struct video_layer_s *layer) src_end_y_lines -= 1; misc_off = layer->misc_reg_offt; - cur_frame_par = layer->cur_frame_par; + //cur_frame_par = layer->cur_frame_par; + cur_frame_par = get_cur_frame_par(layer); if (FA_enable && toggle_3d_fa_frame == OUT_FA_A_FRAME) { if (get_cpu_type() < MESON_CPU_MAJOR_ID_SC2 && cur_dev->display_module == OLD_DISPLAY_MODULE) { @@ -9274,10 +9281,13 @@ s32 config_vd_position_internal(struct video_layer_s *layer, u32 blank; u32 start_x_lines, end_x_lines, start_y_lines, end_y_lines; int h_chrm_ratio = 1, v_chrm_ratio = 1; + struct vpp_frame_par_s *cur_frame_par; if (!layer || !layer->cur_frame_par || !layer->dispbuf || !setting) return -1; + cur_frame_par = get_cur_frame_par(layer); + if (layer->switch_vf && layer->vf_ext) dispbuf = layer->vf_ext; else @@ -9352,8 +9362,8 @@ s32 config_vd_position_internal(struct video_layer_s *layer, setting->end_x_lines = end_x_lines; setting->start_y_lines = start_y_lines; setting->end_y_lines = end_y_lines; - setting->h_skip = layer->cur_frame_par->hscale_skip_count; - setting->v_skip = layer->cur_frame_par->vscale_skip_count; + setting->h_skip = cur_frame_par->hscale_skip_count; + setting->v_skip = cur_frame_par->vscale_skip_count; /* afbc is nv12 as default */ setting->hc_skip = 2; setting->vc_skip = 2; @@ -9369,7 +9379,7 @@ s32 config_vd_position_internal(struct video_layer_s *layer, } if ((dispbuf->type & VIDTYPE_COMPRESS) && - !layer->cur_frame_par->nocomp) + !cur_frame_par->nocomp) setting->skip_afbc = false; else setting->skip_afbc = true; @@ -9442,7 +9452,7 @@ s32 config_vd_position_internal(struct video_layer_s *layer, } #endif setting->vpp_3d_mode = - layer->cur_frame_par->vpp_3d_mode; + cur_frame_par->vpp_3d_mode; return 0; } @@ -9452,7 +9462,8 @@ static void config_vd_param_internal(struct video_layer_s *layer, u32 zoom_start_y, zoom_end_y, blank = 0; struct vpp_frame_par_s *frame_par = NULL; - frame_par = layer->cur_frame_par; + //frame_par = layer->cur_frame_par; + frame_par = get_cur_frame_par(layer); /* progressive or decode interlace case height 1:1 */ /* vdin afbc and interlace case height 1:1 */ @@ -9540,7 +9551,8 @@ s32 config_vd_pps_internal(struct video_layer_s *layer, } else { setting->vsr_safa_support = glayer_info[layer->layer_id].vsr_safa_support; } - cur_frame_par = layer->cur_frame_par; + //cur_frame_par = layer->cur_frame_par; + cur_frame_par = get_cur_frame_par(layer); vpp_filter = &cur_frame_par->vpp_filter; setting->frame_par = cur_frame_par; setting->id = layer->layer_id; @@ -9733,7 +9745,8 @@ s32 config_vd_blend_mosaic(struct video_layer_s *layer, struct video_layer_s *virtual_layer; /* t6x mosaic hardware path: pps->preblend->postblend */ - cur_frame_par = layer->cur_frame_par; + //cur_frame_par = layer->cur_frame_par; + cur_frame_par = get_cur_frame_par(layer); setting->frame_par = cur_frame_par; setting->id = layer->layer_id; setting->misc_reg_offt = layer->misc_reg_offt; @@ -9788,7 +9801,8 @@ s32 config_vd_blend(struct video_layer_s *layer, dispbuf = layer->vf_ext; else dispbuf = layer->dispbuf; - cur_frame_par = layer->cur_frame_par; + //cur_frame_par = layer->cur_frame_par; + cur_frame_par = get_cur_frame_par(layer); setting->frame_par = cur_frame_par; setting->id = layer->layer_id; setting->misc_reg_offt = layer->misc_reg_offt; diff --git a/drivers/media/video_sink/video_priv.h b/drivers/media/video_sink/video_priv.h index ac1dc32a6..6bb7d7edd 100644 --- a/drivers/media/video_sink/video_priv.h +++ b/drivers/media/video_sink/video_priv.h @@ -1404,6 +1404,7 @@ void update_vd_amvecm_info(struct video_layer_s *layer); int VSYNC_WR_VIDEO_TABLE_REG_BITS(u32 adr, u32 val, u32 start, u32 len); int PRE_VSYNC_WR_VIDEO_TABLE_REG_BITS(u32 adr, u32 val, u32 start, u32 len); +struct vpp_frame_par_s *get_cur_frame_par(struct video_layer_s *layer); #ifndef CONFIG_AMLOGIC_MEDIA_FRAME_SYNC enum avevent_e { diff --git a/drivers/media/video_sink/vpp.c b/drivers/media/video_sink/vpp.c index 5d184f14a..59283bb75 100644 --- a/drivers/media/video_sink/vpp.c +++ b/drivers/media/video_sink/vpp.c @@ -41,7 +41,7 @@ #include #endif #include "../common/uvm_process/meson_uvm_nn_processor.h" - +#include #include #include "video_priv.h" #include "vpp_pq.h" @@ -2001,6 +2001,24 @@ static void format_support_adjust(struct video_layer_s *layer, next_frame_par->hscale_skip_count); } +static struct vpp_frame_par_save_s frame_par_save; + +struct vpp_frame_par_s *get_cur_frame_par(struct video_layer_s *layer) +{ +#ifdef ENABLE_DPSS_FRC + if (cur_dev->display_module == T6W_DISPLAY_MODULE && + layer->layer_id == 0 && + is_frc_link_on(layer) && + !mc_phase0_ready() && + frame_par_save.used_saved_parm) + return &frame_par_save.frame_par; + else + return layer->cur_frame_par; +#else + return layer->cur_frame_par; +#endif +} + static int vpp_set_filters_internal (struct disp_info_s *input, struct ar_frac_s *ext_ar, @@ -2010,7 +2028,7 @@ static int vpp_set_filters_internal u32 hei_out, const struct vinfo_s *vinfo, u32 vpp_flags, - struct vpp_frame_par_s *next_frame_par, struct vframe_s *vf) + struct vpp_frame_par_s *next_frame_par, struct vframe_s *vf, bool used_pre_pam) { u32 screen_width = 0, screen_height = 0; s32 start, end; @@ -2155,58 +2173,65 @@ static int vpp_set_filters_internal video_source_crop_top = 0; video_source_crop_bottom = 0; } else { - video_source_crop_left = input->crop_left; - video_source_crop_right = input->crop_right; - video_source_crop_top = input->crop_top; - video_source_crop_bottom = input->crop_bottom; + if (used_pre_pam) { + video_source_crop_top = frame_par_save.video_source_crop_top_pre; + video_source_crop_left = frame_par_save.video_source_crop_left_pre; + video_source_crop_bottom = frame_par_save.video_source_crop_bottom_pre; + video_source_crop_right = frame_par_save.video_source_crop_right_pre; + } else { + video_source_crop_left = input->crop_left; + video_source_crop_right = input->crop_right; + video_source_crop_top = input->crop_top; + video_source_crop_bottom = input->crop_bottom; - if (video_source_crop_left < 0) - video_source_crop_left = 0; - if (video_source_crop_right < 0) - video_source_crop_right = 0; - if (video_source_crop_top < 0) - video_source_crop_top = 0; - if (video_source_crop_bottom < 0) - video_source_crop_bottom = 0; + if (video_source_crop_left < 0) + video_source_crop_left = 0; + if (video_source_crop_right < 0) + video_source_crop_right = 0; + if (video_source_crop_top < 0) + video_source_crop_top = 0; + if (video_source_crop_bottom < 0) + video_source_crop_bottom = 0; - /* AFD calculation will apply all crop parameters */ - /* Only apply other crop parameters under non-AFD case */ - /* apply src crop and user crop together */ - if (!(vpp_flags & VPP_FLAG_FORCE_NO_SRC_CROP)) { - s32 src_crop_top = 0, src_crop_left = 0; - s32 src_crop_right = 0, src_crop_bottom = 0; + /* AFD calculation will apply all crop parameters */ + /* Only apply other crop parameters under non-AFD case */ + /* apply src crop and user crop together */ + if (!(vpp_flags & VPP_FLAG_FORCE_NO_SRC_CROP)) { + s32 src_crop_top = 0, src_crop_left = 0; + s32 src_crop_right = 0, src_crop_bottom = 0; - if (is_src_crop_valid(input->src_crop)) { - if (cur_super_debug) - pr_info("%s:vf src crop(%d/%d/%d/%d)\n", __func__, - vf->src_crop.top, vf->src_crop.left, - vf->src_crop.bottom, vf->src_crop.right); - if (vf->type & VIDTYPE_COMPRESS) { - src_crop_top = vf->src_crop.top; - src_crop_left = vf->src_crop.left; - src_crop_bottom = vf->src_crop.bottom; - src_crop_right = vf->src_crop.right; - } else { - src_crop_top = vf->src_crop.top; - src_crop_left = vf->src_crop.left; + if (is_src_crop_valid(input->src_crop)) { + if (cur_super_debug) + pr_info("vf src crop(%d/%d/%d/%d)\n", + vf->src_crop.top, vf->src_crop.left, + vf->src_crop.bottom, vf->src_crop.right); + if (vf->type & VIDTYPE_COMPRESS) { + src_crop_top = vf->src_crop.top; + src_crop_left = vf->src_crop.left; + src_crop_bottom = vf->src_crop.bottom; + src_crop_right = vf->src_crop.right; + } else { + src_crop_top = vf->src_crop.top; + src_crop_left = vf->src_crop.left; + } } + video_source_crop_top += src_crop_top; + video_source_crop_left += src_crop_left; + video_source_crop_bottom += src_crop_bottom; + video_source_crop_right += src_crop_right; + } + if (nr_pps_h_scaler_rate) { + video_source_crop_left = + video_source_crop_left * (nr_pps_h_scaler_rate + 1); + video_source_crop_right = + video_source_crop_right * (nr_pps_h_scaler_rate + 1); + } + if (nr_pps_v_scaler_rate) { + video_source_crop_top = + video_source_crop_top * (nr_pps_v_scaler_rate + 1); + video_source_crop_bottom = + video_source_crop_bottom * (nr_pps_v_scaler_rate + 1); } - video_source_crop_top += src_crop_top; - video_source_crop_left += src_crop_left; - video_source_crop_bottom += src_crop_bottom; - video_source_crop_right += src_crop_right; - } - if (nr_pps_h_scaler_rate) { - video_source_crop_left = - video_source_crop_left * (nr_pps_h_scaler_rate + 1); - video_source_crop_right = - video_source_crop_right * (nr_pps_h_scaler_rate + 1); - } - if (nr_pps_v_scaler_rate) { - video_source_crop_top = - video_source_crop_top * (nr_pps_v_scaler_rate + 1); - video_source_crop_bottom = - video_source_crop_bottom * (nr_pps_v_scaler_rate + 1); } if (cur_super_debug) pr_info("%s:line=%d, video_source_crop(%d/%d/%d/%d)\n", @@ -4066,6 +4091,94 @@ RESTART: pr_info("layer%d: frc,switch the display to vf_ext %p->%p\n", input->layer_id, vf, vf->vf_ext); } +#ifdef ENABLE_DPSS_FRC + if (!used_pre_pam && cur_dev->display_module == T6W_DISPLAY_MODULE && + input->layer_id == 0 && + frame_par_save.used_saved_parm) { + frame_par_save.used_saved_parm = false; + if (cur_super_debug) + pr_info("clear frame_par_save.used_saved_parm=%d\n", + frame_par_save.used_saved_parm); + } + + if (!used_pre_pam && cur_dev->display_module == T6W_DISPLAY_MODULE && + input->layer_id == 0) { + if (is_frc_link_on(&vd_layer[input->layer_id]) && + !mc_phase0_ready() && + (frame_par_save.VPP_hd_start_lines_save != + next_frame_par->VPP_hd_start_lines_ || + frame_par_save.VPP_hd_end_lines_save != + next_frame_par->VPP_hd_end_lines_ || + frame_par_save.VPP_vd_start_lines_save != + next_frame_par->VPP_vd_start_lines_ || + frame_par_save.VPP_vd_end_lines_save != + next_frame_par->VPP_vd_end_lines_)) { + if (cur_super_debug) + pr_info("used pre frame input info:pre %d,%d,%d,%d, cur:%d,%d,%d,%d, output pre:%d,%d,%d,%d, cur:%d,%d,%d,%d\n", + frame_par_save.VPP_hd_start_lines_save, + frame_par_save.VPP_hd_end_lines_save, + frame_par_save.VPP_vd_start_lines_save, + frame_par_save.VPP_vd_end_lines_save, + next_frame_par->VPP_hd_start_lines_, + next_frame_par->VPP_hd_end_lines_, + next_frame_par->VPP_vd_start_lines_, + next_frame_par->VPP_vd_end_lines_, + frame_par_save.VPP_hsc_startp_save, + frame_par_save.VPP_hsc_endp_save, + frame_par_save.VPP_vsc_startp_save, + frame_par_save.VPP_vsc_endp_save, + next_frame_par->VPP_hsc_startp, + next_frame_par->VPP_hsc_endp, + next_frame_par->VPP_vsc_startp, + next_frame_par->VPP_vsc_endp); + + //if output changed, bypass frc + if (frame_par_save.VPP_hsc_startp_save != + next_frame_par->VPP_hsc_startp || + frame_par_save.VPP_hsc_endp_save != + next_frame_par->VPP_hsc_endp || + frame_par_save.VPP_vsc_startp_save != + next_frame_par->VPP_vsc_startp || + frame_par_save.VPP_vsc_endp_save != + next_frame_par->VPP_vsc_endp) { + vd_layer[input->layer_id].frc_link_bypass_check = true; + } else { + memset(&frame_par_save.frame_par, 0, + sizeof(struct vpp_frame_par_s)); + frame_par_save.used_saved_parm = true; + //used pre video_source_crop + vpp_set_filters_internal(input, ext_ar, + frame_par_save.width_in_pre, + frame_par_save.height_in_pre, + wid_out, hei_out, vinfo, vpp_flags, + &frame_par_save.frame_par, vf, true); + } + //force update for next frame + vd_layer[input->layer_id].property_changed = true; + } + //save current + frame_par_save.VPP_hd_start_lines_save = + next_frame_par->VPP_hd_start_lines_; + frame_par_save.VPP_hd_end_lines_save = + next_frame_par->VPP_hd_end_lines_; + frame_par_save.VPP_vd_start_lines_save = + next_frame_par->VPP_vd_start_lines_; + frame_par_save.VPP_vd_end_lines_save = + next_frame_par->VPP_vd_end_lines_; + + frame_par_save.video_source_crop_left_pre = video_source_crop_left; + frame_par_save.video_source_crop_right_pre = video_source_crop_right; + frame_par_save.video_source_crop_top_pre = video_source_crop_top; + frame_par_save.video_source_crop_bottom_pre = video_source_crop_bottom; + frame_par_save.width_in_pre = width_in; + frame_par_save.height_in_pre = height_in; + + frame_par_save.VPP_hsc_startp_save = next_frame_par->VPP_hsc_startp; + frame_par_save.VPP_hsc_endp_save = next_frame_par->VPP_hsc_endp; + frame_par_save.VPP_vsc_startp_save = next_frame_par->VPP_vsc_startp; + frame_par_save.VPP_vsc_endp_save = next_frame_par->VPP_vsc_endp; + } +#endif return ret; } @@ -6794,7 +6907,7 @@ RERTY: (&local_input, &dst_ar, src_width, src_height, dst_width, dst_height, - vinfo, vpp_flags, next_frame_par, vf); + vinfo, vpp_flags, next_frame_par, vf, false); } else { if (get_pi_enabled(input->layer_id)) { dst_width = vinfo->width >> 1; diff --git a/include/linux/amlogic/media/video_sink/vpp.h b/include/linux/amlogic/media/video_sink/vpp.h index c5f52914c..fe1640926 100644 --- a/include/linux/amlogic/media/video_sink/vpp.h +++ b/include/linux/amlogic/media/video_sink/vpp.h @@ -206,6 +206,27 @@ struct vpp_frame_par_s { u32 frc_v_size; }; +struct vpp_frame_par_save_s { + struct vpp_frame_par_s frame_par; + bool used_saved_parm; + u32 width_in_pre; + u32 height_in_pre; + u32 video_source_crop_left_pre; + u32 video_source_crop_right_pre; + u32 video_source_crop_top_pre; + u32 video_source_crop_bottom_pre; + + u32 VPP_hd_start_lines_save; + u32 VPP_hd_end_lines_save; + u32 VPP_vd_start_lines_save; + u32 VPP_vd_end_lines_save; + + u32 VPP_hsc_startp_save; + u32 VPP_hsc_endp_save; + u32 VPP_vsc_startp_save; + u32 VPP_vsc_endp_save; +}; + struct disp_info_s { u8 layer_id; u8 layer_support;