diff --git a/interfaces/inner_api/native/audio_decoder_filter.h b/interfaces/inner_api/native/audio_decoder_filter.h index 586236d7e5c1c1b82808459db2e416517639e002..a4d9337fa60297db0c6720b3e841bb90ae179885 100644 --- a/interfaces/inner_api/native/audio_decoder_filter.h +++ b/interfaces/inner_api/native/audio_decoder_filter.h @@ -66,8 +66,6 @@ public: void OnBufferFilled(std::shared_ptr &inputBuffer); - void SeekTo(int64_t seekTimeUs, std::future &&videoSeekFuture); - protected: Status OnLinked(StreamType inType, const std::shared_ptr &meta, const std::shared_ptr &callback) override; @@ -97,12 +95,6 @@ private: int64_t latestBufferTime_{HST_TIME_NONE}; int64_t latestPausedTime_{HST_TIME_NONE}; int64_t totalPausedTime_{0}; - - std::atomic isSeek_{false}; - int64_t seekTimeUs_{HST_TIME_NONE}; - std::future videoSeekFuture_; - - bool firstFrame_{true}; }; } // namespace Pipeline } // namespace MEDIA diff --git a/interfaces/inner_api/native/decoder_surface_filter.h b/interfaces/inner_api/native/decoder_surface_filter.h index 6f46f35c11ef5f47fb3b5b99e05a9694fa473b16..fef629b9bf9f1445a444d1cf4430afcd113f864a 100644 --- a/interfaces/inner_api/native/decoder_surface_filter.h +++ b/interfaces/inner_api/native/decoder_surface_filter.h @@ -71,8 +71,6 @@ public: sptr GetInputBufferQueue(); void SetSyncCenter(std::shared_ptr syncCenter); - void SeekTo(int64_t seekTimeUs, std::promise &&videoSeekSuccess); - protected: Status OnLinked(StreamType inType, const std::shared_ptr &meta, const std::shared_ptr &callback) override; @@ -109,11 +107,7 @@ private: bool isDrmProtected_ = false; sptr keySessionServiceProxy_; bool svpFlag_ = false; - std::atomic isPaused_{false}; - std::atomic isSeek_{false}; - int64_t seekTimeUs_{HST_TIME_NONE}; - std::promise videoSeekSuccess_; }; } // namespace Pipeline } // namespace Media diff --git a/services/media_engine/filters/audio_decoder_filter.cpp b/services/media_engine/filters/audio_decoder_filter.cpp index dfcc88e955c85211a90e552d0c862e1b261cdbc4..ccf0b4b36b59bd747b15b194218e0b3027760dd5 100644 --- a/services/media_engine/filters/audio_decoder_filter.cpp +++ b/services/media_engine/filters/audio_decoder_filter.cpp @@ -25,8 +25,6 @@ static AutoRegisterFilter g_registerAudioDecoderFilter("buil return std::make_shared(name, FilterType::FILTERTYPE_ADEC); }); -/// End of Stream Buffer Flag -constexpr uint32_t BUFFER_FLAG_EOS = 0x00000001; class AudioDecoderFilterLinkCallback : public FilterLinkCallback { public: explicit AudioDecoderFilterLinkCallback(std::shared_ptr codecFilter) @@ -280,30 +278,8 @@ void AudioDecoderFilter::OnUnlinkedResult(std::shared_ptr &meta) void AudioDecoderFilter::OnBufferFilled(std::shared_ptr &inputBuffer) { - MEDIA_LOG_E("AudioDecoderFilter::OnBufferFilled."); - if (isSeek_) { - if (inputBuffer->pts_ >= seekTimeUs_ || (inputBuffer->flag_ & BUFFER_FLAG_EOS)) { - inputBufferQueueProducer_->ReturnBuffer(inputBuffer, true); - isSeek_ = false; - videoSeekFuture_.get(); - } else { - if (firstFrame_) { - inputBufferQueueProducer_->ReturnBuffer(inputBuffer, true); - firstFrame_ = false; - } else { - inputBufferQueueProducer_->ReturnBuffer(inputBuffer, false); - } - } - } else { - inputBufferQueueProducer_->ReturnBuffer(inputBuffer, true); - } -} - -void AudioDecoderFilter::SeekTo(int64_t seekTimeUs, std::future &&videoSeekFuture) -{ - isSeek_ = true; - seekTimeUs_ = seekTimeUs; - videoSeekFuture_ = std::move(videoSeekFuture); + MEDIA_LOG_D("AudioDecoderFilter::OnBufferFilled."); + inputBufferQueueProducer_->ReturnBuffer(inputBuffer, true); } } // namespace Pipeline diff --git a/services/media_engine/filters/decoder_surface_filter.cpp b/services/media_engine/filters/decoder_surface_filter.cpp index dd341b451aed476e35673f6837d5043f156667fc..33a880f5515ebf795eeb9d8d5e2a466043e9e907 100644 --- a/services/media_engine/filters/decoder_surface_filter.cpp +++ b/services/media_engine/filters/decoder_surface_filter.cpp @@ -303,21 +303,7 @@ void DecoderSurfaceFilter::DrainOutputBuffer(uint32_t index, std::shared_ptrSetFirstPts(outputBuffer->pts_); - if (isSeek_) { - if (outputBuffer->pts_ >= seekTimeUs_) { - videoDecoder_->ReleaseOutputBuffer(index, videoSink_, outputBuffer, true); - isSeek_ = false; - videoSeekSuccess_.set_value(true); - } else { - videoDecoder_->ReleaseOutputBuffer(index, videoSink_, outputBuffer, false); - } - } else { - if (isPaused_.load()) { - videoDecoder_->ReleaseOutputBuffer(index, videoSink_, outputBuffer, false); - } else { - videoDecoder_->ReleaseOutputBuffer(index, videoSink_, outputBuffer, true); - } - } + videoDecoder_->ReleaseOutputBuffer(index, videoSink_, outputBuffer, !isPaused_.load()); } Status DecoderSurfaceFilter::SetVideoSurface(sptr videoSurface) @@ -351,13 +337,6 @@ Status DecoderSurfaceFilter::SetDecryptConfig(const sptr &&videoSeekSuccess) -{ - isSeek_ = true; - seekTimeUs_ = seekTimeUs; - videoSeekSuccess_ = std::move(videoSeekSuccess); -} } // namespace Pipeline } // namespace MEDIA } // namespace OHOS \ No newline at end of file diff --git a/services/media_engine/filters/video_decoder_adapter.cpp b/services/media_engine/filters/video_decoder_adapter.cpp index f8de595ac163cd107b68e80d5e461330b05fc86f..56517bf4d42bb6fc1a263bb851d610e990df537c 100644 --- a/services/media_engine/filters/video_decoder_adapter.cpp +++ b/services/media_engine/filters/video_decoder_adapter.cpp @@ -321,6 +321,8 @@ int32_t VideoDecoderAdapter::ReleaseOutputBuffer(uint32_t index, std::shared_ptr if (doSync) { bool render = videoSink->DoSyncWrite(outputBuffer); mediaCodec_->ReleaseOutputBuffer(index, render); + MEDIA_LOG_D("Video release output buffer pts: %{public}" PRIu64 ", render: %{public}i", + (outputBuffer == nullptr ? -1 : outputBuffer->pts_), render); } else { mediaCodec_->ReleaseOutputBuffer(index, false); } diff --git a/services/media_engine/modules/demuxer/media_demuxer.cpp b/services/media_engine/modules/demuxer/media_demuxer.cpp index dff299b037028126667ee8b02f4583ea599e75c4..629b5ad95fd8cde1a8d807c1b15353d3fb2ee941 100755 --- a/services/media_engine/modules/demuxer/media_demuxer.cpp +++ b/services/media_engine/modules/demuxer/media_demuxer.cpp @@ -755,8 +755,11 @@ Status MediaDemuxer::CopyFrameToUserQueue(uint32_t trackId) firstAudio_ = false; return Status::ERROR_INVALID_PARAMETER; } - MEDIA_LOG_I("CopyFrameToUserQueue is seeking, not found idr frame. trackId: " PUBLIC_LOG_U32, trackId); - bufferQueueMap_[trackId]->PushBuffer(bufferMap_[trackId], false); + bool isEos = (bufferMap_[trackId]->flag_ & (uint32_t)(AVBufferFlag::EOS)) != 0; + bufferQueueMap_[trackId]->PushBuffer(bufferMap_[trackId], isEos); + eosMap_[trackId] = isEos; + MEDIA_LOG_I("CopyFrameToUserQueue is seeking, not found idr frame. trackId: " PUBLIC_LOG_U32 + ", isEos: %{public}i", trackId, isEos); return Status::ERROR_INVALID_PARAMETER; } MEDIA_LOG_I("CopyFrameToUserQueue is seeking, found idr frame. trackId: " PUBLIC_LOG_U32, trackId); @@ -793,7 +796,14 @@ Status MediaDemuxer::InnerReadSample(uint32_t trackId, std::shared_ptr void MediaDemuxer::ReadLoop(uint32_t trackId) { - std::string threadReadName = "DemuxerRLoop" + std::to_string(trackId); + std::string trackType = std::to_string(trackId); + if (trackId == videoTrackId_) { + trackType = "V"; + } + if (trackId == audioTrackId_) { + trackType = "A"; + } + std::string threadReadName = std::string("DemuxerLoop") + trackType.c_str(); MEDIA_LOG_I("Enter [" PUBLIC_LOG_S "] read thread.", threadReadName.c_str()); pthread_setname_np(pthread_self(), threadReadName.c_str()); for (;;) { diff --git a/services/media_engine/modules/sink/media_sync_manager.cpp b/services/media_engine/modules/sink/media_sync_manager.cpp index ab30ff1123e9baebced39b38e1625a918c0a0980..18bf09c2297aac121932f849f1e05cc512670d06 100644 --- a/services/media_engine/modules/sink/media_sync_manager.cpp +++ b/services/media_engine/modules/sink/media_sync_manager.cpp @@ -321,8 +321,7 @@ int64_t MediaSyncManager::GetMediaTimeNow() return pausedMediaTime_; } auto ret = SimpleGetMediaTime(currentAnchorClockTime_, GetSystemClock(), currentAnchorMediaTime_, playRate_); - // clip into min&max media time - return ClipMediaTime(ret); + return std::max(seekingMediaTime_, ClipMediaTime(ret)); } int64_t MediaSyncManager::GetClockTimeNow() diff --git a/services/media_engine/modules/sink/video_sink.cpp b/services/media_engine/modules/sink/video_sink.cpp index 4bf58110f1e7d39b0bf95427b61feb87c90e083d..c399e6c77bf5c05fac527f1ab4680dbee7a93be3 100644 --- a/services/media_engine/modules/sink/video_sink.cpp +++ b/services/media_engine/modules/sink/video_sink.cpp @@ -132,8 +132,6 @@ bool VideoSink::CheckBufferLatenessMayWait(const std::shared_ptrEmpty() && (downloadRequest_ != nullptr) && - downloadRequest_->IsEos() && (playListDownloader_->GetDuration() > 0)) { + if (buffer_->GetSize() == 0 && playList_->Empty() && (downloadRequest_ != nullptr) && + downloadRequest_->IsEos() && (playListDownloader_->GetDuration() > 0)) { + isEos = true; + realReadLength = 0; + MEDIA_LOG_I("HLS read Eos."); + return false; + } + + if (seekTime_ >= playListDownloader_->GetDuration()) { isEos = true; realReadLength = 0; MEDIA_LOG_I("HLS read Eos."); @@ -125,6 +132,7 @@ bool HlsMediaDownloader::SeekToTime(int64_t seekTime) { FALSE_RETURN_V(buffer_ != nullptr, false); MEDIA_LOG_I("Seek: buffer size " PUBLIC_LOG_ZU ", seekTime " PUBLIC_LOG_D64, buffer_->GetSize(), seekTime); + seekTime_ = seekTime; buffer_->Clear(); // First clear buffer, avoid no available buffer then task pause never exit. downloader_->Cancel(); buffer_->Clear(); @@ -312,7 +320,7 @@ void HlsMediaDownloader::SeekToTs(int64_t seekTime) int64_t lastTotalDuration = totalDuration - hstTime; if (lastTotalDuration < seekTime) { startTimePos = seekTime - lastTotalDuration; - if (startTimePos > hstTime / 2) { // 2 + if (startTimePos > hstTime / 2 && (&item != &backPlayList_.back())) { // 2 havePlayedTsNum_++; continue; } diff --git a/services/media_engine/plugins/source/http_source/hls/hls_media_downloader.h b/services/media_engine/plugins/source/http_source/hls/hls_media_downloader.h index 58e8a993245ea0eab6b02721ec92c2d366c44eb9..88a23080d705642a79146461cd7d5d6fa1931578 100644 --- a/services/media_engine/plugins/source/http_source/hls/hls_media_downloader.h +++ b/services/media_engine/plugins/source/http_source/hls/hls_media_downloader.h @@ -89,6 +89,7 @@ private: uint8_t decryptBuffer_[RING_BUFFER_SIZE] { 0 }; int havePlayedTsNum_ = 0; bool isAutoSelectBitrate_ {true}; + int64_t seekTime_ = 0; }; } }