refactor(streamer): adopt proxy backends and typed statuses

This commit is contained in:
2026-03-10 23:29:59 +08:00
parent 6af97ee5d3
commit 0ad6887095
22 changed files with 1686 additions and 275 deletions
@@ -1,17 +1,17 @@
#pragma once
#include "cvmmap_streamer/config/runtime_config.hpp"
#include "cvmmap_streamer/core/status.hpp"
#include "cvmmap_streamer/encode/encoded_access_unit.hpp"
#include "cvmmap_streamer/ipc/contracts.hpp"
#include <cstdint>
#include <expected>
#include <memory>
#include <span>
#include <string>
#include <string_view>
#include <vector>
#include <proxy/proxy.h>
namespace cvmmap_streamer::encode {
struct RawVideoFrame {
@@ -20,35 +20,31 @@ struct RawVideoFrame {
std::span<const std::uint8_t> bytes{};
};
class EncoderBackend {
public:
virtual ~EncoderBackend() = default;
PRO_DEF_MEM_DISPATCH(MemBackendName, backend_name);
PRO_DEF_MEM_DISPATCH(MemUsingHardware, using_hardware);
PRO_DEF_MEM_DISPATCH(MemInit, init);
PRO_DEF_MEM_DISPATCH(MemStreamInfo, stream_info);
PRO_DEF_MEM_DISPATCH(MemPoll, poll);
PRO_DEF_MEM_DISPATCH(MemPushFrame, push_frame);
PRO_DEF_MEM_DISPATCH(MemDrain, drain);
PRO_DEF_MEM_DISPATCH(MemFlush, flush);
PRO_DEF_MEM_DISPATCH(MemShutdown, shutdown);
[[nodiscard]]
virtual std::string_view backend_name() const = 0;
struct EncoderBackendFacade : pro::facade_builder
::add_convention<MemBackendName, std::string_view() const>
::add_convention<MemUsingHardware, bool() const>
::add_convention<MemInit, Status(const RuntimeConfig &, const ipc::FrameInfo &)>
::add_convention<MemStreamInfo, Result<EncodedStreamInfo>() const>
::add_convention<MemPoll, Status()>
::add_convention<MemPushFrame, Status(const RawVideoFrame &)>
::add_convention<MemDrain, Result<std::vector<EncodedAccessUnit>>()>
::add_convention<MemFlush, Result<std::vector<EncodedAccessUnit>>()>
::add_convention<MemShutdown, void()>
::build {};
[[nodiscard]]
virtual bool using_hardware() const = 0;
[[nodiscard]]
virtual std::expected<void, std::string> init(const RuntimeConfig &config, const ipc::FrameInfo &frame_info) = 0;
[[nodiscard]]
virtual std::expected<void, std::string> poll() = 0;
[[nodiscard]]
virtual std::expected<void, std::string> push_frame(const RawVideoFrame &frame) = 0;
[[nodiscard]]
virtual std::expected<std::vector<EncodedAccessUnit>, std::string> drain() = 0;
[[nodiscard]]
virtual std::expected<std::vector<EncodedAccessUnit>, std::string> flush() = 0;
virtual void shutdown() = 0;
};
using EncoderBackend = pro::proxy<EncoderBackendFacade>;
[[nodiscard]]
std::expected<std::unique_ptr<EncoderBackend>, std::string> make_encoder_backend(const RuntimeConfig &config);
Result<EncoderBackend> make_encoder_backend(const RuntimeConfig &config);
}