avsync: add timeout param. [2/3]

PD#SWPL-42732

Problem:
audio time out happen

Solution:
add timeout param.

Verify:
RDK 5.4kernel

Change-Id: I9c4f2d660a66e35a89fd8dcfee88b84b3ade9880
Signed-off-by: bo.xiao <bo.xiao@amlogic.com>
diff --git a/src/aml_avsync.h b/src/aml_avsync.h
index 36f5c5e..0eae08e 100644
--- a/src/aml_avsync.h
+++ b/src/aml_avsync.h
@@ -123,6 +123,12 @@
     int delay;
 };
 
+struct start_policy {
+    enum sync_start_policy policy;
+    /*timeout in ms */
+    int timeout;
+};
+
 /* Open a new session and create the ID
  * Params:
  *   @session_id: session ID allocated if success
@@ -195,7 +201,7 @@
  * Return:
  *   0 for OK, or error code
  */
-int avs_sync_set_start_policy(void *sync, enum sync_start_policy policy);
+int avs_sync_set_start_policy(void *sync, struct start_policy* st_policy);
 
 /* Pause/Resume AV sync module.
  * It will return last frame in @av_sync_pop_frame() in pause state
diff --git a/src/avsync.c b/src/avsync.c
index fcbed81..5c5ffbd 100644
--- a/src/avsync.c
+++ b/src/avsync.c
@@ -55,6 +55,7 @@
     enum sync_mode backup_mode;
     enum sync_type type;
     uint32_t start_policy;
+    int timeout;
 
     /* playback time, will stop increasing during pause */
     pts90K vpts;
@@ -239,6 +240,8 @@
     avsync->last_wall = -1;
     avsync->fps_interval = -1;
     avsync->last_r_syst = -1;
+    avsync->timeout = -1;
+
     if (msync_session_get_disc_thres(session_id,
                 &avsync->disc_thres_min, &avsync->disc_thres_max)) {
         log_error("fail to get disc thres", dev_name, errno);
@@ -275,7 +278,7 @@
             goto err3;
         }
         avsync->backup_mode = avsync->mode;
-        if (msync_session_get_start_policy(avsync->fd, &avsync->start_policy)) {
+        if (msync_session_get_start_policy(avsync->fd, &avsync->start_policy, &avsync->timeout)) {
             log_error("get policy");
             goto err3;
         }
@@ -393,19 +396,20 @@
     free(avsync);
 }
 
-int avs_sync_set_start_policy(void *sync, enum sync_start_policy policy)
+int avs_sync_set_start_policy(void *sync, struct start_policy* st_policy)
 {
     struct av_sync_session *avsync = (struct av_sync_session *)sync;
 
     if (!avsync || !avsync->fd)
         return -1;
 
-    log_info("[%d]policy %u --> %u", avsync->start_policy, policy);
-    avsync->start_policy = policy;
+    log_info("[%d]policy %u --> %u, timeout %d --> %d", avsync->start_policy, st_policy->policy, avsync->timeout, st_policy->timeout);
+    avsync->start_policy = st_policy->policy;
+    avsync->timeout = st_policy->timeout;
     /* v_peek will be handled by libamlavsync */
-    if (policy != AV_SYNC_START_NONE &&
-        policy != AV_SYNC_START_V_PEEK)
-        return msync_session_set_start_policy(avsync->fd, policy);
+    if (st_policy->policy != AV_SYNC_START_NONE &&
+        st_policy->policy != AV_SYNC_START_V_PEEK)
+        return msync_session_set_start_policy(avsync->fd, st_policy->policy, st_policy->timeout);
 
     return 0;
 }
@@ -471,7 +475,7 @@
 
     if (!avsync->frame_q) {
         /* policy should be final now */
-        if (msync_session_get_start_policy(avsync->fd, &avsync->start_policy)) {
+        if (msync_session_get_start_policy(avsync->fd, &avsync->start_policy, &avsync->timeout)) {
             log_error("[%d]get policy", avsync->session_id);
             return -1;
         }
diff --git a/src/msync.h b/src/msync.h
index be1fe91..4871f07 100644
--- a/src/msync.h
+++ b/src/msync.h
@@ -94,6 +94,13 @@
         uint32_t pcr_init_mode;
 };
 
+struct ker_start_policy {
+    /* start policy */
+    uint32_t policy;
+    /* in audio timeout value for no video case, in ms */
+    int timeout;
+};
+
 #define AVS_INVALID_PTS 0xFFFFFFFFUL
 
 #define AMSYNC_START_V_FIRST 0x1
@@ -110,8 +117,8 @@
 #define _A_M_SS  'S'
 #define AMSYNCS_IOC_SET_MODE		_IOW((_A_M_SS), 0x00, unsigned int)
 #define AMSYNCS_IOC_GET_MODE		_IOR((_A_M_SS), 0x01, unsigned int)
-#define AMSYNCS_IOC_SET_START_POLICY	_IOW((_A_M_SS), 0x02, unsigned int)
-#define AMSYNCS_IOC_GET_START_POLICY	_IOR((_A_M_SS), 0x03, unsigned int)
+#define AMSYNCS_IOC_SET_START_POLICY	_IOW((_A_M_SS), 0x02, struct ker_start_policy)
+#define AMSYNCS_IOC_GET_START_POLICY	_IOR((_A_M_SS), 0x03, struct ker_start_policy)
 #define AMSYNCS_IOC_SET_V_TS		_IOW((_A_M_SS), 0x04, struct pts_tri)
 #define AMSYNCS_IOC_GET_V_TS		_IOWR((_A_M_SS), 0x05, struct pts_tri)
 #define AMSYNCS_IOC_SET_A_TS		_IOW((_A_M_SS), 0x06, struct pts_tri)
diff --git a/src/msync_util.c b/src/msync_util.c
index 388fe25..428edaa 100644
--- a/src/msync_util.c
+++ b/src/msync_util.c
@@ -87,43 +87,49 @@
     return rc;
 }
 
