Files
utun2/tools/chatgui/src/call_camera_source.h
T

35 lines
2.8 KiB
C++

/* Backend камеры внутри изолированного worker-процесса; интерфейс для Qt и тестовых источников.
* Управление/опрос идут в потоке Qt worker event loop и могут блокироваться в драйвере: watchdog GUI завершит процесс.
* Сигнал frame может приходить из потока backend; worker забирает последний кадр и конвертирует вне callback. */
#pragma once
#include "call_camera_capture.h"
#ifdef HAVE_STREAM_CAPTURE
#include <QVideoFrame>
#include <functional>
#include <memory>
class CallCameraSource : public QObject {
Q_OBJECT
public:
/* Возвращает текущий полный список с аппаратными размерами/FPS передачи, допустимыми для звонка. */
virtual CallCameraDevices devices() = 0;
/* Запрашивает точный device/размер и предел FPS выдачи; worker вызывает stop перед каждым start.
* true — запуск принят, готовность наступает с frame; отказ/асинхронная ошибка сообщаются также сигналом error.
* Сам return false не создаёт IPC-ошибку. Qt backend выбирает подходящий формат без масштабирования кадров. */
virtual bool start(const QByteArray& device, int width, int height, int fps) = 0;
/* Освобождает захват; должен допускать вызов без успешного start и повтор при уничтожении worker. */
virtual void stop() = 0;
signals:
/* Запрашивает повторный опрос devices, не несёт сам список. */
void devicesChanged();
/* Заимствованный на callback QVideoFrame; получатель сохраняет копию Qt-объекта, не указатель на аргумент. */
void frame(const QVideoFrame& frame);
/* Текст ошибки, передаётся GUI с поколением активной конфигурации. */
void error(const QString& message);
};
/* Забирает ненулевой source, подключается к endpoint GUI и выполняет QCoreApplication::exec.
* Qt application уже должен существовать, event loop ещё не запущен; возвращает его exit code.
* При выходе останавливает/уничтожает backend; предназначен только для отдельного процесса. */
int call_camera_worker_run(const QString& endpoint, std::unique_ptr<CallCameraSource> source);
#endif