Message ID | 20200108083003.16428-2-show.liu@linaro.org |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Show, On 08/01/2020 08:30, Show Liu wrote: The commit log has been lost from the previous version. I will add the following (slightly modified) back in when applying: Add an initial simple test tool for the rkisp1 pipeline based upon the IPU3 pipeline test. Otherwise, I believe this looks good Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Some time in the future I hope we can have a generic PipelineHandler validation which can re-use a lot of code - but for now I think this is fine, and will get things started. When we know what code is duplicated, we can refactor accordingly. > Signed-off-by: Show Liu <show.liu@linaro.org> > --- > test/pipeline/meson.build | 1 + > test/pipeline/rkisp1/meson.build | 12 ++ > test/pipeline/rkisp1/rkisp1_pipeline_test.cpp | 114 ++++++++++++++++++ > 3 files changed, 127 insertions(+) > create mode 100644 test/pipeline/rkisp1/meson.build > create mode 100644 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build > index f434c79..157f789 100644 > --- a/test/pipeline/meson.build > +++ b/test/pipeline/meson.build > @@ -1 +1,2 @@ > subdir('ipu3') > +subdir('rkisp1') > diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build > new file mode 100644 > index 0000000..d3f9749 > --- /dev/null > +++ b/test/pipeline/rkisp1/meson.build > @@ -0,0 +1,12 @@ > +rkisp1_test = [ > + ['rkisp1_pipeline_test', 'rkisp1_pipeline_test.cpp'], > +] > + > +foreach t : rkisp1_test > + exe = executable(t[0], t[1], > + dependencies : libcamera_dep, > + link_with : test_libraries, > + include_directories : test_includes_internal) > + > + test(t[0], exe, suite : 'rkisp1', is_parallel : false) > +endforeach > diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > new file mode 100644 > index 0000000..91a4772 > --- /dev/null > +++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > @@ -0,0 +1,114 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > +/* > + * Copyright (C) 2020, Linaro > + * > + * Based on test/pipeline/ipu3/ipu3_pipeline_test.cpp > + * > + * rkisp1_pipeline_test.cpp - Rockchip RK3399 rkisp1 pipeline test > + */ > + > +#include <iostream> > + > +#include <sys/stat.h> > +#include <sys/types.h> > +#include <unistd.h> > + > +#include <libcamera/camera.h> > +#include <libcamera/camera_manager.h> > + > +#include "device_enumerator.h" > +#include "media_device.h" > +#include "media_object.h" > +#include "test.h" > + > +using namespace std; > +using namespace libcamera; > + > +/* > + * Verify that the RK3399 pipeline handler gets matched and cameras > + * are enumerated correctly. > + * > + * The test is supposed to be run on rockchip platform. > + * > + * The test lists all cameras registered in the system, if any camera is > + * available at all. > + */ > +class RKISP1PipelineTest : public Test > +{ > +protected: > + int init(); > + int run(); > + void cleanup(); > + > +private: > + CameraManager *cameraManager_; > + unsigned int sensors_; > +}; > + > +int RKISP1PipelineTest::init() > +{ > + unique_ptr<DeviceEnumerator> enumerator = DeviceEnumerator::create(); > + if (!enumerator) { > + cerr << "Failed to create device enumerator" << endl; > + return TestFail; > + } > + > + if (enumerator->enumerate()) { > + cerr << "Failed to enumerate media devices" << endl; > + return TestFail; > + } > + > + DeviceMatch dm("rkisp1"); > + > + std::shared_ptr<MediaDevice> rkisp1 = enumerator->search(dm); > + if (!rkisp1) { > + cerr << "Failed to find rkisp1: test skip" << endl; > + return TestSkip; > + } > + > + int ret = rkisp1->populate(); > + if (ret) { > + cerr << "Failed to populate media device " > + << rkisp1->deviceNode() << endl; > + return TestFail; > + } > + > + sensors_ = 0; > + const vector<MediaEntity *> &entities = rkisp1->entities(); > + for (MediaEntity *entity : entities) { > + if (entity->function() == MEDIA_ENT_F_CAM_SENSOR) > + sensors_++; > + } > + > + cameraManager_ = new CameraManager(); > + ret = cameraManager_->start(); > + if (ret) { > + cerr << "Failed to start the CameraManager" << endl; > + return TestFail; > + } > + > + return 0; > +} > + > +int RKISP1PipelineTest::run() > +{ > + auto cameras = cameraManager_->cameras(); > + for (const std::shared_ptr<Camera> &cam : cameras) > + cout << "Found camera '" << cam->name() << "'" << endl; > + > + if (cameras.size() != sensors_) { > + cerr << cameras.size() << " cameras registered, but " << sensors_ > + << " were expected" << endl; > + return TestFail; > + } > + > + return TestPass; > +} > + > +void RKISP1PipelineTest::cleanup() > +{ > + cameraManager_->stop(); > + delete cameraManager_; > +} > + > +TEST_REGISTER(RKISP1PipelineTest) >
Hi Kieran, On Thu, Jan 9, 2020 at 7:40 PM Kieran Bingham < kieran.bingham@ideasonboard.com> wrote: > Hi Show, > > On 08/01/2020 08:30, Show Liu wrote: > > The commit log has been lost from the previous version. > I will add the following (slightly modified) back in when applying: > > Add an initial simple test tool for the rkisp1 pipeline based upon the > IPU3 pipeline test. > OK. Thanks. > > Otherwise, I believe this looks good > > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > > Some time in the future I hope we can have a generic PipelineHandler > validation which can re-use a lot of code Agree. I am also thinking about it since Laurent mentioned previously. > - but for now I think this is > fine, and will get things started. > > When we know what code is duplicated, we can refactor accordingly. > > > Signed-off-by: Show Liu <show.liu@linaro.org> > > --- > > test/pipeline/meson.build | 1 + > > test/pipeline/rkisp1/meson.build | 12 ++ > > test/pipeline/rkisp1/rkisp1_pipeline_test.cpp | 114 ++++++++++++++++++ > > 3 files changed, 127 insertions(+) > > create mode 100644 test/pipeline/rkisp1/meson.build > > create mode 100644 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > > > diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build > > index f434c79..157f789 100644 > > --- a/test/pipeline/meson.build > > +++ b/test/pipeline/meson.build > > @@ -1 +1,2 @@ > > subdir('ipu3') > > +subdir('rkisp1') > > diff --git a/test/pipeline/rkisp1/meson.build > b/test/pipeline/rkisp1/meson.build > > new file mode 100644 > > index 0000000..d3f9749 > > --- /dev/null > > +++ b/test/pipeline/rkisp1/meson.build > > @@ -0,0 +1,12 @@ > > +rkisp1_test = [ > > + ['rkisp1_pipeline_test', 'rkisp1_pipeline_test.cpp'], > > +] > > + > > +foreach t : rkisp1_test > > + exe = executable(t[0], t[1], > > + dependencies : libcamera_dep, > > + link_with : test_libraries, > > + include_directories : test_includes_internal) > > + > > + test(t[0], exe, suite : 'rkisp1', is_parallel : false) > > +endforeach > > diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > new file mode 100644 > > index 0000000..91a4772 > > --- /dev/null > > +++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > @@ -0,0 +1,114 @@ > > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > > +/* > > + * Copyright (C) 2020, Linaro > > + * > > + * Based on test/pipeline/ipu3/ipu3_pipeline_test.cpp > > + * > > + * rkisp1_pipeline_test.cpp - Rockchip RK3399 rkisp1 pipeline test > > + */ > > + > > +#include <iostream> > > + > > +#include <sys/stat.h> > > +#include <sys/types.h> > > +#include <unistd.h> > > + > > +#include <libcamera/camera.h> > > +#include <libcamera/camera_manager.h> > > + > > +#include "device_enumerator.h" > > +#include "media_device.h" > > +#include "media_object.h" > > +#include "test.h" > > + > > +using namespace std; > > +using namespace libcamera; > > + > > +/* > > + * Verify that the RK3399 pipeline handler gets matched and cameras > > + * are enumerated correctly. > > + * > > + * The test is supposed to be run on rockchip platform. > > + * > > + * The test lists all cameras registered in the system, if any camera is > > + * available at all. > > + */ > > +class RKISP1PipelineTest : public Test > > +{ > > +protected: > > + int init(); > > + int run(); > > + void cleanup(); > > + > > +private: > > + CameraManager *cameraManager_; > > + unsigned int sensors_; > > +}; > > + > > +int RKISP1PipelineTest::init() > > +{ > > + unique_ptr<DeviceEnumerator> enumerator = > DeviceEnumerator::create(); > > + if (!enumerator) { > > + cerr << "Failed to create device enumerator" << endl; > > + return TestFail; > > + } > > + > > + if (enumerator->enumerate()) { > > + cerr << "Failed to enumerate media devices" << endl; > > + return TestFail; > > + } > > + > > + DeviceMatch dm("rkisp1"); > > + > > + std::shared_ptr<MediaDevice> rkisp1 = enumerator->search(dm); > > + if (!rkisp1) { > > + cerr << "Failed to find rkisp1: test skip" << endl; > > + return TestSkip; > > + } > > + > > + int ret = rkisp1->populate(); > > + if (ret) { > > + cerr << "Failed to populate media device " > > + << rkisp1->deviceNode() << endl; > > + return TestFail; > > + } > > + > > + sensors_ = 0; > > + const vector<MediaEntity *> &entities = rkisp1->entities(); > > + for (MediaEntity *entity : entities) { > > + if (entity->function() == MEDIA_ENT_F_CAM_SENSOR) > > + sensors_++; > > + } > > + > > + cameraManager_ = new CameraManager(); > > + ret = cameraManager_->start(); > > + if (ret) { > > + cerr << "Failed to start the CameraManager" << endl; > > + return TestFail; > > + } > > + > > + return 0; > > +} > > + > > +int RKISP1PipelineTest::run() > > +{ > > + auto cameras = cameraManager_->cameras(); > > + for (const std::shared_ptr<Camera> &cam : cameras) > > + cout << "Found camera '" << cam->name() << "'" << endl; > > + > > + if (cameras.size() != sensors_) { > > + cerr << cameras.size() << " cameras registered, but " << > sensors_ > > + << " were expected" << endl; > > + return TestFail; > > + } > > + > > + return TestPass; > > +} > > + > > +void RKISP1PipelineTest::cleanup() > > +{ > > + cameraManager_->stop(); > > + delete cameraManager_; > > +} > > + > > +TEST_REGISTER(RKISP1PipelineTest) > > > > -- > Regards > -- > Kieran >
Hi Show, Thank you, This is now pushed to master. -- Regards Kieran On 10/01/2020 01:12, Show Liu wrote: > Hi Kieran, > > > > On Thu, Jan 9, 2020 at 7:40 PM Kieran Bingham > <kieran.bingham@ideasonboard.com > <mailto:kieran.bingham@ideasonboard.com>> wrote: > > Hi Show, > > On 08/01/2020 08:30, Show Liu wrote: > > The commit log has been lost from the previous version. > I will add the following (slightly modified) back in when applying: > > Add an initial simple test tool for the rkisp1 pipeline based upon the > IPU3 pipeline test. > > OK. Thanks. > > > Otherwise, I believe this looks good > > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com > <mailto:kieran.bingham@ideasonboard.com>> > > > Some time in the future I hope we can have a generic PipelineHandler > validation which can re-use a lot of code > > Agree. I am also thinking about it since Laurent mentioned previously. > > > - but for now I think this is > fine, and will get things started. > > > When we know what code is duplicated, we can refactor accordingly. > > > Signed-off-by: Show Liu <show.liu@linaro.org > <mailto:show.liu@linaro.org>> > > --- > > test/pipeline/meson.build | 1 + > > test/pipeline/rkisp1/meson.build | 12 ++ > > test/pipeline/rkisp1/rkisp1_pipeline_test.cpp | 114 > ++++++++++++++++++ > > 3 files changed, 127 insertions(+) > > create mode 100644 test/pipeline/rkisp1/meson.build > > create mode 100644 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > > > diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build > > index f434c79..157f789 100644 > > --- a/test/pipeline/meson.build > > +++ b/test/pipeline/meson.build > > @@ -1 +1,2 @@ > > subdir('ipu3') > > +subdir('rkisp1') > > diff --git a/test/pipeline/rkisp1/meson.build > b/test/pipeline/rkisp1/meson.build > > new file mode 100644 > > index 0000000..d3f9749 > > --- /dev/null > > +++ b/test/pipeline/rkisp1/meson.build > > @@ -0,0 +1,12 @@ > > +rkisp1_test = [ > > + ['rkisp1_pipeline_test', 'rkisp1_pipeline_test.cpp'], > > +] > > + > > +foreach t : rkisp1_test > > + exe = executable(t[0], t[1], > > + dependencies : libcamera_dep, > > + link_with : test_libraries, > > + include_directories : test_includes_internal) > > + > > + test(t[0], exe, suite : 'rkisp1', is_parallel : false) > > +endforeach > > diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > new file mode 100644 > > index 0000000..91a4772 > > --- /dev/null > > +++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > @@ -0,0 +1,114 @@ > > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > > +/* > > + * Copyright (C) 2020, Linaro > > + * > > + * Based on test/pipeline/ipu3/ipu3_pipeline_test.cpp > > + * > > + * rkisp1_pipeline_test.cpp - Rockchip RK3399 rkisp1 pipeline test > > + */ > > + > > +#include <iostream> > > + > > +#include <sys/stat.h> > > +#include <sys/types.h> > > +#include <unistd.h> > > + > > +#include <libcamera/camera.h> > > +#include <libcamera/camera_manager.h> > > + > > +#include "device_enumerator.h" > > +#include "media_device.h" > > +#include "media_object.h" > > +#include "test.h" > > + > > +using namespace std; > > +using namespace libcamera; > > + > > +/* > > + * Verify that the RK3399 pipeline handler gets matched and cameras > > + * are enumerated correctly. > > + * > > + * The test is supposed to be run on rockchip platform. > > + * > > + * The test lists all cameras registered in the system, if any > camera is > > + * available at all. > > + */ > > +class RKISP1PipelineTest : public Test > > +{ > > +protected: > > + int init(); > > + int run(); > > + void cleanup(); > > + > > +private: > > + CameraManager *cameraManager_; > > + unsigned int sensors_; > > +}; > > + > > +int RKISP1PipelineTest::init() > > +{ > > + unique_ptr<DeviceEnumerator> enumerator = > DeviceEnumerator::create(); > > + if (!enumerator) { > > + cerr << "Failed to create device enumerator" << endl; > > + return TestFail; > > + } > > + > > + if (enumerator->enumerate()) { > > + cerr << "Failed to enumerate media devices" << endl; > > + return TestFail; > > + } > > + > > + DeviceMatch dm("rkisp1"); > > + > > + std::shared_ptr<MediaDevice> rkisp1 = enumerator->search(dm); > > + if (!rkisp1) { > > + cerr << "Failed to find rkisp1: test skip" << endl; > > + return TestSkip; > > + } > > + > > + int ret = rkisp1->populate(); > > + if (ret) { > > + cerr << "Failed to populate media device " > > + << rkisp1->deviceNode() << endl; > > + return TestFail; > > + } > > + > > + sensors_ = 0; > > + const vector<MediaEntity *> &entities = rkisp1->entities(); > > + for (MediaEntity *entity : entities) { > > + if (entity->function() == MEDIA_ENT_F_CAM_SENSOR) > > + sensors_++; > > + } > > + > > + cameraManager_ = new CameraManager(); > > + ret = cameraManager_->start(); > > + if (ret) { > > + cerr << "Failed to start the CameraManager" << endl; > > + return TestFail; > > + } > > + > > + return 0; > > +} > > + > > +int RKISP1PipelineTest::run() > > +{ > > + auto cameras = cameraManager_->cameras(); > > + for (const std::shared_ptr<Camera> &cam : cameras) > > + cout << "Found camera '" << cam->name() << "'" << endl; > > + > > + if (cameras.size() != sensors_) { > > + cerr << cameras.size() << " cameras registered, but > " << sensors_ > > + << " were expected" << endl; > > + return TestFail; > > + } > > + > > + return TestPass; > > +} > > + > > +void RKISP1PipelineTest::cleanup() > > +{ > > + cameraManager_->stop(); > > + delete cameraManager_; > > +} > > + > > +TEST_REGISTER(RKISP1PipelineTest)
Hi Kieran, Glad to know. Thanks. :-) Best Regards, Show Liu On Tue, Jan 14, 2020 at 7:02 AM Kieran Bingham < kieran.bingham@ideasonboard.com> wrote: > Hi Show, > > Thank you, > > This is now pushed to master. > -- > Regards > > Kieran > > > > On 10/01/2020 01:12, Show Liu wrote: > > Hi Kieran, > > > > > > > > On Thu, Jan 9, 2020 at 7:40 PM Kieran Bingham > > <kieran.bingham@ideasonboard.com > > <mailto:kieran.bingham@ideasonboard.com>> wrote: > > > > Hi Show, > > > > On 08/01/2020 08:30, Show Liu wrote: > > > > The commit log has been lost from the previous version. > > I will add the following (slightly modified) back in when applying: > > > > Add an initial simple test tool for the rkisp1 pipeline based upon > the > > IPU3 pipeline test. > > > > OK. Thanks. > > > > > > Otherwise, I believe this looks good > > > > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com > > <mailto:kieran.bingham@ideasonboard.com>> > > > > > > Some time in the future I hope we can have a generic PipelineHandler > > validation which can re-use a lot of code > > > > Agree. I am also thinking about it since Laurent mentioned previously. > > > > > > - but for now I think this is > > fine, and will get things started. > > > > > > When we know what code is duplicated, we can refactor accordingly. > > > > > Signed-off-by: Show Liu <show.liu@linaro.org > > <mailto:show.liu@linaro.org>> > > > --- > > > test/pipeline/meson.build | 1 + > > > test/pipeline/rkisp1/meson.build | 12 ++ > > > test/pipeline/rkisp1/rkisp1_pipeline_test.cpp | 114 > > ++++++++++++++++++ > > > 3 files changed, 127 insertions(+) > > > create mode 100644 test/pipeline/rkisp1/meson.build > > > create mode 100644 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > > > > > diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build > > > index f434c79..157f789 100644 > > > --- a/test/pipeline/meson.build > > > +++ b/test/pipeline/meson.build > > > @@ -1 +1,2 @@ > > > subdir('ipu3') > > > +subdir('rkisp1') > > > diff --git a/test/pipeline/rkisp1/meson.build > > b/test/pipeline/rkisp1/meson.build > > > new file mode 100644 > > > index 0000000..d3f9749 > > > --- /dev/null > > > +++ b/test/pipeline/rkisp1/meson.build > > > @@ -0,0 +1,12 @@ > > > +rkisp1_test = [ > > > + ['rkisp1_pipeline_test', > 'rkisp1_pipeline_test.cpp'], > > > +] > > > + > > > +foreach t : rkisp1_test > > > + exe = executable(t[0], t[1], > > > + dependencies : libcamera_dep, > > > + link_with : test_libraries, > > > + include_directories : test_includes_internal) > > > + > > > + test(t[0], exe, suite : 'rkisp1', is_parallel : false) > > > +endforeach > > > diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > > new file mode 100644 > > > index 0000000..91a4772 > > > --- /dev/null > > > +++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp > > > @@ -0,0 +1,114 @@ > > > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > > > +/* > > > + * Copyright (C) 2020, Linaro > > > + * > > > + * Based on test/pipeline/ipu3/ipu3_pipeline_test.cpp > > > + * > > > + * rkisp1_pipeline_test.cpp - Rockchip RK3399 rkisp1 pipeline test > > > + */ > > > + > > > +#include <iostream> > > > + > > > +#include <sys/stat.h> > > > +#include <sys/types.h> > > > +#include <unistd.h> > > > + > > > +#include <libcamera/camera.h> > > > +#include <libcamera/camera_manager.h> > > > + > > > +#include "device_enumerator.h" > > > +#include "media_device.h" > > > +#include "media_object.h" > > > +#include "test.h" > > > + > > > +using namespace std; > > > +using namespace libcamera; > > > + > > > +/* > > > + * Verify that the RK3399 pipeline handler gets matched and > cameras > > > + * are enumerated correctly. > > > + * > > > + * The test is supposed to be run on rockchip platform. > > > + * > > > + * The test lists all cameras registered in the system, if any > > camera is > > > + * available at all. > > > + */ > > > +class RKISP1PipelineTest : public Test > > > +{ > > > +protected: > > > + int init(); > > > + int run(); > > > + void cleanup(); > > > + > > > +private: > > > + CameraManager *cameraManager_; > > > + unsigned int sensors_; > > > +}; > > > + > > > +int RKISP1PipelineTest::init() > > > +{ > > > + unique_ptr<DeviceEnumerator> enumerator = > > DeviceEnumerator::create(); > > > + if (!enumerator) { > > > + cerr << "Failed to create device enumerator" << endl; > > > + return TestFail; > > > + } > > > + > > > + if (enumerator->enumerate()) { > > > + cerr << "Failed to enumerate media devices" << endl; > > > + return TestFail; > > > + } > > > + > > > + DeviceMatch dm("rkisp1"); > > > + > > > + std::shared_ptr<MediaDevice> rkisp1 = enumerator->search(dm); > > > + if (!rkisp1) { > > > + cerr << "Failed to find rkisp1: test skip" << endl; > > > + return TestSkip; > > > + } > > > + > > > + int ret = rkisp1->populate(); > > > + if (ret) { > > > + cerr << "Failed to populate media device " > > > + << rkisp1->deviceNode() << endl; > > > + return TestFail; > > > + } > > > + > > > + sensors_ = 0; > > > + const vector<MediaEntity *> &entities = rkisp1->entities(); > > > + for (MediaEntity *entity : entities) { > > > + if (entity->function() == MEDIA_ENT_F_CAM_SENSOR) > > > + sensors_++; > > > + } > > > + > > > + cameraManager_ = new CameraManager(); > > > + ret = cameraManager_->start(); > > > + if (ret) { > > > + cerr << "Failed to start the CameraManager" << endl; > > > + return TestFail; > > > + } > > > + > > > + return 0; > > > +} > > > + > > > +int RKISP1PipelineTest::run() > > > +{ > > > + auto cameras = cameraManager_->cameras(); > > > + for (const std::shared_ptr<Camera> &cam : cameras) > > > + cout << "Found camera '" << cam->name() << "'" << > endl; > > > + > > > + if (cameras.size() != sensors_) { > > > + cerr << cameras.size() << " cameras registered, but > > " << sensors_ > > > + << " were expected" << endl; > > > + return TestFail; > > > + } > > > + > > > + return TestPass; > > > +} > > > + > > > +void RKISP1PipelineTest::cleanup() > > > +{ > > > + cameraManager_->stop(); > > > + delete cameraManager_; > > > +} > > > + > > > +TEST_REGISTER(RKISP1PipelineTest) > > -- > Regards > -- > Kieran >
diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build index f434c79..157f789 100644 --- a/test/pipeline/meson.build +++ b/test/pipeline/meson.build @@ -1 +1,2 @@ subdir('ipu3') +subdir('rkisp1') diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build new file mode 100644 index 0000000..d3f9749 --- /dev/null +++ b/test/pipeline/rkisp1/meson.build @@ -0,0 +1,12 @@ +rkisp1_test = [ + ['rkisp1_pipeline_test', 'rkisp1_pipeline_test.cpp'], +] + +foreach t : rkisp1_test + exe = executable(t[0], t[1], + dependencies : libcamera_dep, + link_with : test_libraries, + include_directories : test_includes_internal) + + test(t[0], exe, suite : 'rkisp1', is_parallel : false) +endforeach diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp new file mode 100644 index 0000000..91a4772 --- /dev/null +++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp @@ -0,0 +1,114 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2020, Linaro + * + * Based on test/pipeline/ipu3/ipu3_pipeline_test.cpp + * + * rkisp1_pipeline_test.cpp - Rockchip RK3399 rkisp1 pipeline test + */ + +#include <iostream> + +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +#include <libcamera/camera.h> +#include <libcamera/camera_manager.h> + +#include "device_enumerator.h" +#include "media_device.h" +#include "media_object.h" +#include "test.h" + +using namespace std; +using namespace libcamera; + +/* + * Verify that the RK3399 pipeline handler gets matched and cameras + * are enumerated correctly. + * + * The test is supposed to be run on rockchip platform. + * + * The test lists all cameras registered in the system, if any camera is + * available at all. + */ +class RKISP1PipelineTest : public Test +{ +protected: + int init(); + int run(); + void cleanup(); + +private: + CameraManager *cameraManager_; + unsigned int sensors_; +}; + +int RKISP1PipelineTest::init() +{ + unique_ptr<DeviceEnumerator> enumerator = DeviceEnumerator::create(); + if (!enumerator) { + cerr << "Failed to create device enumerator" << endl; + return TestFail; + } + + if (enumerator->enumerate()) { + cerr << "Failed to enumerate media devices" << endl; + return TestFail; + } + + DeviceMatch dm("rkisp1"); + + std::shared_ptr<MediaDevice> rkisp1 = enumerator->search(dm); + if (!rkisp1) { + cerr << "Failed to find rkisp1: test skip" << endl; + return TestSkip; + } + + int ret = rkisp1->populate(); + if (ret) { + cerr << "Failed to populate media device " + << rkisp1->deviceNode() << endl; + return TestFail; + } + + sensors_ = 0; + const vector<MediaEntity *> &entities = rkisp1->entities(); + for (MediaEntity *entity : entities) { + if (entity->function() == MEDIA_ENT_F_CAM_SENSOR) + sensors_++; + } + + cameraManager_ = new CameraManager(); + ret = cameraManager_->start(); + if (ret) { + cerr << "Failed to start the CameraManager" << endl; + return TestFail; + } + + return 0; +} + +int RKISP1PipelineTest::run() +{ + auto cameras = cameraManager_->cameras(); + for (const std::shared_ptr<Camera> &cam : cameras) + cout << "Found camera '" << cam->name() << "'" << endl; + + if (cameras.size() != sensors_) { + cerr << cameras.size() << " cameras registered, but " << sensors_ + << " were expected" << endl; + return TestFail; + } + + return TestPass; +} + +void RKISP1PipelineTest::cleanup() +{ + cameraManager_->stop(); + delete cameraManager_; +} + +TEST_REGISTER(RKISP1PipelineTest)
Signed-off-by: Show Liu <show.liu@linaro.org> --- test/pipeline/meson.build | 1 + test/pipeline/rkisp1/meson.build | 12 ++ test/pipeline/rkisp1/rkisp1_pipeline_test.cpp | 114 ++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 test/pipeline/rkisp1/meson.build create mode 100644 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp