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:
@@ -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)) {
|
||||
|
Reference in New Issue
Block a user