avsync: support AMASTER mode

Change-Id: I3dfb6c5dbc3c3ae82100c0db103c13c4c39a001f
diff --git a/avsync-lib/src/aml_avsync.h b/avsync-lib/src/aml_avsync.h
index ad21b8f..3ae1602 100644
--- a/avsync-lib/src/aml_avsync.h
+++ b/avsync-lib/src/aml_avsync.h
@@ -16,8 +16,8 @@
 #include <time.h>
 
 enum sync_mode {
-    AV_SYNC_MODE_AMASTER = 0,
-    AV_SYNC_MODE_VMASTER = 1,
+    AV_SYNC_MODE_VMASTER = 0,
+    AV_SYNC_MODE_AMASTER = 1,
     AV_SYNC_MODE_PCR_MASTER = 2,
 };
 
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;
diff --git a/avsync-lib/src/tsync.c b/avsync-lib/src/tsync.c
index ec97b2b..6191529 100644
--- a/avsync-lib/src/tsync.c
+++ b/avsync-lib/src/tsync.c
@@ -18,6 +18,7 @@
 #include <string.h>
 #include <sys/ioctl.h>
 #include "tsync.h"
+#include "aml_avsync_log.h"
 
 #define VIDEO_DEVICE "/dev/amvideo"
 #define TSYNC_ENABLE "/sys/class/tsync/enable"
@@ -34,11 +35,11 @@
     int fd;
     fd = open(path, O_RDWR);
     if (fd < 0) {
-        printf("fail to open %s\n", path);
+        log_error("fail to open %s\n", path);
         return -1;
     }
     if (write(fd, value, strlen(value)) != strlen(value)) {
-        printf("fail to write %s to %s\n", value, path);
+        log_error("fail to write %s to %s\n", value, path);
         close(fd);
         return -1;
     }
@@ -60,11 +61,11 @@
         valstr[strlen(valstr)] = '\0';
         close(fd);
     } else {
-        printf("unable to open file %s\n", path);
+        log_error("unable to open file %s\n", path);
         return -1;
     }
     if (sscanf(valstr, "0x%x", &val) < 1) {
-        printf("unable to get pts from: %s", valstr);
+        log_error("unable to get pts from: %s", valstr);
         return -1;
     }
     *value = val;
@@ -79,6 +80,7 @@
         val = "1";
     else
         val = "0";
+    log_info("%s", val);
     return config_sys_node(TSYNC_ENABLE, val);
 }
 
@@ -97,6 +99,7 @@
     char val[50];
 
     snprintf(val, sizeof(val), "VIDEO_START:0x%x", vpts);
+    log_info("%s", val);
     return config_sys_node(TSYNC_EVENT, val);
 }
 
@@ -108,6 +111,7 @@
         val = "VIDEO_PAUSE:0x1";
     else
         val = "VIDEO_PAUSE:0x0";
+    log_info("%s", val);
     return config_sys_node(TSYNC_EVENT, val);
 }
 
@@ -116,6 +120,7 @@
     char val[50];
 
     snprintf(val, sizeof(val), "VIDEO_TSTAMP_DISCONTINUITY:0x%x", vpts);
+    log_info("%s", val);
     return config_sys_node(TSYNC_EVENT, val);
 }
 
@@ -137,7 +142,7 @@
         return -1;
     }
 
-    ioctl(video_fd, ctl, &value);
+    ioctl(video_fd, ctl, value);
 
     close(video_fd);