CameraColorOutput is Physics.Signals.Output:
    .doc: """
    An uncompressed camera color output. Each element of the output is specified using the given
    output remapping matrix, and gamma correction (after remapping) can optionally be enabled by
    setting the gamma value.
    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
    channel_type is Int: CameraOutputChannelType.U8
    matrix is CameraColorOutputMatrix: CameraColorOutputMatrices.RGB_OUTPUT
    optional gamma is Real
    optional framerate is Real

    capture is CameraCaptureInput:
        source: this

    source is CameraLogic reference
    marshalling: marshalling_from_type_and_matrix(channel_type, matrix)

    static fn marshalling_from_type_and_matrix(channel_type: Int, matrix: CameraColorOutputMatrix) -> 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;"
