VNC-151 Refactor video encoding logic in EncodeManager

Moved video encoding updates to a dedicated updateVideo method. Simplified related conditional logic and reduced code duplication by consolidating encoder management.
This commit is contained in:
El 2025-12-12 08:47:33 +00:00
parent 64ce9ee8e5
commit 464510f91b
No known key found for this signature in database
GPG key ID: 205388FEB607950A
2 changed files with 51 additions and 35 deletions

View file

@ -185,18 +185,16 @@ EncodeManager::EncodeManager(SConnection *conn_, EncCache *encCache_, const FFmp
encoders[encoderZRLE] = new ZRLEEncoder(conn);
if (ffmpeg_available) {
const VideoEncoderParams encoder_params = {conn_->cp.width,
conn_->cp.height,
static_cast<uint8_t>(Server::frameRate),
static_cast<uint8_t>(Server::groupOfPicture),
static_cast<uint8_t>(Server::videoQualityCRFCQP)};
encoders[encoderKasmVideo] = new ScreenEncoderManager(ffmpeg,
encoder_probe.get_best_encoder(),
encoder_probe.get_available_encoders(),
conn,
encoder_probe.get_drm_device_path(),
encoder_params);
{conn_->cp.width,
conn_->cp.height,
static_cast<uint8_t>(Server::frameRate),
static_cast<uint8_t>(Server::groupOfPicture),
static_cast<uint8_t>(Server::videoQualityCRFCQP)});
}
video_mode_available = ffmpeg_available && Server::videoCodec[0];
@ -441,35 +439,12 @@ void EncodeManager::doUpdate(bool allowLossy, const Region& changed_,
writeCopyRects(copied, copyDelta);
writeCopyPassRects(copypassed);
if (video_mode_available && conn->cp.encoder != KasmVideoEncoders::Encoder::unavailable) {
auto *screen_encoder_manager = dynamic_cast<ScreenEncoderManager<> *>(encoders[encoderKasmVideo]);
if (screen_encoder_manager) {
if (screen_encoder_manager->get_encoder() != conn->cp.encoder) {
delete encoders[encoderKasmVideo];
bool video_mode = video_mode_available && conn->cp.encoder != KasmVideoEncoders::Encoder::unavailable;
if (video_mode) {
video_mode = updateVideo(changed, layout, pb);
}
const VideoEncoderParams encoder_params = {0,
0,
static_cast<uint8_t>(Server::frameRate),
static_cast<uint8_t>(Server::groupOfPicture),
static_cast<uint8_t>(Server::videoQualityCRFCQP)};
encoders[encoderKasmVideo] = new ScreenEncoderManager(ffmpeg,
conn->cp.encoder,
encoder_probe.get_available_encoders(),
conn,
encoder_probe.get_drm_device_path(),
encoder_params);
}
if (screen_encoder_manager->sync_layout(layout, changed)) {
static const Palette palette;
screen_encoder_manager->writeRect(pb, palette);
}
}
std::vector<Rect> rects;
changed.get_rects(&rects);
updateVideoStats(rects, pb);
} else {
if (!video_mode) {
/*
* We start by searching for solid rects, which are then removed
* from the changed region.
@ -505,6 +480,44 @@ void EncodeManager::doUpdate(bool allowLossy, const Region& changed_,
conn->writer()->writeFramebufferUpdateEnd();
}
bool EncodeManager::updateVideo(const Region &changed, const ScreenSet &layout, const PixelBuffer *pb) {
auto *screen_encoder_manager = dynamic_cast<ScreenEncoderManager<> *>(encoders[encoderKasmVideo]);
if (!screen_encoder_manager)
return false;
if (screen_encoder_manager->get_encoder() != conn->cp.encoder) {
delete encoders[encoderKasmVideo];
screen_encoder_manager = new ScreenEncoderManager(ffmpeg,
conn->cp.encoder,
encoder_probe.get_available_encoders(),
conn,
encoder_probe.get_drm_device_path(),
{0,
0,
static_cast<uint8_t>(Server::frameRate),
static_cast<uint8_t>(Server::groupOfPicture),
static_cast<uint8_t>(Server::videoQualityCRFCQP)});
if (!screen_encoder_manager)
return false;
encoders[encoderKasmVideo] = screen_encoder_manager;
}
if (!screen_encoder_manager->sync_layout(layout, changed))
return false;
static const Palette palette;
screen_encoder_manager->writeRect(pb, palette);
std::vector<Rect> rects;
changed.get_rects(&rects);
updateVideoStats(rects, pb);
return true;
}
void EncodeManager::prepareEncoders(bool allowLossy)
{
enum EncoderClass solid, bitmap, bitmapRLE;

View file

@ -106,6 +106,9 @@ namespace rfb {
const ScreenSet &layout,
const PixelBuffer* pb,
const RenderedCursor* renderedCursor);
bool updateVideo(const Region& changed, const ScreenSet &layout, const PixelBuffer* pb);
void prepareEncoders(bool allowLossy);
Region getLosslessRefresh(const Region& req, size_t maxUpdateSize);