diff --git a/interfaces/inner_api/native/media_sync_manager.h b/interfaces/inner_api/native/media_sync_manager.h index 84cd543a65f242b22f2653b68c35ab72256a47d7..4bede7c9591ee3a551f6469682525c076aa79634 100644 --- a/interfaces/inner_api/native/media_sync_manager.h +++ b/interfaces/inner_api/native/media_sync_manager.h @@ -99,6 +99,7 @@ public: int64_t GetSeekTime() override; void ResetTimeAnchorNoLock(); + void SetMediaStartPts(int64_t startPts) override; private: enum class State { RESUMED, @@ -150,6 +151,7 @@ private: std::vector syncers_; std::vector prerolledSyncers_; int64_t delayTime_ {HST_TIME_NONE}; + int64_t startPts_ {HST_TIME_NONE}; }; } // namespace Pipeline } // namespace Media diff --git a/services/media_engine/modules/sink/audio_sink.cpp b/services/media_engine/modules/sink/audio_sink.cpp index 9632b32f73c28614b3c7d6538c7904d0579eedac..766fdf527f4adc19a7f8557a6bd952523f420f76 100644 --- a/services/media_engine/modules/sink/audio_sink.cpp +++ b/services/media_engine/modules/sink/audio_sink.cpp @@ -58,7 +58,15 @@ Status AudioSink::Init(std::shared_ptr& meta, const std::shared_ptrPrepare(); meta->GetData(Tag::AUDIO_SAMPLE_RATE, sampleRate_); meta->GetData(Tag::AUDIO_SAMPLE_PER_FRAME, samplePerFrame_); - + int64_t startTime = 0; + if (!meta->GetData(Tag::MEDIA_START_TIME, startTime)) { + startTime = 0; + } + MEDIA_LOG_I("Get startTime from track meta, " PUBLIC_LOG_D64, startTime); + auto syncCenter = syncCenter_.lock(); + if (syncCenter) { + syncCenter->SetMediaStartPts(Plugins::HstTime2Us(startTime)); + } std::string mime; bool mimeGetRes = meta->Get(mime); if (mimeGetRes && mime == "audio/x-ape") { diff --git a/services/media_engine/modules/sink/i_media_sync_center.h b/services/media_engine/modules/sink/i_media_sync_center.h index c75546b8fe7d3536bf1b816470cf7d5861dd2ba9..718a982c59891402b74f00b8a3c0019b669af59e 100644 --- a/services/media_engine/modules/sink/i_media_sync_center.h +++ b/services/media_engine/modules/sink/i_media_sync_center.h @@ -90,6 +90,8 @@ struct IMediaSyncCenter { virtual Status SetPlaybackRate(float rate) = 0; virtual float GetPlaybackRate() = 0; + + virtual void SetMediaStartPts(int64_t startPts) = 0; }; } // namespace Pipeline } // namespace Media diff --git a/services/media_engine/modules/sink/media_sync_manager.cpp b/services/media_engine/modules/sink/media_sync_manager.cpp index 9d218e2e07c047f67cb54c36010d02b4c2ff54c1..4f64bbc24050ee80f34166a3144903a1bc96d510 100644 --- a/services/media_engine/modules/sink/media_sync_manager.cpp +++ b/services/media_engine/modules/sink/media_sync_manager.cpp @@ -376,10 +376,16 @@ int64_t MediaSyncManager::GetMediaTimeNow() if (pausedAbsMediaTime_ == HST_TIME_NONE) { return 0; } + if (startPts_ != HST_TIME_NONE) { + return pausedAbsMediaTime_ - startPts_; + } return pausedAbsMediaTime_; } MEDIA_LOG_D("GetMediaTimeNow, currentAbsMediaTime_: %{public}" PRId64 ", pausedAbsMediaTime_: %{public}" PRId64, currentAbsMediaTime_, pausedAbsMediaTime_); + if (startPts_ != HST_TIME_NONE) { + return currentAbsMediaTime_ - startPts_; + } return currentAbsMediaTime_; } @@ -451,6 +457,11 @@ bool MediaSyncManager::InSeeking() { return isSeeking_; } + +void MediaSyncManager::SetMediaStartPts(int64_t startPts) +{ + startPts_ = startPts; +} } // namespace Pipeline } // namespace Media } // namespace OHOS \ No newline at end of file