From 3da2c170923609a3345fd00e375b367ad96df223 Mon Sep 17 00:00:00 2001 From: Dong Yu Date: Mon, 5 Aug 2024 17:30:21 +0800 Subject: [PATCH] optimize pts usage for player Signed-off-by: Dong Yu --- .../histreamer/player/hiplayer_impl.cpp | 33 +++++++++++++++++-- .../engine/histreamer/player/hiplayer_impl.h | 2 ++ .../engine/histreamer/player/seek_agent.cpp | 10 +++--- .../engine/histreamer/player/seek_agent.h | 5 +-- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/services/engine/histreamer/player/hiplayer_impl.cpp b/services/engine/histreamer/player/hiplayer_impl.cpp index 0124d4691..2d1b9e37f 100755 --- a/services/engine/histreamer/player/hiplayer_impl.cpp +++ b/services/engine/histreamer/player/hiplayer_impl.cpp @@ -471,9 +471,35 @@ void HiPlayerImpl::UpdatePlayerStateAndNotify() NotifyResolutionChange(); NotifyPositionUpdate(); DoInitializeForHttp(); + UpdateMediaFirstPts(); OnStateChanged(PlayerStateId::READY); } +void HiPlayerImpl::UpdateMediaFirstPts() +{ + FALSE_RETURN(syncManager_ != nullptr); + std::string mime; + std::vector> metaInfo = demuxer_->GetStreamMetaInfo(); + int64_t startTime = 0; + for (const auto& trackInfo : metaInfo) { + if (trackInfo == nullptr || !(trackInfo->GetData(Tag::MIME_TYPE, mime))) { + MEDIA_LOG_W("TrackInfo is null or get mime fail"); + continue; + } + if (!(mime.find("audio/") == 0 || mime.find("video/") == 0)) { + MEDIA_LOG_W("Not audio or video track"); + continue; + } + if (trackInfo->GetData(Tag::MEDIA_START_TIME, startTime)) { + syncManager_->SetMediaStartPts(Plugins::HstTime2Us(startTime)); + } + } + startTime = syncManager_->GetMediaStartPts(); + if (startTime != HST_TIME_NONE) { + mediaStartPts_ = startTime; + } +} + bool HiPlayerImpl::BreakIfInterruptted() { if (isInterruptNeeded_.load()) { @@ -760,7 +786,10 @@ int32_t HiPlayerImpl::Reset() } singleLoop_ = false; auto ret = Stop(); - syncManager_->Reset(); + if (syncManager_ != nullptr) { + syncManager_->ResetMediaStartPts(); + syncManager_->Reset(); + } OnStateChanged(PlayerStateId::STOPPED); return ret; } @@ -927,7 +956,7 @@ Status HiPlayerImpl::doSeek(int64_t seekPos, PlayerSeekMode mode) if (videoDecoder_ != nullptr) { videoDecoder_->SetSeekTime(seekTimeUs); } - seekAgent_ = std::make_shared(demuxer_); + seekAgent_ = std::make_shared(demuxer_, mediaStartPts_); SetFrameRateForSeekPerformance(FRAME_RATE_FOR_SEEK_PERFORMANCE); auto res = seekAgent_->Seek(seekPos); SetFrameRateForSeekPerformance(FRAME_RATE_DEFAULT); diff --git a/services/engine/histreamer/player/hiplayer_impl.h b/services/engine/histreamer/player/hiplayer_impl.h index 0aabad97e..247b422bf 100755 --- a/services/engine/histreamer/player/hiplayer_impl.h +++ b/services/engine/histreamer/player/hiplayer_impl.h @@ -205,6 +205,7 @@ private: void UpdatePlayStatistics(); void DoSetMediaSource(Status& ret); void UpdatePlayerStateAndNotify(); + void UpdateMediaFirstPts(); void UpdateMaxSeekLatency(PlayerSeekMode mode, int64_t seekStartTime); #ifdef SUPPORT_VIDEO Status LinkVideoDecoderFilter(const std::shared_ptr& preFilter, StreamType type); @@ -272,6 +273,7 @@ private: std::string subUrl_; bool hasExtSub_ {false}; std::atomic durationMs_{-1}; + int64_t mediaStartPts_{0}; std::shared_ptr dataSrc_{nullptr}; std::atomic videoWidth_{0}; std::atomic videoHeight_{0}; diff --git a/services/engine/histreamer/player/seek_agent.cpp b/services/engine/histreamer/player/seek_agent.cpp index d7aa5135c..4611b43b1 100644 --- a/services/engine/histreamer/player/seek_agent.cpp +++ b/services/engine/histreamer/player/seek_agent.cpp @@ -59,9 +59,9 @@ void VideoBufferFilledListener::OnBufferFilled(std::shared_ptr& buffer } } -SeekAgent::SeekAgent(std::shared_ptr demuxer) +SeekAgent::SeekAgent(std::shared_ptr demuxer, int64_t startPts) : demuxer_(demuxer), isAudioTargetArrived_(true), isVideoTargetArrived_(true), - seekTargetPos_(-1), isSeeking_(false) + seekTargetPts_(-1), mediaStartPts_(startPts), isSeeking_(false) { MEDIA_LOG_I("SeekAgent ctor called."); } @@ -75,7 +75,7 @@ Status SeekAgent::Seek(int64_t seekPos) { MEDIA_LOG_I("Seek start, seekPos: %{public}" PRId64, seekPos); FALSE_RETURN_V_MSG_E(demuxer_ != nullptr, Status::ERROR_INVALID_PARAMETER, "Invalid demuxer filter instance."); - seekTargetPos_ = seekPos; + seekTargetPts_ = seekPos * MS_TO_US + mediaStartPts_; int64_t realSeekTime = seekPos; auto st = demuxer_->SeekTo(seekPos, Plugins::SeekMode::SEEK_CLOSEST_INNER, realSeekTime); FALSE_RETURN_V_MSG_E(st == Status::OK, Status::ERROR_INVALID_OPERATION, "Seekto error."); @@ -191,7 +191,7 @@ Status SeekAgent::OnAudioBufferFilled(std::shared_ptr& buffer, sptr producer, int32_t trackId) { MEDIA_LOG_D("OnAudioBufferFilled, pts: %{public}" PRId64, buffer->pts_); - if (buffer->pts_ >= seekTargetPos_ * MS_TO_US || (buffer->flag_ & (uint32_t)(AVBufferFlag::EOS))) { + if (buffer->pts_ >= seekTargetPts_ || (buffer->flag_ & (uint32_t)(AVBufferFlag::EOS))) { { AutoLock lock(targetArrivedLock_); isAudioTargetArrived_ = true; @@ -212,7 +212,7 @@ Status SeekAgent::OnVideoBufferFilled(std::shared_ptr& buffer, sptr producer, int32_t trackId) { MEDIA_LOG_I("OnVideoBufferFilled, pts: %{public}" PRId64, buffer->pts_); - if (buffer->pts_ >= seekTargetPos_ * MS_TO_US || (buffer->flag_ & (uint32_t)(AVBufferFlag::EOS))) { + if (buffer->pts_ >= seekTargetPts_ || (buffer->flag_ & (uint32_t)(AVBufferFlag::EOS))) { { AutoLock lock(targetArrivedLock_); isVideoTargetArrived_ = true; diff --git a/services/engine/histreamer/player/seek_agent.h b/services/engine/histreamer/player/seek_agent.h index 4efff5ff6..0a1ccdebe 100644 --- a/services/engine/histreamer/player/seek_agent.h +++ b/services/engine/histreamer/player/seek_agent.h @@ -31,7 +31,7 @@ class HiPlayerImpl; class SeekAgent : public std::enable_shared_from_this { public: - explicit SeekAgent(std::shared_ptr demuxer); + explicit SeekAgent(std::shared_ptr demuxer, int64_t startPts = 0); ~SeekAgent(); Status Seek(int64_t seekPos); @@ -51,7 +51,8 @@ private: bool isAudioTargetArrived_{true}; bool isVideoTargetArrived_{true}; - int64_t seekTargetPos_{-1}; + int64_t seekTargetPts_{-1}; + int64_t mediaStartPts_{0}; std::atomic isSeeking_{false}; std::map> producerMap_; std::map> listenerMap_; -- Gitee