videosync: support omx_version 3 [2/2]

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>
This commit is contained in:
jintao xu
2019-05-24 17:38:42 +08:00
committed by Chris KIM
parent a3daae7dfa
commit 6eac4e1048
2 changed files with 77 additions and 12 deletions

View 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);

View 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;