Merge "avsync: CF2 add eos flow [1/1]"
diff --git a/src/avsync.c b/src/avsync.c
index 4235bd8..c6f8ce8 100644
--- a/src/avsync.c
+++ b/src/avsync.c
@@ -510,12 +510,15 @@
 
     log_info("[%d]policy %u --> %u, timeout %d --> %d", avsync->session_id,
         avsync->start_policy, st_policy->policy, avsync->timeout, st_policy->timeout);
-    if (LIVE_MODE(avsync->mode) &&
+    if (avsync->mode == AV_SYNC_MODE_IPTV &&
         st_policy->policy != AV_SYNC_START_ASAP) {
         log_error("policy %d not supported in live mode", st_policy->policy);
         return -1;
     }
 
+    if (avsync->mode == AV_SYNC_MODE_PCR_MASTER)
+        msync_session_set_start_thres(avsync->fd, st_policy->timeout);
+
     avsync->start_policy = st_policy->policy;
     avsync->timeout = st_policy->timeout;
 
@@ -1194,7 +1197,7 @@
 {
     struct av_sync_session *avsync = (struct av_sync_session *)sync;
     uint32_t start_mode;
-    uint32_t systime;
+    uint32_t systime = 0;
     avs_start_ret ret = AV_SYNC_ASTART_ERR;
     bool create_poll_t = false;
 
@@ -1204,6 +1207,17 @@
     log_info("%d av_sync_audio_start pts(ms) %d delay %d ms",
              avsync->session_id, (int)pts/90, (int)delay/90);
 
+    if (avsync->in_audio_switch) {
+        msync_session_get_wall(avsync->fd, &systime, NULL);
+        if (systime == AV_SYNC_INVALID_PTS) {
+                log_info("%d Invalid systime could be paused pts %d ms switch_state %d again",
+                avsync->session_id, (int) pts/90, avsync->audio_switch_state);
+                avsync->audio_switch_state = AUDIO_SWITCH_STAT_RESET;
+                ret = AV_SYNC_ASTART_AGAIN;
+                goto exit;
+        }
+    }
+
     if (avsync->in_audio_switch &&
         avsync->audio_switch_state == AUDIO_SWITCH_STAT_AGAIN)
     {
@@ -1216,7 +1230,6 @@
     if (avsync->in_audio_switch &&
         (avsync->audio_switch_state == AUDIO_SWITCH_STAT_RESET ||
          avsync->audio_switch_state == AUDIO_SWITCH_STAT_AGAIN)) {
-        msync_session_get_wall(avsync->fd, &systime, NULL);
         if ((int)(systime - pts) > A_ADJ_THREDHOLD_LB
             && start_mode == AVS_START_SYNC) {
             log_info("%d audio_switch audio need drop first.ahead %d ms",
diff --git a/src/msync_util.c b/src/msync_util.c
index dbe0fe5..2721d5a 100644
--- a/src/msync_util.c
+++ b/src/msync_util.c
@@ -522,3 +522,10 @@
         log_error("session[%d] set stop audio errno:%d", fd, errno);
     return rc;
 }
+
+int msync_session_set_start_thres(int fd, uint32_t thres)
+{
+    if (set_sysfs_uint32("/sys/class/aml_msync/start_buf_thres", thres * 90))
+        return -1;
+    return 0;
+}
diff --git a/src/msync_util.h b/src/msync_util.h
index 5939b6f..5068612 100644
--- a/src/msync_util.h
+++ b/src/msync_util.h
@@ -65,4 +65,5 @@
 int msync_session_get_disc_thres(int session_id, uint32_t *min, uint32_t *max);
 int msync_session_set_disc_thres(int session_id, uint32_t min, uint32_t max);
 int msync_session_stop_audio(int fd);
+int msync_session_set_start_thres(int fd, uint32_t thres);
 #endif