From 8c3a2ad0158821d39041012e9eec74d10eb77d7b Mon Sep 17 00:00:00 2001 From: Rico Yang Date: Thu, 30 May 2019 15:22:45 +0800 Subject: [PATCH] common: videosink: add dropping frame mechanism in amvideo [1/1] PD#OTT-4124 Problem: video frames cannot be dropped when displayed in video layer Solution: add dropping frame mechanism in amvideo Verify: verified on franlin Change-Id: I751883543adc5c840921bd5062484e56cde2c0fa Signed-off-by: Rico Yang Conflicts: drivers/amlogic/media/video_sink/video.c --- drivers/amlogic/media/video_sink/video.c | 65 ++++++++++++++++++++++++++- drivers/amlogic/media/video_sink/video_priv.h | 2 + 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/drivers/amlogic/media/video_sink/video.c b/drivers/amlogic/media/video_sink/video.c index b2b3c24..bcd0226 100644 --- a/drivers/amlogic/media/video_sink/video.c +++ b/drivers/amlogic/media/video_sink/video.c @@ -184,6 +184,10 @@ int bit_depth_flag = 8; bool omx_secret_mode; EXPORT_SYMBOL(omx_secret_mode); +static int omx_continuous_drop_count; +static bool omx_continuous_drop_flag; +static u32 cur_disp_omx_index; +#define OMX_CONTINUOUS_DROP_LEVEL 5 #define DEBUG_FLAG_FFPLAY (1<<0) #define DEBUG_FLAG_CALC_PTS_INC (1<<1) @@ -4034,6 +4038,10 @@ static void vsync_toggle_frame(struct vframe_s *vf, int line) } } cur_dispbuf = vf; + + if (cur_dispbuf && omx_secret_mode) + cur_disp_omx_index = cur_dispbuf->omx_index; + if (cur_dispbuf && (cur_dispbuf->type & VIDTYPE_MVC)) last_mvc_status = true; else @@ -6386,6 +6394,10 @@ static irqreturn_t vsync_isr_in(int irq, void *dev_id) /*add greatest common divisor of duration*/ /*1500(60fps) 3000(30fps) 3750(24fps) for some video*/ /*that pts is not evenly*/ + if (debug_flag & DEBUG_FLAG_OMX_DEBUG_DROP_FRAME) { + pr_info("pcrscr_set sys_time=%d, omx_pts=%d, diff=%d", + system_time, omx_pts, diff); + } timestamp_pcrscr_set(omx_pts + DURATION_GCD); } else if (((diff - omx_pts_interval_upper / 2) > 0 || (diff - omx_pts_interval_lower / 2) < 0) @@ -6545,6 +6557,25 @@ static irqreturn_t vsync_isr_in(int irq, void *dev_id) judge_3d_fa_out_mode(); } while (vf) { + if (debug_flag & DEBUG_FLAG_OMX_DEBUG_DROP_FRAME) { + pr_info("next pts= %d,index %d,pcr = %d,vpts = %d\n", + vf->pts, vf->omx_index, + timestamp_pcrscr_get(), timestamp_vpts_get()); + } + if (omx_continuous_drop_flag + && !(debug_flag + & DEBUG_FLAG_OMX_DISABLE_DROP_FRAME)) { + if (debug_flag & DEBUG_FLAG_OMX_DEBUG_DROP_FRAME) { + pr_info("drop omx_index %d, pts %d\n", + vf->omx_index, vf->pts); + } + vf = vf_get(RECEIVER_NAME); + if (vf) + vf_put(vf, RECEIVER_NAME); + vf = video_vf_peek(); + continue; + } + if (vpts_expire(cur_dispbuf, vf, toggle_cnt) || show_nosync) { ATRACE_COUNTER(MODULE_NAME, __LINE__); if (debug_flag & DEBUG_FLAG_PTS_TRACE) @@ -8386,7 +8417,11 @@ static int video_receiver_event_fun(int type, void *data, void *private_data) receive_frame_count = 0; display_frame_count = 0; //init_hdr_info(); - + mutex_lock(&omx_mutex); + omx_continuous_drop_count = 0; + omx_continuous_drop_flag = false; + cur_disp_omx_index = 0; + mutex_unlock(&omx_mutex); } else if (type == VFRAME_EVENT_PROVIDER_RESET) { video_vf_light_unreg_provider(1); } else if (type == VFRAME_EVENT_PROVIDER_LIGHT_UNREG) @@ -8396,6 +8431,7 @@ static int video_receiver_event_fun(int type, void *data, void *private_data) drop_frame_count = 0; receive_frame_count = 0; display_frame_count = 0; + mutex_lock(&omx_mutex); omx_run = false; omx_pts_set_from_hwc_count = 0; omx_pts_set_from_hwc_count_begin = 0; @@ -8403,6 +8439,10 @@ static int video_receiver_event_fun(int type, void *data, void *private_data) omx_need_drop_frame_num = 0; omx_drop_done = false; omx_pts_set_index = 0; + omx_continuous_drop_count = 0; + omx_continuous_drop_flag = false; + cur_disp_omx_index = 0; + mutex_unlock(&omx_mutex); //init_hdr_info(); #ifdef CONFIG_AM_VIDEO2 @@ -8791,7 +8831,28 @@ static void set_omx_pts(u32 *p) if (debug_flag & DEBUG_FLAG_PTS_TRACE) pr_info("[set_omx_pts]tmp_pts:%d, set_from_hwc:%d,frame_num=%d, not_reset=%d\n", tmp_pts, set_from_hwc, frame_num, not_reset); - + if (set_from_hwc == 1) { + if (frame_num >= cur_disp_omx_index) { + omx_continuous_drop_flag = false; + omx_continuous_drop_count = 0; + } else { + if (omx_continuous_drop_flag + && (debug_flag + & DEBUG_FLAG_OMX_DEBUG_DROP_FRAME)) + pr_info("ignore previous rendered frame %d\n", + frame_num); + } + } else { + omx_continuous_drop_count++; + if (omx_continuous_drop_count >= OMX_CONTINUOUS_DROP_LEVEL + && !(debug_flag + & DEBUG_FLAG_OMX_DISABLE_DROP_FRAME)) { + omx_continuous_drop_flag = true; + if (debug_flag & DEBUG_FLAG_OMX_DEBUG_DROP_FRAME) + pr_info("countinous drop %d\n", + omx_continuous_drop_count); + } + } if (not_reset == 0) { time_setomxpts = sched_clock(); omx_pts = tmp_pts; diff --git a/drivers/amlogic/media/video_sink/video_priv.h b/drivers/amlogic/media/video_sink/video_priv.h index bbaa040..690d4d6 100644 --- a/drivers/amlogic/media/video_sink/video_priv.h +++ b/drivers/amlogic/media/video_sink/video_priv.h @@ -32,6 +32,8 @@ #define DEBUG_FLAG_LATENCY 0x200000 #define DEBUG_FLAG_PTS_TRACE 0x400000 #define DEBUG_FLAG_FRAME_DETECT 0x800000 +#define DEBUG_FLAG_OMX_DEBUG_DROP_FRAME 0x1000000 +#define DEBUG_FLAG_OMX_DISABLE_DROP_FRAME 0x2000000 /*for video.c's static int debug_flag;*/ -- 2.7.4