/* 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 #include #include 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 source); #endif