Captura e buffers
Qt6/DBus acessa o portal XDG ScreenCast; PipeWire entrega buffers em thread própria. A engine encaminha FD, dimensões, stride, formato SPA e DRM modifier ao encoder e devolve o buffer ao stream após o callback. AVDRMFrameDescriptor descreve o DMA-BUF. A duplicação do FD mantém a referência ao buffer durante seu processamento.
Encoders e conversão de cor
CudaEncoder usa FFmpeg h264_nvenc, contexto CUDA e superfícies NV12. IntelIrisEncoder configura h264_qsv e pool de 32 superfícies QSV. Ambos contêm mapeamento DRM PRIME por av_hwframe_map. No fallback MemFd da NVIDIA, libswscale converte pixels na CPU antes do upload por av_hwframe_transfer_data; a próxima etapa é levar a conversão de cor integral à GPU.
Decoders e alternativas
CudaDecoder seleciona h264_cuvid e negocia AV_PIX_FMT_CUDA para entregar frames na GPU. O módulo Intel usa h264_qsv e contém mapeamento DRM PRIME, mas também transfere o frame para RAM. SoftwareDecoder usa AV_CODEC_ID_H264 e libswscale para NV12. A seleção automática de codecs e a integração entre variantes compõem as próximas etapas.
Sincronização CPU–GPU
std::mutex serializa a substituição e leitura do frame; av_frame_clone mantém suas referências. O renderer registra texturas OpenGL de SDL3, mapeia Y/UV e usa cudaMemcpy2DToArrayAsync com cudaMemcpyDeviceToDevice. Após desmapear, cudaStreamSynchronize(0) aguarda a conclusão antes do desenho. Essa espera coordena a thread da CPU com a conclusão das cópias na GPU antes da apresentação.
Transporte e tempo
O código usa libdatachannel, diferente da libwebrtc citada no blueprint inicial. NAL units H.264 são packetizadas em RTP, com RTCP Sender Reports e NACK no host; o cliente depacketiza e solicita keyframe ao abrir a track. O timestamp avança 90.000/FPS. Uma condition_variable aguarda a track abrir antes do envio: coordenação de rede, separada da disponibilidade local do frame no renderer.
Bibliotecas por responsabilidade
FFmpeg: libavcodec/libavutil para codecs e contextos de hardware, libswscale para conversão na CPU; libavfilter integra as dependências da camada de filtros. PipeWire/SPA, Qt6/DBus, libdrm e EGL/GBM cobrem captura e formatos Linux. CUDA e QSV/libmfx/libva sustentam variantes de hardware; SDL3/OpenGL apresenta os frames, libdatachannel transporta mídia e nlohmann/json serializa mensagens.