Bring back original video quality option

This commit is contained in:
cumdev1337
2026-03-04 01:48:48 +02:00
committed by John Preston
parent c9ca79ab47
commit 827ec824d1
12 changed files with 168 additions and 44 deletions
+75 -14
View File
@@ -544,11 +544,12 @@ void DocumentData::setVideoQualities(
return;
}
const auto good = [&](not_null<DocumentData*> document) {
// Transcodes in alt_documents are always streamable,
// even if the supports_streaming flag is missing
return document->isVideoFile()
&& !document->dimensions.isEmpty()
&& !document->inappPlaybackFailed()
&& document->useStreamingLoader()
&& document->canBeStreamed();
&& document->useStreamingLoader();
};
ranges::sort(
qualities,
@@ -578,18 +579,67 @@ void DocumentData::setVideoQualities(
}
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);
auto transcodeMax = 0;
for (const auto &quality : qualities) {
const auto qres = quality->resolveVideoQuality();
if (qres > transcodeMax) {
transcodeMax = qres;
}
}
const auto attributesSize = isVideoFile() ? dimensions : QSize();
const auto attributesQuality = attributesSize.isEmpty()
? 0
: std::min(attributesSize.width(), attributesSize.height());
// Heuristic: Trust attributes resolution unless it blatantly
// contradicts server-side transcodes (>1.5x delta)
auto mine = (transcodeMax > 0
&& (attributesQuality < transcodeMax
|| attributesQuality > transcodeMax * 1.5))
? transcodeMax
: attributesQuality;
if (mine) {
qualities.insert(begin(qualities), this);
}
}
data->qualities = std::move(qualities);
}
int DocumentData::resolveVideoQuality() const {
const auto size = isVideoFile() ? dimensions : QSize();
return size.isEmpty() ? 0 : std::min(size.width(), size.height());
if (const auto data = video()) {
if (!data->realVideoSize.isEmpty()) {
// Always trust FFmpeg-parsed physical resolution
const auto size = data->realVideoSize;
return std::min(size.width(), size.height());
}
const auto attributesSize = isVideoFile() ? dimensions : QSize();
const auto attributesQuality = attributesSize.isEmpty()
? 0
: std::min(attributesSize.width(), attributesSize.height());
if (!data->qualities.empty()) {
auto transcodeMax = 0;
for (const auto &quality : data->qualities) {
if (quality != this) {
const auto qres = quality->resolveVideoQuality();
if (qres > transcodeMax) {
transcodeMax = qres;
}
}
}
if (transcodeMax > 0) {
// Trust transcodes if attributes appear fake
if (attributesQuality < transcodeMax
|| attributesQuality > transcodeMax * 1.5) {
return transcodeMax;
}
return attributesQuality;
}
}
}
const auto attributesSize = isVideoFile() ? dimensions : QSize();
return attributesSize.isEmpty()
? 0
: std::min(attributesSize.width(), attributesSize.height());
}
auto DocumentData::resolveQualities(HistoryItem *context) const
@@ -611,19 +661,30 @@ not_null<DocumentData*> DocumentData::chooseQuality(
return this;
}
const auto height = int(request.height);
auto closest = this;
auto closestAbs = std::abs(height - resolveVideoQuality());
auto closestSize = size;
if (height >= Media::kVideoQualityOriginalOffset) {
return this;
}
auto closest = (DocumentData*)nullptr;
auto closestAbs = -1;
auto closestSize = -1;
for (const auto &quality : list) {
const auto abs = std::abs(height - quality->resolveVideoQuality());
if (abs < closestAbs
|| (abs == closestAbs && quality->size < closestSize)) {
const auto qres = quality->resolveVideoQuality();
const auto abs = std::abs(height - qres);
// Prefer Original if it fits target resolution best,
// falling back to transcode only on exact matches
if (!closest
|| abs < closestAbs
|| (abs == closestAbs && (quality->size < closestSize
|| (closest == this && quality != this)))) {
closest = quality;
closestAbs = abs;
closestSize = quality->size;
}
}
return closest;
return closest ? closest : this;
}
void DocumentData::validateLottieSticker() {