ipa: vimc: Add Flags to parameters

For the purpose of testing serializing/deserializing Flags in function
parameters, add an enum class TestFlags and Flags<TestFlags> to some
function parameters, both for input and output and Signals.

While at it, update the ipa_interface_test.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Paul Elder 2022-08-03 20:03:03 +09:00
parent 23fd404690
commit 3b54b56a2d
4 changed files with 46 additions and 9 deletions

View file

@ -17,8 +17,18 @@ enum IPAOperationCode {
IPAOperationStop, IPAOperationStop,
}; };
[scopedEnum] enum TestFlag {
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4,
Flag4 = 0x8,
};
interface IPAVimcInterface { interface IPAVimcInterface {
init(libcamera.IPASettings settings, IPAOperationCode code) => (int32 ret); init(libcamera.IPASettings settings,
IPAOperationCode code,
[flags] TestFlag inFlags)
=> (int32 ret, [flags] TestFlag outFlags);
configure(libcamera.IPACameraSensorInfo sensorInfo, configure(libcamera.IPACameraSensorInfo sensorInfo,
map<uint32, libcamera.IPAStream> streamConfig, map<uint32, libcamera.IPAStream> streamConfig,
@ -41,5 +51,5 @@ interface IPAVimcInterface {
}; };
interface IPAVimcEventInterface { interface IPAVimcEventInterface {
paramsBufferReady(uint32 bufferId); paramsBufferReady(uint32 bufferId, [flags] TestFlag flags);
}; };

View file

@ -31,7 +31,10 @@ public:
IPAVimc(); IPAVimc();
~IPAVimc(); ~IPAVimc();
int init(const IPASettings &settings, const ipa::vimc::IPAOperationCode code) override; int init(const IPASettings &settings,
const ipa::vimc::IPAOperationCode code,
const Flags<ipa::vimc::TestFlag> inFlags,
Flags<ipa::vimc::TestFlag> *outFlags) override;
int start() override; int start() override;
void stop() override; void stop() override;
@ -66,7 +69,10 @@ IPAVimc::~IPAVimc()
::close(fd_); ::close(fd_);
} }
int IPAVimc::init(const IPASettings &settings, const ipa::vimc::IPAOperationCode code) int IPAVimc::init(const IPASettings &settings,
const ipa::vimc::IPAOperationCode code,
const Flags<ipa::vimc::TestFlag> inFlags,
Flags<ipa::vimc::TestFlag> *outFlags)
{ {
trace(ipa::vimc::IPAOperationInit); trace(ipa::vimc::IPAOperationInit);
@ -76,6 +82,13 @@ int IPAVimc::init(const IPASettings &settings, const ipa::vimc::IPAOperationCode
LOG(IPAVimc, Debug) << "Got opcode " << code; LOG(IPAVimc, Debug) << "Got opcode " << code;
LOG(IPAVimc, Debug)
<< "Flag 2 was "
<< (inFlags & ipa::vimc::TestFlag::Flag2 ? "" : "not ")
<< "set";
*outFlags |= ipa::vimc::TestFlag::Flag1;
File conf(settings.configurationFile); File conf(settings.configurationFile);
if (!conf.open(File::OpenModeFlag::ReadOnly)) { if (!conf.open(File::OpenModeFlag::ReadOnly)) {
LOG(IPAVimc, Error) << "Failed to open configuration file"; LOG(IPAVimc, Error) << "Failed to open configuration file";
@ -144,7 +157,8 @@ void IPAVimc::fillParamsBuffer([[maybe_unused]] uint32_t frame, uint32_t bufferI
return; return;
} }
paramsBufferReady.emit(bufferId); Flags<ipa::vimc::TestFlag> flags;
paramsBufferReady.emit(bufferId, flags);
} }
void IPAVimc::initTrace() void IPAVimc::initTrace()

View file

@ -54,7 +54,7 @@ public:
int init(); int init();
int allocateMockIPABuffers(); int allocateMockIPABuffers();
void bufferReady(FrameBuffer *buffer); void bufferReady(FrameBuffer *buffer);
void paramsBufferReady(unsigned int id); void paramsBufferReady(unsigned int id, const Flags<ipa::vimc::TestFlag> flags);
MediaDevice *media_; MediaDevice *media_;
std::unique_ptr<CameraSensor> sensor_; std::unique_ptr<CameraSensor> sensor_;
@ -471,7 +471,15 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
data->ipa_->paramsBufferReady.connect(data.get(), &VimcCameraData::paramsBufferReady); data->ipa_->paramsBufferReady.connect(data.get(), &VimcCameraData::paramsBufferReady);
std::string conf = data->ipa_->configurationFile("vimc.conf"); std::string conf = data->ipa_->configurationFile("vimc.conf");
data->ipa_->init(IPASettings{ conf, data->sensor_->model() }, ipa::vimc::IPAOperationInit); Flags<ipa::vimc::TestFlag> inFlags = ipa::vimc::TestFlag::Flag2;
Flags<ipa::vimc::TestFlag> outFlags;
data->ipa_->init(IPASettings{ conf, data->sensor_->model() },
ipa::vimc::IPAOperationInit, inFlags, &outFlags);
LOG(VIMC, Debug)
<< "Flag 1 was "
<< (outFlags & ipa::vimc::TestFlag::Flag1 ? "" : "not ")
<< "set";
/* Create and register the camera. */ /* Create and register the camera. */
std::set<Stream *> streams{ &data->stream_ }; std::set<Stream *> streams{ &data->stream_ };
@ -608,7 +616,8 @@ int VimcCameraData::allocateMockIPABuffers()
return video_->exportBuffers(kBufCount, &mockIPABufs_); return video_->exportBuffers(kBufCount, &mockIPABufs_);
} }
void VimcCameraData::paramsBufferReady([[maybe_unused]] unsigned int id) void VimcCameraData::paramsBufferReady([[maybe_unused]] unsigned int id,
[[maybe_unused]] const Flags<ipa::vimc::TestFlag> flags)
{ {
} }

View file

@ -106,7 +106,11 @@ protected:
/* Test initialization of IPA module. */ /* Test initialization of IPA module. */
std::string conf = ipa_->configurationFile("vimc.conf"); std::string conf = ipa_->configurationFile("vimc.conf");
int ret = ipa_->init(IPASettings{ conf, "vimc" }, ipa::vimc::IPAOperationInit); Flags<ipa::vimc::TestFlag> inFlags;
Flags<ipa::vimc::TestFlag> outFlags;
int ret = ipa_->init(IPASettings{ conf, "vimc" },
ipa::vimc::IPAOperationInit,
inFlags, &outFlags);
if (ret < 0) { if (ret < 0) {
cerr << "IPA interface init() failed" << endl; cerr << "IPA interface init() failed" << endl;
return TestFail; return TestFail;