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