From 1da095f5c33299226ffa4049b51524ed9e681e06 Mon Sep 17 00:00:00 2001 From: John Zhao Date: Thu, 31 May 2018 23:41:32 +0800 Subject: [PATCH] Optimize streams --- src/internal/streams.cc | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/internal/streams.cc b/src/internal/streams.cc index fccef49..93f79f2 100644 --- a/src/internal/streams.cc +++ b/src/internal/streams.cc @@ -197,26 +197,26 @@ std::size_t Streams::GetStreamDataMaxSize(const Stream &stream) const { Streams::stream_datas_t Streams::GetStreamDatas(const Stream &stream) { std::unique_lock lock(mtx_); - if (!HasStreamDatas(stream) || stream_datas_map_.at(stream).empty()) { + if (!HasStreamDatas(stream)) { LOG(WARNING) << "There are no stream datas of " << stream << ". Did you call WaitForStreams() before this?"; return {}; } - stream_datas_t datas = stream_datas_map_.at(stream); + auto datas = stream_datas_map_.at(stream); stream_datas_map_[stream].clear(); return datas; } Streams::stream_data_t Streams::GetLatestStreamData(const Stream &stream) { std::unique_lock lock(mtx_); - if (!HasStreamDatas(stream) || stream_datas_map_.at(stream).empty()) { + if (!HasStreamDatas(stream)) { LOG(WARNING) << "There are no stream datas of " << stream << ". Did you call WaitForStreams() before this?"; return {}; } - stream_datas_t datas = stream_datas_map_.at(stream); + auto data = stream_datas_map_.at(stream).back(); stream_datas_map_[stream].clear(); - return datas.back(); + return data; } const Streams::stream_datas_t &Streams::stream_datas(const Stream &stream) { @@ -247,7 +247,8 @@ const StreamRequest &Streams::GetStreamConfigRequest( } bool Streams::HasStreamDatas(const Stream &stream) const { - return stream_datas_map_.find(stream) != stream_datas_map_.end(); + return stream_datas_map_.find(stream) != stream_datas_map_.end() && + !stream_datas_map_.at(stream).empty(); } void Streams::AllocStreamData( @@ -263,22 +264,27 @@ void Streams::AllocStreamData( } else { data.img = nullptr; } - data.frame = - std::make_shared(request.width, request.height, format, nullptr); - stream_datas_map_[stream].push_back(data); - // If cached more then limits_max, drop the oldest one. - if (stream_datas_map_.at(stream).size() > GetStreamDataMaxSize(stream)) { - auto &&datas = stream_datas_map_[stream]; - datas.erase(datas.begin()); - VLOG(2) << "Stream data of " << stream << " is dropped as out of limits"; + if (HasStreamDatas(stream)) { + // If cached equal to limits_max, drop the oldest one. + if (stream_datas_map_.at(stream).size() == GetStreamDataMaxSize(stream)) { + auto &&datas = stream_datas_map_[stream]; + data.frame = datas.front().frame; // reuse this frame + datas.erase(datas.begin()); + VLOG(2) << "Stream data of " << stream << " is dropped as out of limits"; + } } + if (!data.frame) { + data.frame = std::make_shared( + request.width, request.height, format, nullptr); + } + stream_datas_map_[stream].push_back(data); } void Streams::DiscardStreamData(const Stream &stream) { // Must discard after alloc, otherwise at will out of range when no this key. if (stream_datas_map_.at(stream).size() > 0) { auto &&datas = stream_datas_map_[stream]; - datas.erase(datas.end() - 1); + datas.pop_back(); } else { VLOG(2) << "Stream data of " << stream << " is empty, could not discard"; } @@ -288,8 +294,6 @@ bool Streams::HasKeyStreamDatas() const { for (auto &&s : key_streams_) { if (!HasStreamDatas(s)) return false; - if (stream_datas_map_.at(s).empty()) - return false; } return true; }