mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2026-07-30 17:16:46 +00:00
Bring back original video quality option
This commit is contained in:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user