void ShmHolder::renderFrame(VideoFrame& src) noexcept { const auto width = src.width(); const auto height = src.height(); const auto format = VIDEO_PIXFMT_BGRA; const auto frameSize = videoFrameSize(format, width, height); if (!resizeArea(frameSize)) { RING_ERR("ShmHolder[%s]: could not resize area", openedName_.c_str()); return; } { VideoFrame dst; VideoScaler scaler; dst.setFromMemory(area_->data + area_->writeOffset, format, width, height); scaler.scale(src, dst); } { SemGuardLock lk {area_->mutex}; ++area_->frameGen; std::swap(area_->readOffset, area_->writeOffset); ::sem_post(&area_->frameGenMutex); } }
void SHMSink::render_frame(VideoFrame& src) { VideoFrame dst; VideoScaler scaler; const int width = src.getWidth(); const int height = src.getHeight(); const int format = VIDEO_PIXFMT_BGRA; size_t bytes = dst.getSize(width, height, format); shm_lock(); if (!resize_area(sizeof(SHMHeader) + bytes)) { ERROR("Could not resize area"); return; } dst.setDestination(shm_area_->data, width, height, format); scaler.scale(src, dst); #ifdef DEBUG_FPS const std::chrono::time_point<std::chrono::system_clock> currentTime = std::chrono::system_clock::now(); const std::chrono::duration<double> seconds = currentTime - lastFrameDebug_; frameCount_++; if (seconds.count() > 1) { DEBUG("%s: FPS %f", shm_name_.c_str(), frameCount_ / seconds.count()); frameCount_ = 0; lastFrameDebug_ = currentTime; } #endif shm_area_->buffer_size = bytes; shm_area_->buffer_gen++; sem_post(&shm_area_->notification); shm_unlock(); }