Skip to content

Commit a0026be

Browse files
committed
Bring back original video quality option
1 parent ec7c76b commit a0026be

8 files changed

Lines changed: 87 additions & 25 deletions

Telegram/SourceFiles/core/core_settings.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,13 @@ void LogPosition(const WindowPosition &position, const QString &name) {
102102
auto result = Media::VideoQuality();
103103
const auto data = static_cast<void*>(&result);
104104
memcpy(data, &value, sizeof(result));
105-
return (result.height <= 4320) ? result : Media::VideoQuality();
105+
106+
const auto height = result.height;
107+
const auto offset = Media::kVideoQualityOriginalOffset;
108+
const auto max = 4320;
109+
return (height <= max || (height >= offset && height <= offset + max))
110+
? result
111+
: Media::VideoQuality();
106112
}
107113

108114
} // namespace

Telegram/SourceFiles/data/data_document.cpp

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -578,18 +578,35 @@ void DocumentData::setVideoQualities(
578578
}
579579
qualities.erase(qualities.begin() + count, qualities.end());
580580
if (!qualities.empty()) {
581-
if (const auto mine = resolveVideoQuality()) {
582-
if (mine > qualities.front()->resolveVideoQuality()) {
583-
qualities.insert(begin(qualities), this);
581+
auto mine = resolveVideoQuality();
582+
for (const auto &quality : qualities) {
583+
const auto qres = quality->resolveVideoQuality();
584+
if (qres > mine) {
585+
mine = qres;
584586
}
585587
}
588+
if (mine) {
589+
qualities.insert(begin(qualities), this);
590+
}
586591
}
587592
data->qualities = std::move(qualities);
588593
}
589594

590595
int DocumentData::resolveVideoQuality() const {
591596
const auto size = isVideoFile() ? dimensions : QSize();
592-
return size.isEmpty() ? 0 : std::min(size.width(), size.height());
597+
auto result = size.isEmpty() ? 0 : std::min(size.width(), size.height());
598+
if (const auto data = video()) {
599+
for (const auto &quality : data->qualities) {
600+
if (quality != this) {
601+
const auto qsize = quality->dimensions;
602+
const auto qres = qsize.isEmpty() ? 0 : std::min(qsize.width(), qsize.height());
603+
if (qres > result) {
604+
result = qres;
605+
}
606+
}
607+
}
608+
}
609+
return result;
593610
}
594611

595612
auto DocumentData::resolveQualities(HistoryItem *context) const
@@ -611,19 +628,30 @@ not_null<DocumentData*> DocumentData::chooseQuality(
611628
return this;
612629
}
613630
const auto height = int(request.height);
614-
auto closest = this;
615-
auto closestAbs = std::abs(height - resolveVideoQuality());
616-
auto closestSize = size;
631+
if (height >= Media::kVideoQualityOriginalOffset) {
632+
return this;
633+
}
634+
635+
// If a standard quality is requested, try to find the best match among transcoded streams only.
636+
auto closest = (DocumentData*)nullptr;
637+
auto closestAbs = -1;
638+
auto closestSize = -1;
639+
617640
for (const auto &quality : list) {
641+
if (quality == this) {
642+
continue; // Skip Original stream for standard quality requests
643+
}
618644
const auto abs = std::abs(height - quality->resolveVideoQuality());
619-
if (abs < closestAbs
645+
if (!closest
646+
|| abs < closestAbs
620647
|| (abs == closestAbs && quality->size < closestSize)) {
621648
closest = quality;
622649
closestAbs = abs;
623650
closestSize = quality->size;
624651
}
625652
}
626-
return closest;
653+
654+
return closest ? closest : this;
627655
}
628656

629657
void DocumentData::validateLottieSticker() {

Telegram/SourceFiles/media/media_common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ inline constexpr auto kSpeedMin = 0.5;
4141
inline constexpr auto kSpeedMax = 2.5;
4242
inline constexpr auto kSpedUpDefault = 1.7;
4343

44+
inline constexpr auto kVideoQualityOriginalOffset = 1000000;
45+
4446
[[nodiscard]] inline bool EqualSpeeds(float64 a, float64 b) {
4547
return int(base::SafeRound(a * 10.)) == int(base::SafeRound(b * 10.));
4648
}

Telegram/SourceFiles/media/player/media_player_button.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -437,13 +437,16 @@ void SettingsButton::prepareFrame() {
437437
: u"%1X"_q.arg(rounded / 10);
438438
paintBadge(p, text, RectPart::TopLeft, color);
439439
}
440-
const auto text = (!_quality)
440+
const auto displayQuality = (_quality >= Media::kVideoQualityOriginalOffset)
441+
? (_quality - Media::kVideoQualityOriginalOffset)
442+
: _quality;
443+
const auto text = (!displayQuality)
441444
? QString()
442-
: (_quality > 2000)
445+
: (displayQuality > 2000)
443446
? u"4K"_q
444-
: (_quality > 1000)
447+
: (displayQuality > 1000)
445448
? u"FHD"_q
446-
: (_quality > 700)
449+
: (displayQuality > 700)
447450
? u"HD"_q
448451
: u"SD"_q;
449452
if (!text.isEmpty()) {

Telegram/SourceFiles/media/player/media_player_dropdown.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,14 @@ void SpeedController::fillMenu(not_null<Ui::DropdownMenu*> menu) {
819819

820820
const auto add = [&](int quality) {
821821
const auto automatic = tr::lng_mediaview_quality_auto(tr::now);
822-
const auto text = quality ? u"%1p"_q.arg(quality) : automatic;
822+
auto text = automatic;
823+
if (quality) {
824+
if (quality >= Media::kVideoQualityOriginalOffset) {
825+
text = u"Original (%1p)"_q.arg(quality - Media::kVideoQualityOriginalOffset);
826+
} else {
827+
text = u"%1p"_q.arg(quality);
828+
}
829+
}
823830
auto action = base::make_unique_q<Ui::Menu::Action>(
824831
raw,
825832
st.qualityMenu,
@@ -852,8 +859,12 @@ void SpeedController::fillMenu(not_null<Ui::DropdownMenu*> menu) {
852859
: !quality;
853860
raw->action()->setEnabled(!chosen);
854861
if (!quality) {
862+
auto displayHeight = now.height;
863+
if (displayHeight >= Media::kVideoQualityOriginalOffset) {
864+
displayHeight -= Media::kVideoQualityOriginalOffset;
865+
}
855866
raw->action()->setText(automatic
856-
+ (now.manual ? QString() : u"\t%1p"_q.arg(now.height)));
867+
+ (now.manual ? QString() : u"\t%1p"_q.arg(displayHeight)));
857868
}
858869
check->setVisible(chosen);
859870
}, raw->lifetime());

Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4267,6 +4267,9 @@ void OverlayWidget::streamingReady(Streaming::Information &&info) {
42674267
if (videoShown()) {
42684268
applyVideoSize();
42694269
_streamedQualityChangeFrame = QImage();
4270+
if (_streamed && _streamed->controls) {
4271+
_streamed->controls->updateSpeedToggleQuality();
4272+
}
42704273
} else {
42714274
updateContentRect();
42724275
}
@@ -4770,20 +4773,29 @@ std::vector<int> OverlayWidget::playbackControlsQualities() {
47704773
auto result = std::vector<int>();
47714774
result.reserve(list.size());
47724775
for (const auto &quality : list) {
4773-
result.push_back(quality->resolveVideoQuality());
4776+
if (quality == _document) {
4777+
result.push_back(Media::kVideoQualityOriginalOffset + quality->resolveVideoQuality());
4778+
} else {
4779+
result.push_back(quality->resolveVideoQuality());
4780+
}
47744781
}
47754782
return result;
47764783
}
47774784

47784785
VideoQuality OverlayWidget::playbackControlsCurrentQuality() {
4779-
return _chosenQuality
4780-
? VideoQuality{
4781-
.manual = _quality.manual,
4782-
.height = uint32(_chosenQuality->resolveVideoQuality()),
4786+
if (!_chosenQuality) {
4787+
return _quality;
4788+
}
4789+
auto height = uint32(_chosenQuality->resolveVideoQuality());
4790+
if (_chosenQuality == _document && _streamed && _streamed->ready) {
4791+
const auto stream = _streamed->instance.info().video.size;
4792+
if (!stream.isEmpty()) {
4793+
height = std::max(height, uint32(std::min(stream.width(), stream.height())));
47834794
}
4784-
: _quality;
4795+
height += Media::kVideoQualityOriginalOffset;
4796+
}
4797+
return { .manual = _quality.manual, .height = height };
47854798
}
4786-
47874799
void OverlayWidget::playbackControlsQualityChanged(int quality) {
47884800
applyVideoQuality({
47894801
.manual = (quality > 0),

Telegram/SourceFiles/media/view/media_view_playback_controls.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ void PlaybackControls::saveQuality(int quality) {
224224

225225
void PlaybackControls::updateSpeedToggleQuality() {
226226
const auto quality = _delegate->playbackControlsCurrentQuality();
227-
_speedToggle->setQuality(_qualitiesList.empty() ? 0 : quality.height);
227+
_speedToggle->setQuality(quality.height);
228228
}
229229

230230
void PlaybackControls::updatePlaybackSpeed(float64 speed) {

Telegram/SourceFiles/media/view/media_view_playback_controls.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class PlaybackControls : public Ui::RpWidget {
6464
void updatePlayback(const Player::TrackState &state);
6565
void setLoadingProgress(int64 ready, int64 total);
6666
void setInFullScreen(bool inFullScreen);
67+
void updateSpeedToggleQuality();
6768
[[nodiscard]] bool hasMenu() const;
6869
[[nodiscard]] bool dragging() const;
6970

@@ -96,7 +97,6 @@ class PlaybackControls : public Ui::RpWidget {
9697
void saveSpeed(float64 speed);
9798

9899
void saveQuality(int quality);
99-
void updateSpeedToggleQuality();
100100

101101
const not_null<Delegate*> _delegate;
102102

0 commit comments

Comments
 (0)