avsync: support AMASTER mode
Change-Id: I3dfb6c5dbc3c3ae82100c0db103c13c4c39a001f
diff --git a/avsync-lib/src/avsync.c b/avsync-lib/src/avsync.c
index fd4f276..f4a25fa 100644
--- a/avsync-lib/src/avsync.c
+++ b/avsync-lib/src/avsync.c
@@ -92,7 +92,7 @@
log_error("invalid delay: %d\n", delay);
return NULL;
}
- if (vsync_interval < 750 || vsync_interval >= 3750) {
+ if (vsync_interval < 750 || vsync_interval > 3750) {
log_error("invalid vsync interval: %d", vsync_interval);
return NULL;
}
@@ -132,6 +132,9 @@
}
//TODO: connect kernel session
+ /* just in case sysnode is wrongly set */
+ tsync_send_video_pause(avsync->session_id, false);
+
pthread_mutex_init(&avsync->lock, NULL);
log_info("mode: %d start_thres: %d delay: %d interval: %d done\n",
mode, start_thres, delay, vsync_interval);
@@ -188,7 +191,10 @@
return -1;
avsync->paused = pause;
- tsync_send_video_pause(avsync->session_id, pause);
+
+ if (avsync->mode == AV_SYNC_MODE_VMASTER)
+ tsync_send_video_pause(avsync->session_id, pause);
+
log_info("paused:%d\n", pause);
return 0;
}
@@ -245,6 +251,8 @@
if (tsync_set_video_peek_mode(avsync->session_id))
log_error("set peek mode fail");
} else if (avsync->mode == AV_SYNC_MODE_AMASTER) {
+ if (tsync_set_pts_inc_mode(avsync->session_id, false))
+ log_error("set inc mode fail");
if (tsync_set_mode(avsync->session_id, AV_SYNC_MODE_AMASTER))
log_error("set amaster mode fail");
} else {
@@ -370,13 +378,9 @@
return true;
}
}
- } else {
- if (avsync->state != AV_SYNC_STAT_SYNC_SETUP)
- log_info("sync setup");
- avsync->state = AV_SYNC_STAT_SYNC_SETUP;
}
- expire = (systime >= fpts);
+ expire = (int)(systime - fpts) >= 0;
/* scatter the frame in different vsync whenever possible */
if (expire && next_frame && next_frame->pts && toggle_cnt) {
@@ -387,7 +391,8 @@
log_debug("unset expire systime:%d inter:%d next_pts:%d toggle_cnt:%d",
systime, avsync->vsync_interval, next_frame->pts, toggle_cnt);
}
- } else if (!expire && next_frame && next_frame->pts && !toggle_cnt) {
+ } else if (!expire && next_frame && next_frame->pts && !toggle_cnt
+ && avsync->first_frame_toggled) {
/* next vsync will have at least 2 frame expired */
if (systime + avsync->vsync_interval > next_frame->pts) {
expire = true;
@@ -422,6 +427,10 @@
log_info("adjust phase to %d", avsync->phase);
}
}
+
+ if (avsync->state != AV_SYNC_STAT_SYNC_SETUP)
+ log_info("sync setup");
+ avsync->state = AV_SYNC_STAT_SYNC_SETUP;
}
return expire;