Fix crash in several video removed from video call.

This commit is contained in:
John Preston
2025-11-24 17:08:10 +04:00
parent b02ce599e6
commit c42864d35e
5 changed files with 14 additions and 9 deletions
@@ -791,13 +791,13 @@ void Viewport::updateTilesGeometryColumn(int outerWidth) {
top += height + st::groupCallVideoSmallSkip;
}
};
const auto topPeer = _large ? _large->row()->peer().get() : nullptr;
const auto topPeer = _large ? _large->peer().get() : nullptr;
const auto reorderNeeded = [&] {
if (!topPeer) {
return false;
}
for (const auto &tile : _tiles) {
if (tile.get() != _large && tile->row()->peer() == topPeer) {
if (tile.get() != _large && tile->peer() == topPeer) {
return (tile.get() != _tiles.front().get())
&& !tile->trackOrUserpicSize().isEmpty();
}
@@ -813,7 +813,7 @@ void Viewport::updateTilesGeometryColumn(int outerWidth) {
ranges::stable_partition(
_tilesForOrder,
[&](not_null<VideoTile*> tile) {
return (tile->row()->peer() == topPeer);
return (tile->peer() == topPeer);
});
for (const auto &tile : _tilesForOrder) {
layoutNext(tile);
@@ -460,7 +460,7 @@ void Viewport::RendererGL::validateUserpicFrame(
}
const auto size = tile->trackOrUserpicSize();
tileData.userpicFrame = PeerData::GenerateUserpicImage(
tile->row()->peer(),
tile->peer(),
tile->row()->ensureUserpicView(),
size.width(),
0);
@@ -1239,7 +1239,7 @@ void Viewport::RendererGL::validateDatas() {
j->stale = false;
const auto index = (j - begin(_tileData));
_tileDataIndices[i] = index;
const auto peer = tiles[i]->row()->peer();
const auto peer = tiles[i]->peer();
if ((j->peer != peer)
|| (j->nameVersion != peer->nameVersion())
|| (j->nameRect.width() != width)) {
@@ -1263,7 +1263,7 @@ void Viewport::RendererGL::validateDatas() {
continue;
}
const auto id = quintptr(tiles[i]->track().get());
const auto peer = tiles[i]->row()->peer();
const auto peer = tiles[i]->peer();
const auto paused = (tiles[i]->track()->state()
== Webrtc::VideoState::Paused);
auto index = int(_tileData.size());
@@ -82,7 +82,7 @@ void Viewport::RendererSW::validateUserpicFrame(
const auto size = tile->trackOrUserpicSize();
data.userpicFrame = Images::BlurLargeImage(
PeerData::GenerateUserpicImage(
tile->row()->peer(),
tile->peer(),
tile->row()->ensureUserpicView(),
size.width(),
0),
@@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "calls/group/calls_group_viewport_tile.h"
#include "calls/group/calls_group_members_row.h"
#include "webrtc/webrtc_video_track.h"
#include "lang/lang_keys.h"
#include "ui/round_rect.h"
@@ -33,11 +34,11 @@ Viewport::VideoTile::VideoTile(
: _endpoint(endpoint)
, _update(std::move(update))
, _track(std::move(track))
, _peer(_track.row->peer())
, _trackSize(std::move(trackSize))
, _rtmp(endpoint.rtmp())
, _self(self) {
Expects(_track.track != nullptr);
Expects(_track.row != nullptr);
using namespace rpl::mappers;
_track.track->stateValue(
@@ -37,6 +37,9 @@ public:
[[nodiscard]] not_null<MembersRow*> row() const {
return _track.row;
}
[[nodiscard]] not_null<PeerData*> peer() const {
return _peer;
}
[[nodiscard]] bool rtmp() const {
return _rtmp;
}
@@ -113,8 +116,9 @@ private:
const VideoEndpoint _endpoint;
const Fn<void()> _update;
const VideoTileTrack _track;
const not_null<PeerData*> _peer;
VideoTileTrack _track;
QRect _geometry;
TileAnimation _animation;
rpl::variable<QSize> _trackSize;