summaryrefslogtreecommitdiff
path: root/src/ipa/rkisp1/rkisp1.cpp
AgeCommit message (Expand)Author
2022-07-28ipa: rkisp1: Add support of Lens Shading Correction controlFlorian Sylvestre
2022-07-22ipa: rkisp1: Transfer queueRequest() call to each algorithmFlorian Sylvestre
2022-06-29ipa: rkisp1: Add YAML tuning file supportFlorian Sylvestre
2022-06-01libcamera: Use "..." instead of <...> consistently for internal headersLaurent Pinchart
2022-05-18ipa: libipa: Add frame context pointer in process()Umang Jain
2022-04-02ipa: rkisp1: Split queuing of request and parameter fillingUmang Jain
2022-03-28ipa: rkisp1: Introduce AWBJean-Michel Hautbois
2022-03-28ipa: rkisp1: Introduce Black Level CorrectionJean-Michel Hautbois
2022-03-28ipa: rkisp1: Use frame counter for the request queuedJean-Michel Hautbois
2022-03-23ipa: rkisp1: Replace event-based ops with dedicated functionsUmang Jain
2022-03-23ipa: rkisp1: Drop private exposure and gain limitsUmang Jain
2021-11-29ipa: rkisp1: agc: Introduce prepare callJean-Michel Hautbois
2021-11-29ipa: rkisp1: Introduce AGCJean-Michel Hautbois
2021-11-29ipa: rkisp1: agc: Introduce HW revision in IPAContextJean-Michel Hautbois
2021-11-29ipa: rkisp1: Report and use sensor controlsJean-Michel Hautbois
2021-11-29ipa: rkisp1: Use the Algorithm classJean-Michel Hautbois
2021-11-29ipa: rkisp1: Introduce IPAContextJean-Michel Hautbois
2021-11-29ipa: rkisp1: Instantiate CameraSensorHelperJean-Michel Hautbois
2021-11-29ipa: Do not modify the sensor limitsJean-Michel Hautbois
2021-11-29ipa: rkisp1: Pass IPASettings at init callJean-Michel Hautbois
2021-08-31libcamera: mapped_framebuffer: Rename maps() to planes()Hirokazu Honda
2021-08-30ipa: rkisp1: Use offset in mapping IPABufferHirokazu Honda
2021-07-22ipa: rkisp1: Add support for V12 isp blocksHeiko Stuebner
2021-07-11libcamera: buffer: Rename buffer.h to framebuffer.hLaurent Pinchart
2021-06-25libcamera/base: Move extended base functionalityKieran Bingham
2021-05-24ipa: ipc: Rename CameraSensorInfo to IPACameraSensorInfoUmang Jain
2021-04-26ipa: rkisp1: Move the IPA to the ipa::rkisp1 namespaceJean-Michel Hautbois
2021-03-27ipa: rkisp1: Do not set controls during configureSebastian Fricke
2021-03-11ipa: rkisp1: Fail on init if hw revision is not RKISP1_V10Dafna Hirschfeld
2021-03-11ipa: rkisp1: Return error from IPA's configure method if it failsDafna Hirschfeld
2021-03-03ipa: rkisp1: Update to kernel header changesLaurent Pinchart
2021-02-16libcamera: IPAInterface: Replace C API with the new C++-only APIPaul Elder
2020-12-08libcamera: ipa: Pass a set of controls and return results from ipa::start()Naushir Patuck
2020-09-29include: linux: Update rkisp1 headerNiklas Söderlund
2020-09-29libcamera: ipa: rkisp1: Include linux/v4l2-controls.hNiklas Söderlund
2020-08-25meson: Remove -Wno-unused-parameterLaurent Pinchart
2020-08-25libcamera: Replace utils::clamp() with std::clamp()Laurent Pinchart
2020-07-17libcamera: ipa_interface: Add support for custom IPA data to configure()Laurent Pinchart
2020-07-01ipa/pipeline: rkisp1: Fix spellingAndrej Shadura
2020-05-16libcamera: Move IPA headers from include/ipa/ to include/libcamera/ipa/Laurent Pinchart
2020-05-16libcamera: Move internal headers to include/libcamera/internal/Laurent Pinchart
2020-04-28libcamera: ipa: Add support for CameraSensorInfoJacopo Mondi
2020-04-28ipa: Pass IPA initialization settings to IPAInterface::init()Laurent Pinchart
2020-04-28ipa: Name IPA modules after their source directoryLaurent Pinchart
2020-04-14libcamera: ipa: Remove IPAModuleInfo license fieldLaurent Pinchart
2020-04-14ipa: Add start() and stop() operationsNiklas Söderlund
2020-01-14libcamera: Switch from utils::make_unique to std::make_uniqueLaurent Pinchart
2020-01-14meson.build: Switch to C++14Laurent Pinchart
2020-01-12ipa: Switch to FrameBuffer interfaceNiklas Söderlund
2019-11-20ipa: Switch to the plain C APIJacopo Mondi
com"> */ /** * \brief Construct an Object instance * \param[in] parent The object parent * * The new Object instance is bound to the thread of its \a parent, or to the * current thread if the \a parent is nullptr. */ Object::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. * * As an exception to this rule, Object instances may be deleted from a * different thread if the thread the instance is bound to is stopped through * the whole duration of the object's destruction, *and* the parent and children * of the object do not get deleted concurrently. The caller is responsible for * fulfilling those requirements. * * In all cases Object instances shall be deleted before the Thread they are * bound to. */ Object::~Object() { ASSERT(Thread::current() == thread_ || !thread_->isRunning()); /* * 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 or after * it has stopped, the object will be deleted when the event loop (re)starts. If * this never occurs, the object will be leaked. * * 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 function posts the message \a msg to the message queue of the object's * thread, to be delivered to the object through the message() function 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. * * Due to their asynchronous nature, threads do not provide any guarantee that * all posted messages are delivered before the thread is stopped. See * \ref thread-stop for additional information. * * \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 function 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() function shall be called for any * message not handled by the override function. * * The message \a msg is valid only for the duration of the call, no reference * to it shall be kept after this function returns. */ void Object::message(Message *msg) { switch (msg->type()) { case Message::InvokeMessage: { /* * A static_cast should be enough, but gcc 10 and 11 choke on * it in release mode (with -O2 or -O3). */ InvokeMessage *iMsg = dynamic_cast<InvokeMessage *>(msg); Semaphore *semaphore = iMsg->semaphore(); iMsg->invoke(); if (semaphore) semaphore->release(); break; } case Message::DeferredDelete: delete this; break; default: break; } } /** * \fn Object::assertThreadBound() * \brief Check if the caller complies with thread-bound constraints * \param[in] message The message to be printed on error * * This function verifies the calling constraints required by the \threadbound * definition. It shall be called at the beginning of member functions of an * Object subclass that are explicitly marked as thread-bound in their * documentation. * * If the thread-bound constraints are not met, the function prints \a message * as an error message. For debug builds, it additionally causes an assertion * error. * * \todo Verify the thread-bound requirements for functions marked as * thread-bound at the class level. * * \return True if the call is thread-bound compliant, false otherwise */ bool Object::assertThreadBound(const char *message) { if (Thread::current() == thread_) return true; LOG(Object, Error) << message; ASSERT(false); return false; } /** * \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 function 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. * * Due to the asynchronous nature of threads, functions invoked asynchronously * with the ConnectionTypeQueued type are not guaranteed to be called before * the thread is stopped. See \ref thread-stop for additional information. * * \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 function 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() function 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 \threadbound. */ void Object::moveToThread(Thread *thread) { if (!assertThreadBound("Object can't be moved from another thread")) return; 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) { /* * Connecting the same signal to an object multiple times is not * supported. */ ASSERT(std::find(signals_.begin(), signals_.end(), signal) == signals_.end()); 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 */