From 7ff22afc604551cf25cb7175d0e7e3d16ee117f1 Mon Sep 17 00:00:00 2001 From: Dong Yu Date: Sat, 8 Jun 2024 12:09:24 +0800 Subject: [PATCH] fix ffmpeg dead loop when interrupted Signed-off-by: Dong Yu --- .../media_engine/modules/demuxer/base_stream_demuxer.cpp | 5 +++++ services/media_engine/modules/demuxer/base_stream_demuxer.h | 2 ++ .../modules/demuxer/live_datasource_stream_demuxer.cpp | 1 + .../modules/demuxer/live_http_stream_demuxer.cpp | 1 + services/media_engine/modules/demuxer/media_demuxer.cpp | 6 ++++++ .../media_engine/modules/demuxer/vod_stream_demuxer.cpp | 1 + 6 files changed, 16 insertions(+) diff --git a/services/media_engine/modules/demuxer/base_stream_demuxer.cpp b/services/media_engine/modules/demuxer/base_stream_demuxer.cpp index 9f43e53cb..d9302a20d 100644 --- a/services/media_engine/modules/demuxer/base_stream_demuxer.cpp +++ b/services/media_engine/modules/demuxer/base_stream_demuxer.cpp @@ -82,6 +82,11 @@ void BaseStreamDemuxer::SetBundleName(const std::string& bundleName) bundleName_ = bundleName; } +void BaseStreamDemuxer::SetInterruptState(bool isInterruptNeeded) +{ + isInterruptNeeded_ = isInterruptNeeded; +} + void BaseStreamDemuxer::SetIsIgnoreParse(bool state) { return isIgnoreParse_.store(state); diff --git a/services/media_engine/modules/demuxer/base_stream_demuxer.h b/services/media_engine/modules/demuxer/base_stream_demuxer.h index 5c01dfa8d..a1df68f5a 100644 --- a/services/media_engine/modules/demuxer/base_stream_demuxer.h +++ b/services/media_engine/modules/demuxer/base_stream_demuxer.h @@ -104,6 +104,7 @@ public: virtual Status CallbackReadAt(int32_t streamID, int64_t offset, std::shared_ptr& buffer, size_t expectedLen) = 0; + void SetInterruptState(bool isInterruptNeeded); void SetDemuxerState(int32_t streamId, DemuxerState state); void SetBundleName(const std::string& bundleName); void SetIsIgnoreParse(bool state); @@ -122,6 +123,7 @@ protected: std::map pluginStateMap_; std::atomic isIgnoreParse_{false}; std::atomic isIgnoreRead_{false}; + std::atomic isInterruptNeeded_{false}; std::string bundleName_ {}; std::string uri_ {}; public: diff --git a/services/media_engine/modules/demuxer/live_datasource_stream_demuxer.cpp b/services/media_engine/modules/demuxer/live_datasource_stream_demuxer.cpp index 44b537b20..a0b860a9e 100644 --- a/services/media_engine/modules/demuxer/live_datasource_stream_demuxer.cpp +++ b/services/media_engine/modules/demuxer/live_datasource_stream_demuxer.cpp @@ -225,6 +225,7 @@ Status LiveDataSourceStreamDemuxer::ResetAllCache() Status LiveDataSourceStreamDemuxer::CallbackReadAt(int32_t streamID, int64_t offset, std::shared_ptr& buffer, size_t expectedLen) { + FALSE_RETURN_V(!isInterruptNeeded_.load(), Status::ERROR_WRONG_STATE); switch (pluginStateMap_[streamID]) { case DemuxerState::DEMUXER_STATE_NULL: return Status::ERROR_WRONG_STATE; diff --git a/services/media_engine/modules/demuxer/live_http_stream_demuxer.cpp b/services/media_engine/modules/demuxer/live_http_stream_demuxer.cpp index 27a9321c9..1ddecb4d6 100644 --- a/services/media_engine/modules/demuxer/live_http_stream_demuxer.cpp +++ b/services/media_engine/modules/demuxer/live_http_stream_demuxer.cpp @@ -361,6 +361,7 @@ Status LiveHttpStreamDemuxer::HandleReadPacket(int32_t streamID, int64_t offset, Status LiveHttpStreamDemuxer::CallbackReadAt(int32_t streamID, int64_t offset, std::shared_ptr& buffer, size_t expectedLen) { + FALSE_RETURN_V(!isInterruptNeeded_.load(), Status::ERROR_WRONG_STATE); switch (pluginStateMap_[streamID]) { case DemuxerState::DEMUXER_STATE_NULL: return Status::ERROR_WRONG_STATE; diff --git a/services/media_engine/modules/demuxer/media_demuxer.cpp b/services/media_engine/modules/demuxer/media_demuxer.cpp index 7bbd385f0..b7e995530 100755 --- a/services/media_engine/modules/demuxer/media_demuxer.cpp +++ b/services/media_engine/modules/demuxer/media_demuxer.cpp @@ -487,6 +487,12 @@ void MediaDemuxer::SetInterruptState(bool isInterruptNeeded) if (source_ != nullptr) { source_->SetInterruptState(isInterruptNeeded); } + if (streamDemuxer_ != nullptr) { + streamDemuxer_->SetInterruptState(isInterruptNeeded); + } + if (subStreamDemuxer_ != nullptr) { + subStreamDemuxer_->SetInterruptState(isInterruptNeeded); + } } void MediaDemuxer::SetBundleName(const std::string& bundleName) diff --git a/services/media_engine/modules/demuxer/vod_stream_demuxer.cpp b/services/media_engine/modules/demuxer/vod_stream_demuxer.cpp index 5bd3777b2..2ea963fbd 100644 --- a/services/media_engine/modules/demuxer/vod_stream_demuxer.cpp +++ b/services/media_engine/modules/demuxer/vod_stream_demuxer.cpp @@ -389,6 +389,7 @@ Status VodStreamDemuxer::HandleReadPacket(int32_t streamID, int64_t offset, std: Status VodStreamDemuxer::CallbackReadAt(int32_t streamID, int64_t offset, std::shared_ptr& buffer, size_t expectedLen) { + FALSE_RETURN_V(!isInterruptNeeded_.load(), Status::ERROR_WRONG_STATE); switch (pluginStateMap_[streamID]) { case DemuxerState::DEMUXER_STATE_NULL: return Status::ERROR_WRONG_STATE; -- Gitee