From 6c382c647c9836499cf99b7d43da22c84c102f93 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 18 Mar 2019 10:59:51 +0400 Subject: [PATCH] Fix caching of first slice in header. --- .../streaming/media_streaming_reader.cpp | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/Telegram/SourceFiles/media/streaming/media_streaming_reader.cpp b/Telegram/SourceFiles/media/streaming/media_streaming_reader.cpp index f60c021287..7d15252c54 100644 --- a/Telegram/SourceFiles/media/streaming/media_streaming_reader.cpp +++ b/Telegram/SourceFiles/media/streaming/media_streaming_reader.cpp @@ -336,19 +336,32 @@ bool Reader::Slices::headerWontBeFilled() const { } void Reader::Slices::applyHeaderCacheData() { - if (_header.parts.empty() || _headerMode != HeaderMode::Unknown) { + using namespace rpl::mappers; + + const auto applyWhile = [&](auto &&predicate) { + for (const auto &[offset, part] : _header.parts) { + const auto index = offset / kInSlice; + if (!predicate(index)) { + break; + } + _data[index].addPart( + offset - index * kInSlice, + base::duplicate(part)); + } + }; + if (_header.parts.empty()) { + return; + } else if (_headerMode == HeaderMode::Good) { + // Always apply data to first block if it is cached in the header. + applyWhile(_1 == 0); + } else if (_headerMode != HeaderMode::Unknown) { return; } else if (isFullInHeader()) { headerDone(true); - return; + } else { + applyWhile(_1 < int(_data.size())); + headerDone(true); } - for (const auto &[offset, part] : _header.parts) { - const auto index = offset / kInSlice; - _data[index].addPart( - offset - index * kInSlice, - base::duplicate(part)); - } - headerDone(true); } void Reader::Slices::processCacheResult(