@@ -1181,7 +1181,9 @@ QSize OverlayWidget::videoSize() const {
11811181 Expects (videoShown ());
11821182
11831183 const auto use = (_document && _chosenQuality != _document)
1184- ? _document->dimensions
1184+ // get dimentions using the selected quality
1185+ // not the original
1186+ ? _chosenQuality->dimensions
11851187 : _streamed->instance .info ().video .size ;
11861188 return flipSizeByRotation (use);
11871189}
@@ -4265,8 +4267,21 @@ void OverlayWidget::initStreamingThumbnail() {
42654267void OverlayWidget::streamingReady (Streaming::Information &&info) {
42664268 markStreamedReady ();
42674269 if (videoShown ()) {
4270+ if (_document && _streamed && _streamed->ready ) {
4271+ const auto targetDocument = _chosenQuality ? _chosenQuality : _document;
4272+ if (const auto video = targetDocument->video ()) {
4273+ video->realVideoSize = info.video .realSize ;
4274+ }
4275+ }
42684276 applyVideoSize ();
42694277 _streamedQualityChangeFrame = QImage ();
4278+ if (_streamed && _streamed->controls ) {
4279+ crl::on_main (_widget, [=] {
4280+ if (_streamed && _streamed->controls ) {
4281+ _streamed->controls ->updateSpeedToggleQuality ();
4282+ }
4283+ });
4284+ }
42704285 } else {
42714286 updateContentRect ();
42724287 }
@@ -4659,12 +4674,16 @@ void OverlayWidget::restartAtSeekPosition(crl::time position) {
46594674 }
46604675 const auto overrideDuration = _stories
46614676 || (_chosenQuality && _chosenQuality != _document);
4677+ const auto durationDocument = (_chosenQuality && _chosenQuality != _document)
4678+ ? _chosenQuality
4679+ : _document;
4680+
46624681 auto options = Streaming::PlaybackOptions{
46634682 .position = position,
46644683 .durationOverride = ((overrideDuration
4665- && _document
4666- && _document ->hasDuration ())
4667- ? _document ->duration ()
4684+ && durationDocument
4685+ && durationDocument ->hasDuration ())
4686+ ? durationDocument ->duration ()
46684687 : crl::time (0 )),
46694688 .hwAllowed = Core::App ().settings ().hardwareAcceleratedVideo (),
46704689 .seekable = !_stories,
@@ -4769,21 +4788,30 @@ std::vector<int> OverlayWidget::playbackControlsQualities() {
47694788 }
47704789 auto result = std::vector<int >();
47714790 result.reserve (list.size ());
4791+ auto seen = std::vector<int >();
47724792 for (const auto &quality : list) {
4773- result.push_back (quality->resolveVideoQuality ());
4793+ const auto res = quality->resolveVideoQuality ();
4794+ const auto value = (quality == _document)
4795+ ? (res + Media::kVideoQualityOriginalOffset )
4796+ : res;
4797+ if (!ranges::contains (seen, value)) {
4798+ result.push_back (value);
4799+ seen.push_back (value);
4800+ }
47744801 }
47754802 return result;
47764803}
47774804
47784805VideoQuality OverlayWidget::playbackControlsCurrentQuality () {
4779- return _chosenQuality
4780- ? VideoQuality{
4781- .manual = _quality.manual ,
4782- .height = uint32 (_chosenQuality->resolveVideoQuality ()),
4783- }
4784- : _quality;
4806+ if (!_chosenQuality) {
4807+ return _quality;
4808+ }
4809+ auto height = uint32 (_chosenQuality->resolveVideoQuality ());
4810+ if (_chosenQuality == _document) {
4811+ height += Media::kVideoQualityOriginalOffset ;
4812+ }
4813+ return { .manual = _quality.manual , .height = height };
47854814}
4786-
47874815void OverlayWidget::playbackControlsQualityChanged (int quality) {
47884816 applyVideoQuality ({
47894817 .manual = (quality > 0 ),
@@ -5085,6 +5113,7 @@ void OverlayWidget::updatePlaybackState() {
50855113 _streamedPosition = state.position ;
50865114 if (_streamed->controls ) {
50875115 _streamed->controls ->updatePlayback (state);
5116+ _streamed->controls ->updateSpeedToggleQuality ();
50885117 _touchbarTrackState.fire_copy (state);
50895118 updatePowerSaveBlocker (state);
50905119 }
0 commit comments