2
0
mirror of https://github.com/telegramdesktop/tdesktop synced 2025-09-01 06:55:58 +00:00

Implement adaptive quality selection.

This commit is contained in:
John Preston
2024-10-31 18:03:56 +04:00
parent a386d70ae4
commit d6ac883efa
37 changed files with 654 additions and 193 deletions

View File

@@ -576,6 +576,13 @@ void DocumentData::setVideoQualities(
--count;
}
qualities.erase(qualities.begin() + count, qualities.end());
if (!qualities.empty()) {
if (const auto mine = resolveVideoQuality()) {
if (mine > qualities.front()->resolveVideoQuality()) {
qualities.insert(begin(qualities), this);
}
}
}
data->qualities = std::move(qualities);
}
@@ -584,6 +591,40 @@ int DocumentData::resolveVideoQuality() const {
return size.isEmpty() ? 0 : std::min(size.width(), size.height());
}
auto DocumentData::resolveQualities(HistoryItem *context) const
-> const std::vector<not_null<DocumentData*>> & {
static const auto empty = std::vector<not_null<DocumentData*>>();
const auto info = video();
const auto media = context ? context->media() : nullptr;
if (!info || !media || media->document() != this) {
return empty;
}
return media->hasQualitiesList() ? info->qualities : empty;
}
not_null<DocumentData*> DocumentData::chooseQuality(
HistoryItem *context,
Media::VideoQuality request) {
const auto &list = resolveQualities(context);
if (list.empty() || !request.height) {
return this;
}
const auto height = int(request.height);
auto closest = this;
auto closestAbs = std::abs(height - resolveVideoQuality());
auto closestSize = size;
for (const auto &quality : list) {
const auto abs = std::abs(height - quality->resolveVideoQuality());
if (abs < closestAbs
|| (abs == closestAbs && quality->size < closestSize)) {
closest = quality;
closestAbs = abs;
closestSize = quality->size;
}
}
return closest;
}
void DocumentData::validateLottieSticker() {
if (type == FileDocument
&& hasMimeType(u"application/x-tgsticker"_q)) {