CameraDepthOutput is Physics.Signals.Output:
    .doc: """
    An uncompressed camera depth output.
    A depth unit value can be set to scale the depth readings from the SI unit of one meter per
    unit value to any other distance per unit value. This value is set to the distance in meter that
    one output unit depth corresponds to.
    The output can optionally be specified as an image-by-image video stream if the framerate is set
    to a value greater than zero.
    """
    type: 0
    horizontal_resolution is Int
    vertical_resolution is Int
    depth_unit is Real: 1.0
    channel_type is Int: CameraOutputChannelType.U16
    optional framerate is Real

    capture is CameraCaptureInput:
        source: this

    source is CameraLogic reference
    marshalling: marshalling_from_type(channel_type)

    static fn marshalling_from_type(channel_type: Int) -> Physics.Signals.Marshalling

    # C++ extensions
    .extend_public: "std::vector<uint8_t> readChannelValuesU8(const std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal>& signal) const;"
    .extend_public: "std::vector<int8_t> readChannelValuesI8(const std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal>& signal) const;"
    .extend_public: "std::vector<uint16_t> readChannelValuesU16(const std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal>& signal) const;"
    .extend_public: "std::vector<int16_t> readChannelValuesI16(const std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal>& signal) const;"
    .extend_public: "std::vector<uint32_t> readChannelValuesU32(const std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal>& signal) const;"
    .extend_public: "std::vector<int32_t> readChannelValuesI32(const std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal>& signal) const;"
    .extend_public: "std::vector<float> readChannelValuesF32(const std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal>& signal) const;"
    .extend_public: "std::vector<uint64_t> readChannelValuesU64(const std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal>& signal) const;"
    .extend_public: "std::vector<int64_t> readChannelValuesI64(const std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal>& signal) const;"
    .extend_public: "std::vector<double> readChannelValuesF64(const std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal>& signal) const;"

    .extend_public: "std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal> createSignal(const std::vector<uint8_t>& channelValues) const;"
    .extend_public: "std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal> createSignal(const std::vector<int8_t>& channelValues) const;"
    .extend_public: "std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal> createSignal(const std::vector<uint16_t>& channelValues) const;"
    .extend_public: "std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal> createSignal(const std::vector<int16_t>& channelValues) const;"
    .extend_public: "std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal> createSignal(const std::vector<uint32_t>& channelValues) const;"
    .extend_public: "std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal> createSignal(const std::vector<int32_t>& channelValues) const;"
    .extend_public: "std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal> createSignal(const std::vector<float>& channelValues) const;"
    .extend_public: "std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal> createSignal(const std::vector<uint64_t>& channelValues) const;"
    .extend_public: "std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal> createSignal(const std::vector<int64_t>& channelValues) const;"
    .extend_public: "std::shared_ptr<openplx::Sensors::Signals::SensorOutputSignal> createSignal(const std::vector<double>& channelValues) const;"
