#pragma once #include "../../../src/call/call_video.h" #include #include #include // Один RX worker. Независимые submit/receive сохраняют PTS при задержанном выходе. // Automatic использует проверенный capabilities() GPU, затем четыре CPU slice-потока. class CallVideoDecoder { public: enum class Backend { Automatic, HardwareOnly, SoftwareOnly }; explicit CallVideoDecoder(Backend backend = Backend::Automatic); ~CallVideoDecoder(); // 1 — принят/получен, 0 — занят/ещё не готов, -1 — ошибка с подробностями в логе. // При submit=0 владелец сохраняет исходный frame. receive отдаёт metadata без data. int submit(const call_video_frame& frame); int receive(call_video_frame& frame, QImage& image); int finish(); // EOS: 1 принят, 0 нужно сначала получить выход, -1 ошибка. unsigned pendingFrames() const; unsigned pipelineFrames() const; // Минимальный входной pipeline, измеренный отдельной paced пробой. bool hardware() const; QString error() const; void useSoftware(); // После реального отказа устройства: следующий KEY открывает CPU, без повторной GPU пробы. void close(); // running отменяет длительную пробу при stop; незавершённый результат не кэшируется. static call_video_caps capabilities(const std::atomic* running = nullptr); private: struct Impl; std::unique_ptr m; };