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;