diff --git a/services/engine/histreamer/player/hiplayer_impl.cpp b/services/engine/histreamer/player/hiplayer_impl.cpp index f43647906835fce27684f2b404ea173e5a4b70ff..bd62def43ff80cdd2b3f260223bfe43e52809e40 100644 --- a/services/engine/histreamer/player/hiplayer_impl.cpp +++ b/services/engine/histreamer/player/hiplayer_impl.cpp @@ -2524,31 +2524,29 @@ void HiPlayerImpl::NotifyCachedDuration(int32_t param) callbackLooper_.OnInfo(INFO_TYPE_BUFFERING_UPDATE, param, format); } -void HiPlayerImpl::HandleEosFlagState(const Event& event) +bool HiPlayerImpl::HandleEosFlagState(const Event& event) { + bool isAllEos = true; for (std::pair& item: completeState_) { if (item.first == event.srcFilter) { MEDIA_LOG_I("one eos event received " PUBLIC_LOG_S, item.first.c_str()); item.second = true; + if (item.first == "AudioSink" && videoDecoder_) { + videoDecoder_->NotifyAudioComplete(); + } + } else if (!item.second) { + MEDIA_LOG_I("expect receive eos event " PUBLIC_LOG_S, item.first.c_str()); + isAllEos = false; } } + return isAllEos; } void HiPlayerImpl::HandleCompleteEvent(const Event& event) { MEDIA_LOG_D_SHORT("HandleCompleteEvent"); AutoLock lock(handleCompleteMutex_); - if (curState_ == PlayerStateId::STOPPED) { - MEDIA_LOG_I("The Complete Task don't run, current status is Stopped."); - return; - } - HandleEosFlagState(event); - for (auto item : completeState_) { - if (item.second == false) { - MEDIA_LOG_I("expect receive eos event " PUBLIC_LOG_S, item.first.c_str()); - return; - } - } + FALSE_RETURN_NOLOG(curState_ != PlayerStateId::STOPPED && HandleEosFlagState(event)); MEDIA_LOG_I("OnComplete looping: " PUBLIC_LOG_D32 ".", singleLoop_.load()); isStreaming_ = false; Format format; diff --git a/services/engine/histreamer/player/hiplayer_impl.h b/services/engine/histreamer/player/hiplayer_impl.h index 523d268f074c8ba2e7ec6035609adf2f6d383866..150d835a3dd70cc05672217bb8e917251cdd4812 100755 --- a/services/engine/histreamer/player/hiplayer_impl.h +++ b/services/engine/histreamer/player/hiplayer_impl.h @@ -278,7 +278,7 @@ private: void FlushVideoEOS(); int32_t InnerSelectTrack(std::string mime, int32_t trackId, PlayerSwitchMode mode); bool NeedSeekClosest(); - void HandleEosFlagState(const Event& event); + bool HandleEosFlagState(const Event& event); int32_t GetSarVideoWidth(std::shared_ptr trackInfo); int32_t GetSarVideoHeight(std::shared_ptr trackInfo); int32_t HandleEosPlay() override;