From 2e2823d4cfe273075a1e3b4c4051f37770f0bfca Mon Sep 17 00:00:00 2001 From: KkemChen Date: Sat, 23 Mar 2024 20:47:38 +0800 Subject: [PATCH] VideoStack: move sws execution to WorkThread and optimization interface (#3407) VideoStack: move sws execution to WorkThread and optimization interface --- server/VideoStack.cpp | 18 ++++++++++-------- server/VideoStack.h | 1 + server/WebApi.cpp | 17 ++++++----------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/server/VideoStack.cpp b/server/VideoStack.cpp index ff4804f1..d5168147 100644 --- a/server/VideoStack.cpp +++ b/server/VideoStack.cpp @@ -62,15 +62,16 @@ void Channel::addParam(const std::weak_ptr& p) void Channel::onFrame(const mediakit::FFmpegFrame::Ptr& frame) { std::weak_ptr weakSelf = shared_from_this(); - // toolkit::WorkThreadPool::Instance().getFirstPoller()->async([weakSelf, frame]() { - auto self = weakSelf.lock(); - if (!self) { - return; - } - self->_tmp = self->_sws->inputFrame(frame); + _poller = _poller ? _poller : toolkit::WorkThreadPool::Instance().getPoller(); + _poller->async([weakSelf, frame]() { + auto self = weakSelf.lock(); + if (!self) { + return; + } + self->_tmp = self->_sws->inputFrame(frame); - self->forEachParam([self](const Param::Ptr& p) { self->fillBuffer(p); }); - // }); + self->forEachParam([self](const Param::Ptr& p) { self->fillBuffer(p); }); + }); } void Channel::forEachParam(const std::function& func) @@ -440,6 +441,7 @@ int VideoStackManager::stopVideoStack(const std::string& id) auto it = _stackMap.find(id); if (it != _stackMap.end()) { _stackMap.erase(it); + InfoL << "VideoStack stop: " << id; return 0; } return -1; diff --git a/server/VideoStack.h b/server/VideoStack.h index d4378ab3..99455b40 100644 --- a/server/VideoStack.h +++ b/server/VideoStack.h @@ -80,6 +80,7 @@ class Channel : public std::enable_shared_from_this { std::vector> _params; mediakit::FFmpegSws::Ptr _sws; + toolkit::EventPoller::Ptr _poller; }; class StackPlayer : public std::enable_shared_from_this { diff --git a/server/WebApi.cpp b/server/WebApi.cpp index 9ea3681d..9b1c8ba9 100755 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -1937,28 +1937,23 @@ void installWebApi() { NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastStreamNoneReader, [](BroadcastStreamNoneReaderArgs) { auto id = sender.getMediaTuple().stream; VideoStackManager::Instance().stopVideoStack(id); - InfoL << "VideoStack: " << id <<" stop"; }); api_regist("/index/api/stack/start", [](API_ARGS_JSON_ASYNC) { CHECK_SECRET(); auto ret = VideoStackManager::Instance().startVideoStack(allArgs.getArgs()); - if (!ret) { - invoker(200, headerOut, "success"); - } else { - invoker(200, headerOut, "failed"); - } + val["code"] = ret; + val["msg"] = ret ? "failed" : "success"; + invoker(200, headerOut, val.toStyledString()); }); api_regist("/index/api/stack/stop", [](API_ARGS_MAP_ASYNC) { CHECK_SECRET(); CHECK_ARGS("id"); auto ret = VideoStackManager::Instance().stopVideoStack(allArgs["id"]); - if (!ret) { - invoker(200, headerOut, "success"); - } else { - invoker(200, headerOut, "failed"); - } + val["code"] = ret; + val["msg"] = ret ? "failed" : "success"; + invoker(200, headerOut, val.toStyledString()); }); #endif }