diff --git a/mcfw/interfaces/link_api/avsync_internal.h b/mcfw/interfaces/link_api/avsync_internal.h index a6933a3..ba4bec9 100755 --- a/mcfw/interfaces/link_api/avsync_internal.h +++ b/mcfw/interfaces/link_api/avsync_internal.h @@ -112,8 +112,10 @@ typedef struct Avsync_PlayerTimeObj typedef struct Avsync_WallTimerObj { UInt64 curWallTime; + UInt64 nextWallTime; UInt32 lastSTC; UInt32 rollOverCount; + UInt32 updateWallTimeFlag; } Avsync_WallTimerObj; typedef struct Avsync_SimpleMovingAvgObj diff --git a/mcfw/src_bios6/links_m3vpss/avsync/avsync_m3vpss.c b/mcfw/src_bios6/links_m3vpss/avsync/avsync_m3vpss.c index d8f1426..1bf2986 100755 --- a/mcfw/src_bios6/links_m3vpss/avsync/avsync_m3vpss.c +++ b/mcfw/src_bios6/links_m3vpss/avsync/avsync_m3vpss.c @@ -70,6 +70,13 @@ static Void avsync_update_wall_timer(UArg arg) Avsync_WallTimerObj *pWallTimerObj = (Avsync_WallTimerObj *)arg; UInt32 curSTC = AVSYNC_GET_HW_TIME(); + if (pWallTimerObj->updateWallTimeFlag) + { + AVSYNC_CRITICAL_BEGIN(); + pWallTimerObj->curWallTime = pWallTimerObj->nextWallTime; + pWallTimerObj->updateWallTimeFlag = FALSE; + AVSYNC_CRITICAL_END(); + } if (curSTC < pWallTimerObj->lastSTC) { diff --git a/mcfw/src_linux/links/avsync/avsync.c b/mcfw/src_linux/links/avsync/avsync.c index 3e2da06..94d0b35 100755 --- a/mcfw/src_linux/links/avsync/avsync.c +++ b/mcfw/src_linux/links/avsync/avsync.c @@ -1806,7 +1806,12 @@ Int32 Avsync_setWallTimeBase(UInt64 wallTimeBase) } else { + pObj->wallTimeBase = wallTimeBase; + AVSYNC_CRITICAL_BEGIN(); + pObj->srObj->wallTimer.nextWallTime = wallTimeBase; + pObj->srObj->wallTimer.updateWallTimeFlag = TRUE; status = AVSYNC_E_INVALIDPARAMS; + AVSYNC_CRITICAL_END(); } return status; }