Keep UVC camera frame rate stable during video calls
This commit is contained in:
1 parent
459b1ecc01
commit
f84b24806e
2 files changed
+70
No files matched your search
@@ -2,6 +2,7 @@
|
||||
#include "call_video_encoder.h"
|
||||
#include "call_video_decoder.h"
|
||||
#include "call_video_cadence.h"
|
||||
#include "call_camera_rate.h"
|
||||
#include "../../../src/call/call_video_port.h"
|
||||
#include "../../../src/call/call_audio.h"
|
||||
#include "debug_config.h"
|
||||
@@ -48,6 +49,7 @@ struct CallVideoEngine::Impl {
|
||||
std::unique_ptr<QCamera> camera;
|
||||
std::unique_ptr<QMediaCaptureSession> capture;
|
||||
std::unique_ptr<QVideoSink> sink;
|
||||
CallCameraRate cameraRate;
|
||||
QVideoFrame raw;
|
||||
#endif
|
||||
};
|
||||
@@ -105,6 +107,7 @@ void CallVideoEngine::closeCamera() {
|
||||
#ifdef HAVE_STREAM_CAPTURE
|
||||
if (m->sink) disconnect(m->sink.get(), nullptr, this, nullptr);
|
||||
if (m->camera) { disconnect(m->camera.get(), nullptr, this, nullptr); m->camera->stop(); }
|
||||
m->cameraRate.restore();
|
||||
m->capture.reset(); m->camera.reset(); m->sink.reset();
|
||||
{ std::lock_guard<std::mutex> guard(m->lock); m->raw = {}; m->pts = m->backend = m->anchor = -1; }
|
||||
#endif
|
||||
@@ -141,6 +144,10 @@ void CallVideoEngine::setVideo(bool enabled, const QByteArray& cameraId, int wid
|
||||
DEBUG_INFO(DEBUG_CATEGORY_CALL, "call camera selected device=%s size=%dx%d pixel=%d fps=%.3f..%.3f",
|
||||
selected.id().constData(), selectedFormat.resolution().width(), selectedFormat.resolution().height(),
|
||||
selectedFormat.pixelFormat(), selectedFormat.minFrameRate(), selectedFormat.maxFrameRate());
|
||||
connect(m->camera.get(), &QCamera::activeChanged, this, [this, device = selected.id()](bool active) {
|
||||
if (active) m->cameraRate.activate(device);
|
||||
else m->cameraRate.restore();
|
||||
});
|
||||
connect(m->sink.get(), &QVideoSink::videoFrameChanged, this, [this, revision](const QVideoFrame& frame) {
|
||||
if (!frame.isValid() || !m->running) return;
|
||||
std::lock_guard<std::mutex> guard(m->lock);
|
||||
|
||||
Reference in new issue
Block a user