summaryrefslogtreecommitdiff
path: root/include
AgeCommit message (Expand)Author
2022-05-10meson: Use new project_*_root() functionsTomi Valkeinen
2022-05-10libcamera: Introduce YamlParser as a helper to parse yaml filesHan-Lin Chen
2022-05-04libcamera: Add operator<<() for V4L2 format classesLaurent Pinchart
2022-05-04libcamera: bayer_format: Add operator<<()Laurent Pinchart
2022-05-04libcamera: Add operator<<() for pixel format classesLaurent Pinchart
2022-05-04libcamera: geometry: Add missing ostream header in geometry.hLaurent Pinchart
2022-04-22libcamera: geometry: Add operator<< for classes in geometryHan-Lin Chen
2022-04-14libcamera: framebuffer: Make FrameBuffer::cancel() privateDorota Czaplejewicz
2022-04-13ipa: vimc: Synchronise parameter buffer ops namingUmang Jain
2022-04-13ipa: vimc: Establish logical order of operationsUmang Jain
2022-04-08ipa: ipu3: Replace event-based ops with dedicated functionsUmang Jain
2022-04-07libcamera: base: utils: Add missing constructor for DurationLaurent Pinchart
2022-04-06libcamera: camera_sensor: Drop const on the return value of sizes()Laurent Pinchart
2022-04-06pipeline: raspberrypi: Add a Unicam dequeue timeoutNaushir Patuck
2022-04-06libcamera: v4l2_videodevice: Add a dequeue timerNaushir Patuck
2022-04-06ipa: raspberrypi: Correct some of the ControlInfo ranges and defaultsDavid Plowman
2022-04-02ipa: vimc: Rename processControls() to queueRequest()Umang Jain
2022-04-02ipa: rkisp1: Split queuing of request and parameter fillingUmang Jain
2022-03-28libcamera: v4l2_videodevice: Empty the V4L2 buffer cache on streamOff()Naushir Patuck
2022-03-28libcamera: v4l2_videodevice: Better tracking of the device stateNaushir Patuck
2022-03-25libcamera: base: timer: Drop start() overload with int argumentLaurent Pinchart
2022-03-23ipa: rkisp1: Replace event-based ops with dedicated functionsUmang Jain
2022-03-15libcamera: ipa: Add lens control member to ipu3 ipa interfaceDaniel Scally
2022-03-15libcamera: camera_lens: Add function to fetch subdev controlsDaniel Scally
2022-03-15libcamera: camera_sensor: Discover VCMs through ancillary linksDaniel Scally
2022-03-15include: linux: Add MEDIA_LNK_FL_ANCILLARY_LINKDaniel Scally
2022-03-15libcamera: Add members to MediaEntity to support ancillary entitiesDaniel Scally
2022-03-11libcamera: Fix typo in a function name for camera lens classJean-Michel Hautbois
2022-02-04libcamera: pipeline_handler: Register requestsKieran Bingham
2022-01-08include: linux: Update kernel headers to version v5.16-rc7David Plowman
2022-01-03libcamera: pipeline_handler: Make lock() and unlock() thread-safeLaurent Pinchart
2022-01-03libcamera: media_device: Move recursive lock handling to pipeline handlerLaurent Pinchart
2021-12-13libcamera: camera: Add validateColorSpaces to CameraConfiguration classDavid Plowman
2021-12-13libcamera: v4l2_subdevice: Add colorSpace field to V4L2SubdeviceFormatDavid Plowman
2021-12-13libcamera: video_device: Support passing ColorSpaces to V4L2 video devicesDavid Plowman
2021-12-13libcamera: video_device: Convert between ColorSpace class and V4L2 formatsDavid Plowman
2021-12-13libcamera: stream: Add ColorSpace fields to StreamConfigurationDavid Plowman
2021-12-13libcamera: Add ColorSpace classDavid Plowman
2021-12-11libcamera: request: Add Request::Private::prepare()Jacopo Mondi
2021-12-11libcamera: pipeline: Introduce stopDevice()Jacopo Mondi
2021-12-11libcamera: pipeline_handler: Split request queueingJacopo Mondi
2021-12-11libcamera: request: Add Fence to Request::addBuffer()Jacopo Mondi
2021-12-11libcamera: framebuffer: Add Fence to FrameBufferJacopo Mondi
2021-12-11libcamera: fence: Introduce FenceJacopo Mondi
2021-12-11libcamera: request: Make Request class ExtensibleLaurent Pinchart
2021-12-07libcamera: base: utils: Add abs_diff() utility functionLaurent Pinchart
2021-12-06libcamera: camera_sensor: Enable to set a test pattern modeHirokazu Honda
2021-12-06libcamera: camera_sensor: Reference test pattern modes by enum typeHirokazu Honda
2021-12-06libcamera: framebuffer: Enable attaching additional data to FrameBufferHirokazu Honda
2021-12-04libcamera: base: shared_fd: Add comparison operatorsLaurent Pinchart
class="hl opt">::Object(Object *parent) : parent_(parent), pendingMessages_(0) { thread_ = parent ? parent->thread() : Thread::current(); if (parent) parent->children_.push_back(this); } /** * \brief Destroy an Object instance * * Deleting an Object automatically disconnects all signals from the Object's * slots. All the Object's children are made orphan, but stay bound to their * current thread. * * Object instances shall be destroyed from the thread they are bound to, * otherwise undefined behaviour may occur. If deletion of an Object needs to * be scheduled from a different thread, deleteLater() shall be used. */ Object::~Object() { /* * Move signals to a private list to avoid concurrent iteration and * deletion of items from Signal::disconnect(). */ std::list<SignalBase *> signals(std::move(signals_)); for (SignalBase *signal : signals) signal->disconnect(this); if (pendingMessages_) thread()->removeMessages(this); if (parent_) { auto it = std::find(parent_->children_.begin(), parent_->children_.end(), this); ASSERT(it != parent_->children_.end()); parent_->children_.erase(it); } for (auto child : children_) child->parent_ = nullptr; } /** * \brief Schedule deletion of the instance in the thread it belongs to * * This function schedules deletion of the Object when control returns to the * event loop that the object belongs to. This ensures the object is destroyed * from the right context, as required by the libcamera threading model. * * If this function is called before the thread's event loop is started, the * object will be deleted when the event loop starts. * * Deferred deletion can be used to control the destruction context with shared * pointers. An object managed with shared pointers is deleted when the last * reference is destroyed, which makes difficult to ensure through software * design which context the deletion will take place in. With a custom deleter * for the shared pointer using deleteLater(), the deletion can be guaranteed to * happen in the thread the object is bound to. * * \code{.cpp} * std::shared_ptr<MyObject> createObject() * { * struct Deleter : std::default_delete<MyObject> { * void operator()(MyObject *obj) * { * obj->deleteLater(); * } * }; * * MyObject *obj = new MyObject(); * * return std::shared_ptr<MyObject>(obj, Deleter()); * } * \endcode * * \context This function is \threadsafe. */ void Object::deleteLater() { postMessage(std::make_unique<Message>(Message::DeferredDelete)); } /** * \brief Post a message to the object's thread * \param[in] msg The message * * This method posts the message \a msg to the message queue of the object's * thread, to be delivered to the object through the message() method in the * context of its thread. Message ownership is passed to the thread, and the * message will be deleted after being delivered. * * Messages are delivered through the thread's event loop. If the thread is not * running its event loop the message will not be delivered until the event * loop gets started. * * \context This function is \threadsafe. */ void Object::postMessage(std::unique_ptr<Message> msg) { thread()->postMessage(std::move(msg), this); } /** * \brief Message handler for the object * \param[in] msg The message * * This virtual method receives messages for the object. It is called in the * context of the object's thread, and can be overridden to process custom * messages. The parent Object::message() method shall be called for any * message not handled by the override method. * * The message \a msg is valid only for the duration of the call, no reference * to it shall be kept after this method returns. */ void Object::message(Message *msg) { switch (msg->type()) { case Message::InvokeMessage: { InvokeMessage *iMsg = static_cast<InvokeMessage *>(msg); Semaphore *semaphore = iMsg->semaphore(); iMsg->invoke(); if (semaphore) semaphore->release(); break; } case Message::DeferredDelete: delete this; break; default: break; } } /** * \fn R Object::invokeMethod() * \brief Invoke a method asynchronously on an Object instance * \param[in] func The object method to invoke * \param[in] type Connection type for method invocation * \param[in] args The method arguments * * This method invokes the member method \a func with arguments \a args, based * on the connection \a type. Depending on the type, the method will be called * synchronously in the same thread or asynchronously in the object's thread. * * Arguments \a args passed by value or reference are copied, while pointers * are passed untouched. The caller shall ensure that any pointer argument * remains valid until the method is invoked. * * \context This function is \threadsafe. * * \return For connection types ConnectionTypeDirect and * ConnectionTypeBlocking, return the return value of the invoked method. For * connection type ConnectionTypeQueued, return a default-constructed R value. */ /** * \fn Object::thread() * \brief Retrieve the thread the object is bound to * \context This function is \threadsafe. * \return The thread the object is bound to */ /** * \brief Move the object and all its children to a different thread * \param[in] thread The target thread * * This method moves the object and all its children from the current thread to * the new \a thread. * * Before the object is moved, a Message::ThreadMoveMessage message is sent to * it. The message() method can be reimplement in derived classes to be notified * of the upcoming thread move and perform any required processing. * * Moving an object that has a parent is not allowed, and causes undefined * behaviour. * * \context This function is thread-bound. */ void Object::moveToThread(Thread *thread) { ASSERT(Thread::current() == thread_); if (thread_ == thread) return; if (parent_) { LOG(Object, Error) << "Moving object to thread with a parent is not permitted"; return; } notifyThreadMove(); thread->moveObject(this); } void Object::notifyThreadMove() { Message msg(Message::ThreadMoveMessage); message(&msg); for (auto child : children_) child->notifyThreadMove(); } /** * \fn Object::parent() * \brief Retrieve the object's parent * \return The object's parent */ void Object::connect(SignalBase *signal) { signals_.push_back(signal); } void Object::disconnect(SignalBase *signal) { for (auto iter = signals_.begin(); iter != signals_.end(); ) { if (*iter == signal) iter = signals_.erase(iter); else iter++; } } } /* namespace libcamera */