-int msync_session_get_start_policy(int fd, uint32_t *policy)
+int msync_session_get_start_policy(int fd, uint32_t *policy, int *timeout)
 {
     int rc;
-    uint32_t kpolicy;
+    struct ker_start_policy kpolicy;
 
     rc = ioctl(fd, AMSYNCS_IOC_GET_START_POLICY, &kpolicy);
     if (rc)
         log_error("session[%d] get start policy errno:%d", fd, errno);
 
-    if (kpolicy == AMSYNC_START_V_FIRST)
+    if (kpolicy.policy == AMSYNC_START_V_FIRST)
         *policy = AV_SYNC_START_V_FIRST;
-    else if (kpolicy == AMSYNC_START_A_FIRST)
+    else if (kpolicy.policy == AMSYNC_START_A_FIRST)
         *policy = AV_SYNC_START_A_FIRST;
-    else if (kpolicy == AMSYNC_START_ASAP)
+    else if (kpolicy.policy == AMSYNC_START_ASAP)
         *policy = AV_SYNC_START_ASAP;
-    else if (kpolicy == AMSYNC_START_ALIGN)
+    else if (kpolicy.policy == AMSYNC_START_ALIGN)
         *policy = AV_SYNC_START_ALIGN;
     else
         *policy = AV_SYNC_START_NONE;
+
+    if (0 == rc)
+        *timeout = kpolicy.timeout;
+
     return rc;
 }
-int msync_session_set_start_policy(int fd, uint32_t policy)
+int msync_session_set_start_policy(int fd, uint32_t policy, int timeout)
 {
     int rc;
-    uint32_t kpolicy;
+    struct ker_start_policy kpolicy;
 
     if (policy == AV_SYNC_START_V_FIRST)
-        kpolicy = AMSYNC_START_V_FIRST;
+        kpolicy.policy = AMSYNC_START_V_FIRST;
     else if (policy == AV_SYNC_START_A_FIRST)
-        kpolicy = AMSYNC_START_A_FIRST;
+        kpolicy.policy = AMSYNC_START_A_FIRST;
     else if (policy == AV_SYNC_START_ASAP)
-        kpolicy = AMSYNC_START_ASAP;
+        kpolicy.policy = AMSYNC_START_ASAP;
     else if (policy == AV_SYNC_START_ALIGN)
-        kpolicy = AMSYNC_START_ALIGN;
+        kpolicy.policy = AMSYNC_START_ALIGN;
     else
         return -1;
 
+    kpolicy.timeout = timeout;
+
     rc = ioctl(fd, AMSYNCS_IOC_SET_START_POLICY, &kpolicy);
     if (rc)
         log_error("session[%d] set start policy errno:%d", fd, errno);
diff --git a/src/msync_util.h b/src/msync_util.h
index cb691d1..6f2bc5a 100644
--- a/src/msync_util.h
+++ b/src/msync_util.h
@@ -23,8 +23,8 @@
 
 int msync_session_set_mode(int fd, enum sync_mode mode);
 int msync_session_get_mode(int fd, enum sync_mode *mode);
-int msync_session_get_start_policy(int fd, uint32_t *policy);
-int msync_session_set_start_policy(int fd, uint32_t policy);
+int msync_session_get_start_policy(int fd, uint32_t *policy, int *timeout);
+int msync_session_set_start_policy(int fd, uint32_t policy, int timeout);
 int msync_session_set_pause(int fd, bool pause);
 int msync_session_set_video_start(int fd, pts90K pts);
 int msync_session_get_wall(int fd, uint32_t *wall, uint32_t *interval);
diff --git a/src/test.c b/src/test.c
index 3f4622e..3ccc34f 100644
--- a/src/test.c
+++ b/src/test.c
@@ -45,6 +45,7 @@
     int session, session_id;
     avs_start_ret ret;
     int adjust = 0;
+    struct start_policy st_policy;
 
     session = av_sync_open_session(&session_id);
     if (session < 0) {
@@ -60,7 +61,9 @@
 
     if (!sync) {
         /* let it timeout */
-        ret = avs_sync_set_start_policy(handle, AV_SYNC_START_ALIGN);
+        st_policy.policy = AV_SYNC_START_ALIGN;
+        st_policy.timeout = 2000;
+        ret = avs_sync_set_start_policy(handle, &st_policy);
         if (ret) {
             log_error("policy fail");
             goto exit2;