From a6e4d3e8299fcb8e9fb6308631caf21b3541f105 Mon Sep 17 00:00:00 2001 From: dongyu_dy Date: Thu, 25 Jul 2024 09:32:15 +0000 Subject: [PATCH] optimize progress update for seek closest Signed-off-by: dongyu_dy --- .../inner_api/native/media_sync_manager.h | 3 ++- .../modules/sink/media_sync_manager.cpp | 21 ++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/interfaces/inner_api/native/media_sync_manager.h b/interfaces/inner_api/native/media_sync_manager.h index 191e486d6..a5a3ae5dd 100644 --- a/interfaces/inner_api/native/media_sync_manager.h +++ b/interfaces/inner_api/native/media_sync_manager.h @@ -42,7 +42,7 @@ public: Status Stop(); Status Resume(); Status Pause(); - Status Seek(int64_t mediaTime); + Status Seek(int64_t mediaTime, bool isClosest = false); Status Reset() override; bool InSeeking(); std::condition_variable seekCond_; @@ -122,6 +122,7 @@ private: void SetMediaTimeStartEnd(int32_t trackId, int32_t index, int64_t val); void SetAllSyncShouldWaitNoLock(); int64_t BoundMediaProgress(int64_t newMediaProgressTime); + void UpdateFirstPtsAfterSeek(int64_t mediaTime); int64_t ClipMediaTime(int64_t inTime); OHOS::Media::Mutex clockMutex_ {}; diff --git a/services/media_engine/modules/sink/media_sync_manager.cpp b/services/media_engine/modules/sink/media_sync_manager.cpp index 92b163fc9..bd9af080e 100644 --- a/services/media_engine/modules/sink/media_sync_manager.cpp +++ b/services/media_engine/modules/sink/media_sync_manager.cpp @@ -225,7 +225,7 @@ Status MediaSyncManager::Pause() return Status::OK; } -Status MediaSyncManager::Seek(int64_t mediaTime) +Status MediaSyncManager::Seek(int64_t mediaTime, bool isClosest) { OHOS::Media::AutoLock lock(clockMutex_); if (minRangeStartOfMediaTime_ == HST_TIME_NONE || maxRangeEndOfMediaTime_ == HST_TIME_NONE) { @@ -238,7 +238,11 @@ Status MediaSyncManager::Seek(int64_t mediaTime) SetAllSyncShouldWaitNoLock(); // all suppliers should sync preroll again after seek ResetTimeAnchorNoLock(); // reset the time anchor frameAfterSeeked_ = true; - firstMediaTimeAfterSeek_ = HST_TIME_NONE; + if (isClosest) { + firstMediaTimeAfterSeek_ = mediaTime; + } else { + firstMediaTimeAfterSeek_ = HST_TIME_NONE; + } return Status::OK; } @@ -319,6 +323,17 @@ bool MediaSyncManager::IsSupplierValid(IMediaSynchronizer* supplier) return std::find(syncers_.begin(), syncers_.end(), supplier) != syncers_.end(); } +void MediaSyncManager::UpdateFirstPtsAfterSeek(int64_t mediaTime) +{ + if (firstMediaTimeAfterSeek_ == HST_TIME_NONE) { + firstMediaTimeAfterSeek_ = mediaTime; + return; + } + if (mediaTime > firstMediaTimeAfterSeek_) { + firstMediaTimeAfterSeek_ = mediaTime; + } +} + bool MediaSyncManager::UpdateTimeAnchor(int64_t clockTime, int64_t delayTime, int64_t mediaTime, int64_t mediaAbsTime, int64_t maxMediaTime, IMediaSynchronizer* supplier) { @@ -338,7 +353,7 @@ bool MediaSyncManager::UpdateTimeAnchor(int64_t clockTime, int64_t delayTime, in if (isSeeking_) { MEDIA_LOG_I_SHORT("leaving seeking_"); isSeeking_ = false; - firstMediaTimeAfterSeek_ = mediaTime; + UpdateFirstPtsAfterSeek(mediaTime); seekCond_.notify_all(); } } -- Gitee