summaryrefslogtreecommitdiff
path: root/src/android/camera_hal_manager.h
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-07-24 14:59:15 +0200
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-07-27 17:31:13 +0200
commit01ea694003094b51bd96883055b11e52a011bef9 (patch)
tree21ba33a6f21cb75ce3006472217a6f61c512377b /src/android/camera_hal_manager.h
parent3acc31b0e3bdb7a53d52ab32136aaf46f1af6ce7 (diff)
cam: Add option to disallow adjusting of requested formats
Add a '--strict-formats' option which fails the camera configuration step if the format is adjusted, Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/android/camera_hal_manager.h')
0 files changed, 0 insertions, 0 deletions
d='n52' href='#n52'>52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2019, Google Inc.
 *
 * signal.h - Signal & slot implementation
 */
#ifndef __LIBCAMERA_SIGNAL_H__
#define __LIBCAMERA_SIGNAL_H__

#include <functional>
#include <list>
#include <type_traits>
#include <vector>

#include <libcamera/bound_method.h>
#include <libcamera/object.h>

namespace libcamera {

class SignalBase
{
public:
	void disconnect(Object *object);

protected:
	using SlotList = std::list<BoundMethodBase *>;

	void connect(BoundMethodBase *slot);
	void disconnect(std::function<bool(SlotList::iterator &)> match);

	SlotList slots();

private:
	SlotList slots_;
};

template<typename... Args>
class Signal : public SignalBase
{
public:
	Signal() {}
	~Signal()
	{
		disconnect();
	}

#ifndef __DOXYGEN__
	template<typename T, typename R, typename std::enable_if_t<std::is_base_of<Object, T>::value> * = nullptr>
	void connect(T *obj, R (T::*func)(Args...),
		     ConnectionType type = ConnectionTypeAuto)
	{
		Object *object = static_cast<Object *>(obj);
		SignalBase::connect(new BoundMethodMember<T, void, Args...>(obj, object, func, type));
	}

	template<typename T, typename R, typename std::enable_if_t<!std::is_base_of<Object, T>::value> * = nullptr>
#else
	template<typename T, typename R>
#endif
	void connect(T *obj, R (T::*func)(Args...))
	{
		SignalBase::connect(new BoundMethodMember<T, R, Args...>(obj, nullptr, func));
	}

	template<typename R>
	void connect(R (*func)(Args...))
	{
		SignalBase::connect(new BoundMethodStatic<R, Args...>(func));
	}

	void disconnect()
	{
		SignalBase::disconnect([](SlotList::iterator &iter) {
			return true;
		});
	}

	template<typename T>
	void disconnect(T *obj)
	{
		SignalBase::disconnect([obj](SlotList::iterator &iter) {
			return (*iter)->match(obj);
		});
	}

	template<typename T, typename R>
	void disconnect(T *obj, R (T::*func)(Args...))
	{
		SignalBase::disconnect([obj, func](SlotList::iterator &iter) {
			BoundMethodArgs<R, Args...> *slot =
				static_cast<BoundMethodArgs<R, Args...> *>(*iter);

			if (!slot->match(obj))
				return false;

			/*
			 * If the object matches the slot, the slot is
			 * guaranteed to be a member slot, so we can safely
			 * cast it to BoundMethodMember<T, Args...> to match
			 * func.
			 */
			return static_cast<BoundMethodMember<T, R, Args...> *>(slot)->match(func);
		});
	}

	template<typename R>
	void disconnect(R (*func)(Args...))
	{
		SignalBase::disconnect([func](SlotList::iterator &iter) {
			BoundMethodArgs<R, Args...> *slot =
				static_cast<BoundMethodArgs<R, Args...> *>(*iter);

			if (!slot->match(nullptr))
				return false;

			return static_cast<BoundMethodStatic<R, Args...> *>(slot)->match(func);
		});
	}

	void emit(Args... args)
	{
		/*
		 * Make a copy of the slots list as the slot could call the
		 * disconnect operation, invalidating the iterator.
		 */
		for (BoundMethodBase *slot : slots())
			static_cast<BoundMethodArgs<void, Args...> *>(slot)->activate(args...);
	}
};

} /* namespace libcamera */

#endif /* __LIBCAMERA_SIGNAL_H__ */