videosync: support omx_version 3 [2/2]
authorjintao xu <jintao.xu@amlogic.com>
Fri, 24 May 2019 09:38:42 +0000 (17:38 +0800)
committerNick Xie <nick@khadas.com>
Mon, 5 Aug 2019 06:37:14 +0000 (14:37 +0800)
PD#OTT-4036

Problem:
1.Pip path seek block.
1.playback blaock

Solution:
1.videosync support omx_version 3.
2.add pts discontinue set

Verify:
Verify on franklin.

Change-Id: I67d23a8878b1493fceb8e4f0b27598413af96e1f
Signed-off-by: jintao xu <jintao.xu@amlogic.com>
drivers/amlogic/media/video_processor/videosync/videosync.c
drivers/amlogic/media/video_processor/videosync/videosync.h

index f2eb0fe..93656e9 100644 (file)
@@ -36,7 +36,7 @@ static int enable_video_discontinue_report = 1;
 static u32 system_time_scale_base = 1;
 static s32 system_time_inc_adj;/*?*/
 static u32 vsync_pts_inc;/*?*/
-static u32 omx_version = 2;
+static u32 omx_version = 3;
 static u32 vp_debug_flag;
 static bool no_render;/* default: false */
 static bool async_mode;/* default: false */
@@ -62,6 +62,8 @@ static int omx_pts_interval_lower = -5500;
 #define PRINT_OTHER                    0X0004
 
 static struct videosync_dev *vp_dev;
+static uint show_first_frame_nosync;
+static u32 cur_omx_index;
 
 static int vp_print(char *name, int debug_flag, const char *fmt, ...)
 {
@@ -92,7 +94,7 @@ static void ts_pcrscr_set(struct videosync_s *dev_s, u32 pts)
 {
        dev_s->system_time = pts;
        vp_print(dev_s->vf_receiver_name, PRINT_TIMESTAMP,
-                       "ts_pcrscr_set sys_time %d\n", dev_s->system_time);
+                       "ts_pcrscr_set sys_time %u\n", dev_s->system_time);
 }
 
 static void ts_pcrscr_enable(struct videosync_s *dev_s, u32 enable)
@@ -136,7 +138,7 @@ void videosync_pcrscr_update(s32 inc, u32 base)
                                                -= system_time_scale_base;
                                }
                                vp_print(dev_s->vf_receiver_name, PRINT_OTHER,
-                               "update sys_time %d, system_time_scale_base %d, inc %d\n",
+                               "update sys_time %u, system_time_scale_base %d, inc %d\n",
                                dev_s->system_time,
                                system_time_scale_base,
                                inc);
@@ -150,7 +152,7 @@ void videosync_pcrscr_update(s32 inc, u32 base)
                                || (diff - omx_pts_interval_lower) < 0) {
                                vp_print(dev_s->vf_receiver_name,
                                        PRINT_TIMESTAMP,
-                                       "sys_time=%d, omx_pts=%d, diff=%d\n",
+                                       "sys_time=%u, omx_pts=%u, diff=%d\n",
                                        dev_s->system_time,
                                        current_omx_pts,
                                        diff);
@@ -316,9 +318,9 @@ static ssize_t dump_pts_show(struct class *class,
                        ret += sprintf(buf + ret,
                                           "%s:  ", dev_s->vf_receiver_name);
                        ret += sprintf(buf + ret,
-                                          "omx_pts=%d, ", dev_s->omx_pts);
+                                          "omx_pts=%u, ", dev_s->omx_pts);
                        ret += sprintf(buf + ret,
-                                       "system_time=%d\n", dev_s->system_time);
+                                       "system_time=%u\n", dev_s->system_time);
                }
        }
        return ret;
@@ -518,16 +520,35 @@ static int set_omx_pts(u32 *p)
        u32 set_from_hwc = p[2];
        u32 frame_num = p[3];
        u32 not_reset = p[4];
+       u32 session = p[5];
        u32 dev_id = p[6];
 
