Improve fullscreen RTMP streams.

This commit is contained in:
John Preston 2022-03-15 19:41:16 +04:00
parent b087688349
commit bde3da53b6
7 changed files with 58 additions and 17 deletions

View file

@ -92,7 +92,9 @@ Panel::Panel(not_null<GroupCall*> call)
#ifndef Q_OS_MAC
, _controls(Ui::Platform::SetupSeparateTitleControls(
window(),
st::callTitle))
st::groupCallTitle,
nullptr,
_controlsTop.value()))
#endif // !Q_OS_MAC
, _powerSaveBlocker(std::make_unique<base::PowerSaveBlocker>(
base::PowerSaveBlockType::PreventDisplaySleep,
@ -802,7 +804,9 @@ void Panel::setupMembers() {
setupVideo(_viewport.get());
setupVideo(_members->viewport());
_viewport->mouseInsideValue(
) | rpl::start_with_next([=](bool inside) {
) | rpl::filter([=] {
return !_fullScreenOrMaximized.current();
}) | rpl::start_with_next([=](bool inside) {
toggleWideControls(inside);
}, _viewport->lifetime());
@ -1027,6 +1031,7 @@ void Panel::updateWideControlsVisibility() {
if (_wideControlsShown == shown) {
return;
}
_viewport->setCursorShown(!_fullScreenOrMaximized.current() || shown);
_wideControlsShown = shown;
_wideControlsAnimation.start(
[=] { updateButtonsGeometry(); },
@ -1168,6 +1173,12 @@ void Panel::createPinOnTop() {
};
_fullScreenOrMaximized.value(
) | rpl::start_with_next([=](bool fullScreenOrMaximized) {
#ifndef Q_OS_MAC
_controls->controls.setStyle(fullScreenOrMaximized
? st::callTitle
: st::groupCallTitle);
#endif // Q_OS_MAC
_pinOnTop->setVisible(!fullScreenOrMaximized);
if (fullScreenOrMaximized) {
pin(false);
@ -1853,7 +1864,9 @@ void Panel::trackControl(Ui::RpWidget *widget, rpl::lifetime &lifetime) {
}
void Panel::trackControlOver(not_null<Ui::RpWidget*> control, bool over) {
if (_stickedTooltipClose) {
if (_fullScreenOrMaximized.current()) {
return;
} else if (_stickedTooltipClose) {
if (!over) {
return;
}
@ -2428,13 +2441,14 @@ void Panel::refreshTitleGeometry() {
? st::groupCallTitleTop
: (st::groupCallWideVideoTop
- st::groupCallTitleLabel.style.font->height) / 2;
const auto shown = _fullScreenOrMaximized.current()
? _wideControlsAnimation.value(
_wideControlsShown ? 1. : 0.)
: 1.;
const auto top = anim::interpolate(
-_title->height() - st::boxRadius,
shownTop,
(_fullScreenOrMaximized.current()
? _wideControlsAnimation.value(
_wideControlsShown ? 1. : 0.)
: 1.));
shown);
const auto left = titleRect.x();
const auto notEnough = std::max(0, best - titleRect.width());
@ -2493,6 +2507,10 @@ void Panel::refreshTitleGeometry() {
} else {
layout(left + titleRect.width() - best);
}
#ifndef Q_OS_MAC
_controlsTop = anim::interpolate(-_controls->wrap.height(), 0, shown);
#endif // Q_OS_MAC
}
void Panel::refreshTitleColors() {

View file

@ -204,6 +204,7 @@ private:
rpl::variable<bool> _fullScreenOrMaximized = false;
#ifndef Q_OS_MAC
rpl::variable<int> _controlsTop = 0;
const std::unique_ptr<Ui::Platform::SeparateTitleControls> _controls;
#endif // !Q_OS_MAC

View file

@ -226,6 +226,13 @@ void Viewport::setControlsShown(float64 shown) {
widget()->update();
}
void Viewport::setCursorShown(bool shown) {
if (_cursorHidden == shown) {
_cursorHidden = !shown;
updateCursor();
}
}
void Viewport::add(
const VideoEndpoint &endpoint,
VideoTileTrack track,
@ -798,7 +805,11 @@ void Viewport::setSelected(Selection value) {
void Viewport::updateCursor() {
const auto pointer = _selected.tile && (!wide() || _hasTwoOrMore);
widget()->setCursor(pointer ? style::cur_pointer : style::cur_default);
widget()->setCursor(_cursorHidden
? Qt::BlankCursor
: pointer
? style::cur_pointer
: style::cur_default);
}
void Viewport::setPressed(Selection value) {

View file

@ -71,6 +71,7 @@ public:
void setMode(PanelMode mode, not_null<QWidget*> parent);
void setControlsShown(float64 shown);
void setCursorShown(bool shown);
void setGeometry(bool fullscreen, QRect geometry);
void resizeToWidth(int newWidth);
void setScrollTop(int scrollTop);
@ -176,6 +177,7 @@ private:
rpl::variable<int> _fullHeight = 0;
bool _hasTwoOrMore = false;
bool _fullscreen = false;
bool _cursorHidden = false;
int _scrollTop = 0;
QImage _shadow;
rpl::event_stream<VideoEndpoint> _clicks;

View file

@ -185,12 +185,11 @@ uniform sampler2D n_texture;
return {
.header = R"(
uniform vec4 frameBg;
uniform vec3 shadow; // fullHeight, shown, maxOpacity
uniform vec4 shadow; // fullHeight, shown, maxOpacity, blur opacity
uniform float paused; // 0. <-> 1.
)" + blur.header + round.header + noise.header + R"(
const float backgroundOpacity = )" + QString::number(kBlurOpacity) + R"(;
const float noiseGrain = )" + QString::number(kDitherNoiseAmount) + R"(;
float insideTexture() {
@ -211,6 +210,7 @@ vec4 background() {
)",
.body = R"(
float inside = insideTexture() * (1. - paused);
float backgroundOpacity = shadow.w;
result = result * inside
+ (1. - inside) * (backgroundOpacity * background()
+ (1. - backgroundOpacity) * frameBg);
@ -780,7 +780,9 @@ void Viewport::RendererGL::paintTile(
const auto uniformViewport = QSizeF(_viewport * _factor);
program->setUniformValue("viewport", uniformViewport);
program->setUniformValue("frameBg", st::groupCallBg->c);
program->setUniformValue(
"frameBg",
fullscreen ? QColor(0, 0, 0) : st::groupCallBg->c);
program->setUniformValue("radiusOutline", QVector2D(
GLfloat(st::roundRadiusLarge * _factor * (fullscreen ? 0. : 1.)),
(outline > 0) ? (st::groupCallOutline * _factor) : 0.f));
@ -794,9 +796,11 @@ void Viewport::RendererGL::paintTile(
const auto shadowHeight = st.shadowHeight * _factor;
const auto shadowAlpha = kShadowMaxAlpha / 255.f;
program->setUniformValue(
"shadow",
QVector3D(shadowHeight, shown, shadowAlpha));
program->setUniformValue("shadow", QVector4D(
shadowHeight,
shown,
shadowAlpha,
fullscreen ? 0. : kBlurOpacity));
program->setUniformValue("paused", GLfloat(paused));
f.glActiveTexture(_rgbaFrame ? GL_TEXTURE1 : GL_TEXTURE3);

View file

@ -51,8 +51,10 @@ void Viewport::RendererSW::paintFallback(
}
paintTile(p, tile.get(), bounding, bg);
}
const auto fullscreen = _owner->_fullscreen;
const auto color = fullscreen ? QColor(0, 0, 0) : st::groupCallBg->c;
for (const auto &rect : bg) {
p.fillRect(rect, st::groupCallBg);
p.fillRect(rect, color);
}
for (auto i = _tileData.begin(); i != _tileData.end();) {
if (i->second.stale) {
@ -113,10 +115,13 @@ void Viewport::RendererSW::paintTile(
const auto frameRotation = _userpicFrame ? 0 : data.rotation;
Assert(!image.isNull());
const auto background = _owner->_fullscreen
? QColor(0, 0, 0)
: st::groupCallMembersBg->c;
const auto fill = [&](QRect rect) {
const auto intersected = rect.intersected(clip);
if (!intersected.isEmpty()) {
p.fillRect(intersected, st::groupCallMembersBg);
p.fillRect(intersected, background);
bg -= intersected;
}
};

@ -1 +1 @@
Subproject commit ba40979470132db759fe8b8e7ff8ca70845f92c1
Subproject commit d98c3d539b0eb7c00f664c445ab4194c28e8cef7