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