+       cur_omx_index = frame_num;
+
        if (dev_id < VIDEOSYNC_S_COUNT)
                dev_s = &vp_dev->video_prov[dev_id];
 
        if (dev_s != NULL && dev_s->mapped) {
                mutex_lock(&dev_s->omx_mutex);
                vp_print(dev_s->vf_receiver_name, PRINT_TIMESTAMP,
-                       "set omx_pts %d, hwc %d, not_reset %d, frame_num\n",
+                       "set omx_pts %u, hwc %d, not_reset %d, frame_num=%u\n",
                        tmp_pts, set_from_hwc, not_reset, frame_num);
+
+               if (dev_s->omx_check_previous_session) {
+                       if (session != dev_s->omx_cur_session) {
+                               dev_s->omx_cur_session = session;
+                               dev_s->omx_check_previous_session = false;
+                       } else {
+                               pr_info("videosync: tmp_pts %d, session=0x%x\n",
+                                       tmp_pts, dev_s->omx_cur_session);
+                               mutex_unlock(&dev_s->omx_mutex);
+                               return ret;
+                       }
+               }
+
+               if (dev_s->omx_pts_set_index < frame_num)
+                       dev_s->omx_pts_set_index = frame_num;
+
                if (not_reset == 0)
                        dev_s->omx_pts = tmp_pts;
 
@@ -670,6 +691,23 @@ static long videosync_ioctl(struct file *file,
                put_user(omx_version, (u32 __user *)argp);
                pr_info("get omx_version %d\n", omx_version);
        break;
+       case VIDEOSYNC_IOC_SET_FIRST_FRAME_NOSYNC: {
+               u32 info[5];
+               struct videosync_s *dev_s = NULL;
+               u32 dev_id;
+
+               if (copy_from_user(info, argp, sizeof(info)) == 0) {
+                       dev_id = info[0];
+                       if (dev_id < VIDEOSYNC_S_COUNT)
+                               dev_s = &vp_dev->video_prov[dev_id];
+
+                       if (dev_s != NULL && dev_s->mapped)
+                               dev_s->show_first_frame_nosync = info[1];
+                       pr_info("show_first_frame_nosync =%d\n",
+                               dev_s->show_first_frame_nosync);
+               }
+       }
+       break;
        default:
                pr_info("ioctl invalid cmd 0x%x\n", cmd);
                return -EINVAL;
@@ -737,14 +775,19 @@ static inline bool omx_vpts_expire(struct vframe_s *cur_vf,
        if (next_vf->duration == 0)
                return true;
 
+       if (dev_s->show_first_frame_nosync
+               || show_first_frame_nosync) {
+               if (next_vf->omx_index == 0)
+                       return true;
+       }
        systime = ts_pcrscr_get(dev_s);
 
        if (no_render)
                dev_s->first_frame_toggled = 1; /*just for debug, not render*/
 
        vp_print(dev_s->vf_receiver_name, PRINT_TIMESTAMP,
-               "sys_time=%d, vf->pts=%d, diff=%d\n",
-               systime, pts, (int)(systime - pts));
+               "sys_time=%u, vf->pts=%u, diff=%d, index=%d\n",
+               systime, pts, (int)(systime - pts), next_vf->omx_index);
 
        if (0) {
                pts =
@@ -760,9 +803,17 @@ static inline bool omx_vpts_expire(struct vframe_s *cur_vf,
                 || tsync_vpts_discontinuity_margin() <= 90000)) {
 
                vp_print(dev_s->vf_receiver_name, PRINT_TIMESTAMP,
-                       "discontinue, systime = %d, next_vf->pts = %d\n",
+                       "discontinue, systime = %u, next_vf->pts = %u\n",
                        systime, next_vf->pts);
                return true;
+       } else if ((dev_s->omx_pts + omx_pts_interval_upper < next_vf->pts)
+                       && (dev_s->omx_pts_set_index >= next_vf->omx_index)) {
+               pr_info("videosync, omx_pts=%d omx_pts_set_index=%d pts=%d omx_index=%d\n",
+                                       dev_s->omx_pts,
+                                       dev_s->omx_pts_set_index,
+                                       next_vf->pts,
+                                       next_vf->omx_index);
+               return true;
        }
 
        if (0/*smooth_sync_enable*/) {
@@ -829,7 +880,7 @@ void videosync_sync(struct videosync_s *dev_s)
                                ready_q_size = vfq_level(&dev_s->ready_q);
                                vp_print(dev_s->vf_receiver_name,
                                        PRINT_QUEUE_STATUS,
-                                       "add pts %d index 0x%x to ready_q, size %d\n",
+                                       "add pts %u index 0x%x to ready_q, size %d\n",
                                        vf->pts, vf->index, ready_q_size);
 
                                vf_notify_receiver(
@@ -879,7 +930,7 @@ static void prepare_queued_queue(struct videosync_dev *dev)
                                dev_s->get_frame_count++;
                                vp_print(dev_s->vf_receiver_name,
                                        PRINT_QUEUE_STATUS,
-                                       "add pts %d index 0x%x to queued_q, size %d\n",
+                                       "add pts %u index 0x%x to queued_q, size %d\n",
                                        vf->pts,
                                        vf->index,
                                        vfq_level(&dev_s->queued_q));
@@ -976,6 +1027,8 @@ static int videosync_receiver_event_fun(int type, void *data,
                //videosync_register(dev_s);
                dev_s->receiver_register = true;
                dev_s->active_state = VIDEOSYNC_ACTIVE;
+               dev_s->omx_check_previous_session = true;
+               dev_s->omx_pts_set_index = 0;
 
                spin_lock_irqsave(&dev->dev_s_num_slock, flags);
                ++dev->active_dev_s_num;
@@ -1049,6 +1102,7 @@ static int __init videosync_create_instance(int inst)
        dev_s->fd_num = 0;
        dev_s->ops = &videosync_vf_provider;
        dev_s->active_state = VIDEOSYNC_INACTIVE;
+       dev_s->omx_cur_session = 0xffffffff;
        pr_info("videosync_create_instance dev_s %p,dev_s->dev %p\n",
                dev_s, dev_s->dev);
 
@@ -1255,3 +1309,8 @@ module_param(async_mode, bool, 0664);
 MODULE_PARM_DESC(video_early_threshold, "\n video_early_threshold\n");
 module_param(video_early_threshold, uint, 0664);
 
+MODULE_PARM_DESC(cur_omx_index, "\n cur_omx_index\n");
+module_param(cur_omx_index, uint, 0664);
+
+MODULE_PARM_DESC(show_first_frame_nosync, "\n show_first_frame_nosync\n");
+module_param(show_first_frame_nosync, uint, 0664);
index 98bad9f..e36f39e 100644 (file)
@@ -71,6 +71,8 @@ extern bool omx_secret_mode;
        _IOR(VIDEOSYNC_IOC_MAGIC, 0x06, unsigned int)
 #define VIDEOSYNC_IOC_SET_OMX_ZORDER \
        _IOW(VIDEOSYNC_IOC_MAGIC, 0x07, unsigned int)
+#define VIDEOSYNC_IOC_SET_FIRST_FRAME_NOSYNC \
+       _IOR(VIDEOSYNC_IOC_MAGIC, 0x08, unsigned int)
 
 #define VIDEOSYNC_S_VF_RECEIVER_NAME_SIZE 32
 #define VIDEOSYNC_S_POOL_SIZE 16
@@ -122,6 +124,10 @@ struct videosync_s {
        u32 system_time;
        u32 system_time_scale_remainder;
        u32 omx_pts;
+       u32 omx_pts_set_index;
+       bool omx_check_previous_session;
+       u32 omx_cur_session;
+       u32 show_first_frame_nosync;
        u32 vpts_ref;
        u32 video_frame_repeat_count;
        u32 freerun_mode;