summaryrefslogtreecommitdiff
path: root/src/ipa/raspberrypi/raspberrypi.cpp
AgeCommit message (Expand)Author
2021-07-12ipa: raspberrypi: Make variable names consistentNaushir Patuck
2021-07-12ipa: raspberrypi: Increase the default max frame duration to 250sNaushir Patuck
2021-07-12ipa: raspberrypi: Add frame_length to DeviceStatusNaushir Patuck
2021-07-12ipa: raspberrypi: Add an operator<< to struct DeviceStatusNaushir Patuck
2021-07-11libcamera: buffer: Rename buffer.h to framebuffer.hLaurent Pinchart
2021-06-25libcamera/base: Move span to base libraryKieran Bingham
2021-06-25libcamera/base: Move extended base functionalityKieran Bingham
2021-06-08ipa: raspberrypi: Switch the AGC/Lux code to use utils::DurationNaushir Patuck
2021-06-08ipa: raspberrypi: Switch AgcAlgorithm API to use utils::DurationNaushir Patuck
2021-06-08ipa: raspberrypi: Switch ipa and cam_helper to use utils::DurationNaushir Patuck
2021-05-27controls: Split FrameDurations into FrameDuration and FrameDurationLimitsPaul Elder
2021-05-24ipa: ipc: Rename CameraSensorInfo to IPACameraSensorInfoUmang Jain
2021-05-24ipa: mojom: Move CameraSensorInfo struct exclusively to IPA IPCUmang Jain
2021-05-11ipa: raspberrypi: Rate-limit the controller algorithmsNaushir Patuck
2021-05-11ipa: raspberrypi: Store dropped frame count in a member variableNaushir Patuck
2021-05-08ipa: raspberrypi: Use CamHelpers to generalise sensor embedded data parsingDavid Plowman
2021-03-29ipa: raspberrypi: Fix typo and improve wordingSebastian Fricke
2021-03-28ipa: raspberrrypi: Remove duplicate commentSebastian Fricke
2021-03-23ipa: raspberrypi: Rationalise parameters to ipa::configure()Naushir Patuck
2021-03-23ipa: raspberrypi: Rationalise parameters to ipa::start()Naushir Patuck
2021-03-23ipa: raspberrypi: Remove unused member variableNaushir Patuck
2021-03-23ipa: raspberrypi: Move the controller initialise to ipa::init()Naushir Patuck
2021-03-23pipeline: ipa: raspberrypi: Open the CamHelper on ipa::init()Naushir Patuck
2021-03-09ipa: raspberrypi: Use direct return value for configure()Paul Elder
2021-03-09ipa: raspberrypi: Rename vblank field in SensorConfig to vblankDelayDavid Plowman
2021-03-09ipa: raspberrypi: Make CamHelpers return the frame delay for vblankingDavid Plowman
2021-03-04pipeline: ipa: raspberrypi: Pass exposure/gain values to IPA though controlsNaushir Patuck
2021-02-19pipeline: ipa: raspberrypi: Rename IPA Interface namespace to ipa::RPiNaushir Patuck
2021-02-19pipeline: ipa: raspberrypi: Tidy-ups after IPAInterface changesNaushir Patuck
2021-02-19ipa: raspberrypi: Do not require SDN (spatial denoise) algorithmDavid Plowman
2021-02-16libcamera: IPAInterface: Replace C API with the new C++-only APIPaul Elder
2021-02-09ipa: raspberrypi: Handle control::NoiseReductionMode in the controllerNaushir Patuck
2021-02-09ipa: raspberrypi: Rename SdnStatus to DenoiseStatusNaushir Patuck
2021-02-05ipa: raspberrypi: Pass the maximum allowable shutter speed into the AGCNaushir Patuck
2021-02-05ipa: raspberrypi: Limit the calculated vblank based on the sensor modeNaushir Patuck
2021-02-05ipa: raspberrypi: Rename RPi::ConfigParameters enum valuesNaushir Patuck
2021-02-02ipa: raspberrypi: Warn when control algorithms are missing; do not failDavid Plowman
2021-01-29libcamera: raspberrypi: Switch to DelayedControlsNiklas Söderlund
2021-01-20libcamera: raspberrypi: Add control of sensor vblankingNaushir Patuck
2020-12-20ipa: raspberrypi: Add digital gain to libcamera metadataDavid Plowman
2020-12-16ipa: raspberrypi: Only validate ISP and sensor control during configureNaushir Patuck
2020-12-16ipa: raspberrypi: Rename unicamCtrls_ to sensorCtrls_Naushir Patuck
2020-12-14libcamera: Replace ARRAY_SIZE() with std::size()Laurent Pinchart
2020-12-11ipa: raspberrypi: Move initial frame drop decision to AGC/AWBDavid Plowman
2020-12-11libcamera: pipeline: raspberrypi: Pass the drop frame count in start, not con...David Plowman
2020-12-08pipeline: ipa: raspberrypi: Pass controls to IPA on startNaushir Patuck
2020-12-08libcamera: ipa: Pass a set of controls and return results from ipa::start()Naushir Patuck
2020-12-07pipeline: ipa: raspberrypi: Handle failures during IPA configurationNaushir Patuck
2020-12-01src: ipa: raspberrypi: Improve behaviour when AE disabledDavid Plowman
2020-11-20src: ipa: raspberrypi: Add missing 'cloudy' AWB modeDavid Plowman
hl kwa">return 0; } class SlotObject : public Object { public: void slot() { valueStatic_ = 1; } }; class BaseClass { public: /* * A virtual function is required in the base class, otherwise the * compiler will always store Object before BaseClass in memory. */ virtual ~BaseClass() { } unsigned int data_[32]; }; class SlotMulti : public BaseClass, public Object { public: void slot() { valueStatic_ = 1; } }; class SignalTest : public Test { protected: void slotVoid() { called_ = true; } void slotDisconnect() { called_ = true; signalVoid_.disconnect(this, &SignalTest::slotDisconnect); } void slotInteger1(int value) { values_[0] = value; } void slotInteger2(int value) { values_[1] = value; } void slotMultiArgs(int value, const std::string &name) { values_[2] = value; name_ = name; } int slotReturn() { return 0; } int init() { return 0; } int run() { /* ----------------- Signal -> !Object tests ---------------- */ /* Test signal emission and reception. */ called_ = false; signalVoid_.connect(this, &SignalTest::slotVoid); signalVoid_.emit(); if (!called_) { cout << "Signal emission test failed" << endl; return TestFail; } /* Test signal with parameters. */ values_[2] = 0; name_.clear(); signalMultiArgs_.connect(this, &SignalTest::slotMultiArgs); signalMultiArgs_.emit(42, "H2G2"); if (values_[2] != 42 || name_ != "H2G2") { cout << "Signal parameters test failed" << endl; return TestFail; } /* Test signal connected to multiple slots. */ memset(values_, 0, sizeof(values_)); valueStatic_ = 0; signalInt_.connect(this, &SignalTest::slotInteger1); signalInt_.connect(this, &SignalTest::slotInteger2); signalInt_.connect(&slotStatic); signalInt_.emit(42); if (values_[0] != 42 || values_[1] != 42 || values_[2] != 0 || valueStatic_ != 42) { cout << "Signal multi slot test failed" << endl; return TestFail; } /* Test disconnection of a single slot. */ memset(values_, 0, sizeof(values_)); signalInt_.disconnect(this, &SignalTest::slotInteger2); signalInt_.emit(42); if (values_[0] != 42 || values_[1] != 0 || values_[2] != 0) { cout << "Signal slot disconnection test failed" << endl; return TestFail; } /* Test disconnection of a whole object. */ memset(values_, 0, sizeof(values_)); signalInt_.disconnect(this); signalInt_.emit(42); if (values_[0] != 0 || values_[1] != 0 || values_[2] != 0) { cout << "Signal object disconnection test failed" << endl; return TestFail; } /* Test disconnection of a whole signal. */ memset(values_, 0, sizeof(values_)); signalInt_.connect(this, &SignalTest::slotInteger1); signalInt_.connect(this, &SignalTest::slotInteger2); signalInt_.disconnect(); signalInt_.emit(42); if (values_[0] != 0 || values_[1] != 0 || values_[2] != 0) { cout << "Signal object disconnection test failed" << endl; return TestFail; } /* Test disconnection from slot. */ signalVoid_.disconnect(); signalVoid_.connect(this, &SignalTest::slotDisconnect); signalVoid_.emit(); called_ = false; signalVoid_.emit(); if (called_) { cout << "Signal disconnection from slot test failed" << endl; return TestFail; } /* * Test connecting to slots that return a value. This targets * compilation, there's no need to check runtime results. */ signalVoid_.connect(slotStaticReturn); signalVoid_.connect(this, &SignalTest::slotReturn); /* Test signal connection to a lambda. */ int value = 0; signalInt_.connect(this, [&](int v) { value = v; }); signalInt_.emit(42); if (value != 42) { cout << "Signal connection to lambda failed" << endl; return TestFail; } signalInt_.disconnect(this); signalInt_.emit(0); if (value != 42) { cout << "Signal disconnection from lambda failed" << endl; return TestFail; } /* ----------------- Signal -> Object tests ----------------- */ /* * Test automatic disconnection on object deletion. Connect two * signals to ensure all instances are disconnected. */ signalVoid_.disconnect(); signalVoid2_.disconnect(); SlotObject *slotObject = new SlotObject(); signalVoid_.connect(slotObject, &SlotObject::slot); signalVoid2_.connect(slotObject, &SlotObject::slot); delete slotObject; valueStatic_ = 0; signalVoid_.emit(); signalVoid2_.emit(); if (valueStatic_ != 0) { cout << "Signal disconnection on object deletion test failed" << endl; return TestFail; } /* * Test that signal deletion disconnects objects. This shall * not generate any valgrind warning. */ Signal<> *dynamicSignal = new Signal<>(); slotObject = new SlotObject(); dynamicSignal->connect(slotObject, &SlotObject::slot); delete dynamicSignal; delete slotObject; /* * Test that signal manual disconnection from Object removes * the signal for the object. This shall not generate any * valgrind warning. */ dynamicSignal = new Signal<>(); slotObject = new SlotObject(); dynamicSignal->connect(slotObject, &SlotObject::slot); dynamicSignal->disconnect(slotObject); delete dynamicSignal; delete slotObject; /* * Test that signal manual disconnection from all slots removes * the signal for the object. This shall not generate any * valgrind warning. */ dynamicSignal = new Signal<>(); slotObject = new SlotObject(); dynamicSignal->connect(slotObject, &SlotObject::slot); dynamicSignal->disconnect(); delete dynamicSignal; delete slotObject; /* Exercise the Object slot code paths. */ slotObject = new SlotObject(); signalVoid_.connect(slotObject, &SlotObject::slot); valueStatic_ = 0; signalVoid_.emit(); if (valueStatic_ == 0) { cout << "Signal delivery for Object test failed" << endl; return TestFail; } delete slotObject; /* Test signal connection to a lambda. */ slotObject = new SlotObject(); value = 0; signalInt_.connect(slotObject, [&](int v) { value = v; }); signalInt_.emit(42); if (value != 42) { cout << "Signal connection to Object lambda failed" << endl; return TestFail; } signalInt_.disconnect(slotObject); signalInt_.emit(0); if (value != 42) { cout << "Signal disconnection from Object lambda failed" << endl; return TestFail; } delete slotObject; /* --------- Signal -> Object (multiple inheritance) -------- */ /* * Test automatic disconnection on object deletion. Connect two * signals to ensure all instances are disconnected. */ signalVoid_.disconnect(); signalVoid2_.disconnect(); SlotMulti *slotMulti = new SlotMulti(); signalVoid_.connect(slotMulti, &SlotMulti::slot); signalVoid2_.connect(slotMulti, &SlotMulti::slot); delete slotMulti; valueStatic_ = 0; signalVoid_.emit(); signalVoid2_.emit(); if (valueStatic_ != 0) { cout << "Signal disconnection on object deletion test failed" << endl; return TestFail; } /* * Test that signal deletion disconnects objects. This shall * not generate any valgrind warning. */ dynamicSignal = new Signal<>(); slotMulti = new SlotMulti(); dynamicSignal->connect(slotMulti, &SlotMulti::slot); delete dynamicSignal; delete slotMulti; /* Exercise the Object slot code paths. */ slotMulti = new SlotMulti(); signalVoid_.connect(slotMulti, &SlotMulti::slot); valueStatic_ = 0; signalVoid_.emit(); if (valueStatic_ == 0) { cout << "Signal delivery for Object test failed" << endl; return TestFail; } delete slotMulti; return TestPass; } void cleanup() { } private: Signal<> signalVoid_; Signal<> signalVoid2_; Signal<int> signalInt_; Signal<int, const std::string &> signalMultiArgs_; bool called_; int values_[3]; std::string name_; }; TEST_REGISTER(SignalTest)