Blurred frame while paused.

This commit is contained in:
John Preston 2024-10-21 18:15:24 +04:00
parent 4142ada729
commit c8d4818d22
2 changed files with 47 additions and 17 deletions

View file

@ -29,6 +29,7 @@ constexpr auto kVideoBitRate = 3 * 1024 * 1024;
constexpr auto kMinDuration = crl::time(200); constexpr auto kMinDuration = crl::time(200);
constexpr auto kMaxDuration = 60 * crl::time(1000); constexpr auto kMaxDuration = 60 * crl::time(1000);
constexpr auto kInitTimeout = 5 * crl::time(1000); constexpr auto kInitTimeout = 5 * crl::time(1000);
constexpr auto kBlurredSize = 64;
using namespace FFmpeg; using namespace FFmpeg;
@ -978,16 +979,16 @@ void RoundVideoRecorder::hide(Fn<void(RoundVideoResult)> done) {
} }
void RoundVideoRecorder::progressTo(float64 progress) { void RoundVideoRecorder::progressTo(float64 progress) {
if (_progress == progress) { if (_progress == progress || _paused) {
return; return;
} else if (_progress > 0.001) { } else if (_progressReceived) {
_progressAnimation.start( _progressAnimation.start(
[=] { _preview->update(); }, [=] { _preview->update(); },
_progress, _progress,
progress, progress,
kUpdateEach * 1.1); kUpdateEach * 1.1);
} } else {
if (!_progress) { _progressReceived = true;
_fadeContentAnimation.start( _fadeContentAnimation.start(
[=] { _preview->update(); }, [=] { _preview->update(); },
0., 0.,
@ -998,11 +999,15 @@ void RoundVideoRecorder::progressTo(float64 progress) {
_preview->update(); _preview->update();
} }
void RoundVideoRecorder::prepareFrame() { void RoundVideoRecorder::prepareFrame(bool blurred) {
if (_frameOriginal.isNull() || _preparedIndex == _lastAddedIndex) { if (_frameOriginal.isNull()) {
return;
} else if (!blurred) {
if (_preparedIndex == _lastAddedIndex) {
return; return;
} }
_preparedIndex = _lastAddedIndex; _preparedIndex = _lastAddedIndex;
}
const auto owidth = _frameOriginal.width(); const auto owidth = _frameOriginal.width();
const auto oheight = _frameOriginal.height(); const auto oheight = _frameOriginal.height();
@ -1020,12 +1025,27 @@ void RoundVideoRecorder::prepareFrame() {
_frameOriginal.format()); _frameOriginal.format());
const auto ratio = style::DevicePixelRatio(); const auto ratio = style::DevicePixelRatio();
if (blurred) {
static constexpr auto kRadius = 16;
_framePlaceholder = Images::Circle(
Images::BlurLargeImage(
copy.scaled(
QSize(kBlurredSize, kBlurredSize),
Qt::KeepAspectRatio,
Qt::FastTransformation),
kRadius
).scaled(
QSize(_side, _side) * ratio,
Qt::KeepAspectRatio,
Qt::SmoothTransformation));
_framePlaceholder.setDevicePixelRatio(ratio);
} else {
_framePrepared = Images::Circle(copy.scaled( _framePrepared = Images::Circle(copy.scaled(
_side * ratio, QSize(_side, _side) * ratio,
_side * ratio,
Qt::KeepAspectRatio, Qt::KeepAspectRatio,
Qt::SmoothTransformation)); Qt::SmoothTransformation));
_framePrepared.setDevicePixelRatio(ratio); _framePrepared.setDevicePixelRatio(ratio);
}
} }
void RoundVideoRecorder::createImages() { void RoundVideoRecorder::createImages() {
@ -1093,12 +1113,14 @@ void RoundVideoRecorder::setup() {
} }
p.drawImage(raw->rect(), _shadow); p.drawImage(raw->rect(), _shadow);
const auto inner = QRect(_extent, _extent, _side, _side); const auto inner = QRect(_extent, _extent, _side, _side);
if (!_progress) { const auto fading = _fadeContentAnimation.animating();
if (!_progressReceived && !fading) {
p.drawImage(inner, _framePlaceholder); p.drawImage(inner, _framePlaceholder);
} else { } else {
if (_fadeContentAnimation.animating()) { if (fading) {
p.drawImage(inner, _framePlaceholder); p.drawImage(inner, _framePlaceholder);
p.setOpacity(opacity * _fadeContentAnimation.value(1.)); const auto to = _progressReceived ? 1. : 0.;
p.setOpacity(opacity * _fadeContentAnimation.value(to));
} }
p.drawImage(inner, _framePrepared); p.drawImage(inner, _framePrepared);
@ -1162,6 +1184,13 @@ void RoundVideoRecorder::pause(Fn<void(RoundVideoResult)> done) {
}); });
} }
_paused = true; _paused = true;
prepareFrame(true);
_progressReceived = false;
_fadeContentAnimation.start(
[=] { _preview->update(); },
1.,
0.,
crl::time(200));
_descriptor.track->setState(Webrtc::VideoState::Inactive); _descriptor.track->setState(Webrtc::VideoState::Inactive);
_preview->update(); _preview->update();
} }

View file

@ -69,7 +69,7 @@ private:
class Private; class Private;
void setup(); void setup();
void prepareFrame(); void prepareFrame(bool blurred = false);
void createImages(); void createImages();
void progressTo(float64 progress); void progressTo(float64 progress);
void fade(bool visible); void fade(bool visible);
@ -90,6 +90,7 @@ private:
int _side = 0; int _side = 0;
int _progressStroke = 0; int _progressStroke = 0;
int _extent = 0; int _extent = 0;
bool _progressReceived = false;
bool _visible = false; bool _visible = false;
bool _paused = false; bool _paused = false;