Program Listing for File gstreamer_pipeline.ixx

Program Listing for File gstreamer_pipeline.ixx#

Return to documentation for file (Src/gstreamer_pipeline.ixx)

module;

#include "kataglyphis_export.h"
#include <cstddef>
#include <cstdint>
#include <expected>
#include <filesystem>
#include <functional>
#include <memory>
#include <string>
#include <vector>

export module kataglyphis.gstreamer_pipeline;

export namespace kataglyphis::gstreamer {

enum class GStreamerError {
    InitializationFailed,
    PipelineCreationFailed,
    ElementCreationFailed,
    LinkFailed,
    StateChangeFailed,
    BufferAllocationFailed,
    CapsNegotiationFailed,
    StreamError,
    InvalidParameter,
    ResourceNotFound
};

struct TensorMeta
{
    std::size_t tensor_index{ 0 };
    std::size_t num_tensors{ 0 };
    std::vector<std::size_t> dimensions;
    int data_type{ 0 };
};

struct FrameMetadata
{
    std::uint32_t width{ 0 };
    std::uint32_t height{ 0 };
    std::uint32_t fps_n{ 0 };
    std::uint32_t fps_d{ 1 };
    std::string format;
    std::uint64_t timestamp_ns{ 0 };
    std::uint64_t duration_ns{ 0 };
};

struct BufferInfo
{
    void *data{ nullptr };
    std::size_t size{ 0 };
    FrameMetadata metadata;
    std::vector<TensorMeta> tensors;
};

using BufferCallback = std::function<void(const BufferInfo &)>;

struct PipelineConfig
{
    std::string pipeline_description;
    bool enable_tensor_meta{ false };
    bool synchronous_mode{ true };
    std::uint32_t timeout_ms{ 5000 };
};

class KATAGLYPHIS_CPP_API GStreamerPipeline
{
  public:
    GStreamerPipeline();
    ~GStreamerPipeline();

    GStreamerPipeline(const GStreamerPipeline &) = delete;
    auto operator=(const GStreamerPipeline &) -> GStreamerPipeline & = delete;
    GStreamerPipeline(GStreamerPipeline &&) noexcept;
    auto operator=(GStreamerPipeline &&) noexcept -> GStreamerPipeline &;

    [[nodiscard]] static auto initialize_gstreamer(int *argc = nullptr, char ***argv = nullptr)
      -> std::expected<void, GStreamerError>;

    static auto deinitialize_gstreamer() -> void;

    [[nodiscard]] auto create_pipeline(const PipelineConfig &config) -> std::expected<void, GStreamerError>;

    [[nodiscard]] auto create_pipeline_from_string(const std::string &description)
      -> std::expected<void, GStreamerError>;

    [[nodiscard]] auto create_inference_pipeline(const std::string &input_source,
      const std::string &model_path,
      const std::vector<std::size_t> &input_shape,
      const std::string &output_format = "RAW") -> std::expected<void, GStreamerError>;

    [[nodiscard]] auto start() -> std::expected<void, GStreamerError>;
    [[nodiscard]] auto stop() -> std::expected<void, GStreamerError>;
    [[nodiscard]] auto pause() -> std::expected<void, GStreamerError>;
    [[nodiscard]] auto resume() -> std::expected<void, GStreamerError>;

    [[nodiscard]] auto is_playing() const -> bool;
    [[nodiscard]] auto is_paused() const -> bool;

    auto set_buffer_callback(BufferCallback callback) -> void;

    [[nodiscard]] auto pull_sample(std::uint32_t timeout_ms = 5000) -> std::expected<BufferInfo, GStreamerError>;

    [[nodiscard]] auto push_buffer(void *data, std::size_t size, const FrameMetadata &metadata)
      -> std::expected<void, GStreamerError>;

    [[nodiscard]] auto get_position_ns() const -> std::expected<std::uint64_t, GStreamerError>;
    [[nodiscard]] auto get_duration_ns() const -> std::expected<std::uint64_t, GStreamerError>;
    [[nodiscard]] auto seek(std::uint64_t timestamp_ns) -> std::expected<void, GStreamerError>;

    [[nodiscard]] auto get_caps_string() const -> std::string;
    [[nodiscard]] auto get_current_state() const -> int;

  private:
    struct Impl;
    std::unique_ptr<Impl> impl_;
};

[[nodiscard]] auto create_video_inference_pipeline(const std::string &video_source,
  const std::string &model_path,
  std::uint32_t width,
  std::uint32_t height,
  const std::string &output_sink = "appsink") -> std::expected<GStreamerPipeline, GStreamerError>;

[[nodiscard]] auto create_camera_inference_pipeline(const std::string &device,
  const std::string &model_path,
  std::uint32_t width,
  std::uint32_t height,
  std::uint32_t fps) -> std::expected<GStreamerPipeline, GStreamerError>;

}// namespace kataglyphis::gstreamer