feat(streamer): add ffmpeg encoder and mcap recording

This commit is contained in:
2026-03-10 22:12:22 +08:00
parent 769d36f86f
commit 6af97ee5d3
86 changed files with 30551 additions and 1482 deletions
@@ -0,0 +1,18 @@
#pragma once
#include "cvmmap_streamer/config/runtime_config.hpp"
#include <cstdint>
#include <vector>
namespace cvmmap_streamer::encode {
struct EncodedAccessUnit {
CodecType codec{CodecType::H264};
std::uint64_t source_timestamp_ns{0};
std::uint64_t stream_pts_ns{0};
bool keyframe{false};
std::vector<std::uint8_t> annexb_bytes{};
};
}
@@ -0,0 +1,54 @@
#pragma once
#include "cvmmap_streamer/config/runtime_config.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>
namespace cvmmap_streamer::encode {
struct RawVideoFrame {
ipc::FrameInfo info{};
std::uint64_t source_timestamp_ns{0};
std::span<const std::uint8_t> bytes{};
};
class EncoderBackend {
public:
virtual ~EncoderBackend() = default;
[[nodiscard]]
virtual std::string_view backend_name() const = 0;
[[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;
};
[[nodiscard]]
std::expected<std::unique_ptr<EncoderBackend>, std::string> make_encoder_backend(const RuntimeConfig &config);
}