summaryrefslogtreecommitdiff
path: root/utils/ipc/mojo/public
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2022-11-01 18:00:51 +0000
committerKieran Bingham <kieran.bingham@ideasonboard.com>2022-11-28 17:15:35 +0000
commit96ed45b9711e5c70afc4f91eab0ed657ccfb9695 (patch)
tree2f96fdeb8fa3751ce68d6c9fb38f5f006156b086 /utils/ipc/mojo/public
parent1cd7646f970d90f3c8bec02259a2415c5cf89016 (diff)
libcamera: v4l2_device: Workaround faulty control menus
Some UVC cameras have been identified that can provide V4L2 menu controls without any menu items. This leads to a segfault where we try to construct a ControlInfo(Span<>,default) with an empty span. Convert the v4l2ControlInfo and v4l2MenuControlInfo helper functions to return std::optional<ControlInfo> to be able to account in the caller if the control is valid, and only add acceptable controls to the supported control list. Menu controls without a list of menu items are no longer added as a valid control and a warning is logged. This also fixes a potential crash that would have occured in the unlikely event that a ctrl.minimum was set to less than 0. Bug: https://bugs.libcamera.org/show_bug.cgi?id=167 Reported-by: Marian Buschsieweke <marian.buschsieweke@ovgu.de> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'utils/ipc/mojo/public')
0 files changed, 0 insertions, 0 deletions
tdint.h> #include <string> #include <libcamera/base/class.h> #include <libcamera/base/flags.h> #include <libcamera/base/object.h> #include <libcamera/base/signal.h> #include <libcamera/controls.h> #include <libcamera/request.h> #include <libcamera/stream.h> #include <libcamera/transform.h> namespace libcamera { class FrameBuffer; class FrameBufferAllocator; class PipelineHandler; class Request; class CameraConfiguration { public: enum Status { Valid, Adjusted, Invalid, }; using iterator = std::vector<StreamConfiguration>::iterator; using const_iterator = std::vector<StreamConfiguration>::const_iterator; virtual ~CameraConfiguration(); void addConfiguration(const StreamConfiguration &cfg); virtual Status validate() = 0; StreamConfiguration &at(unsigned int index); const StreamConfiguration &at(unsigned int index) const; StreamConfiguration &operator[](unsigned int index) { return at(index); } const StreamConfiguration &operator[](unsigned int index) const { return at(index); } iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; bool empty() const; std::size_t size() const; Transform transform; protected: CameraConfiguration(); enum class ColorSpaceFlag { None, StreamsShareColorSpace, }; using ColorSpaceFlags = Flags<ColorSpaceFlag>; Status validateColorSpaces(ColorSpaceFlags flags = ColorSpaceFlag::None); std::vector<StreamConfiguration> config_; }; class Camera final : public Object, public std::enable_shared_from_this<Camera>, public Extensible { LIBCAMERA_DECLARE_PRIVATE() public: static std::shared_ptr<Camera> create(std::unique_ptr<Private> d, const std::string &id, const std::set<Stream *> &streams); const std::string &id() const; Signal<Request *, FrameBuffer *> bufferCompleted; Signal<Request *> requestCompleted; Signal<> disconnected; int acquire(); int release(); const ControlInfoMap &controls() const; const ControlList &properties() const; const std::set<Stream *> &streams() const; std::unique_ptr<CameraConfiguration> generateConfiguration(const StreamRoles &roles = {}); int configure(CameraConfiguration *config); std::unique_ptr<Request> createRequest(uint64_t cookie = 0); int queueRequest(Request *request); int start(const ControlList *controls = nullptr); int stop(); private: LIBCAMERA_DISABLE_COPY(Camera) Camera(std::unique_ptr<Private> d, const std::string &id, const std::set<Stream *> &streams); ~Camera(); friend class PipelineHandler; void disconnect(); void requestComplete(Request *request); friend class FrameBufferAllocator; int exportFrameBuffers(Stream *stream, std::vector<std::unique_ptr<FrameBuffer>> *buffers); }; } /* namespace libcamera */