[libcamera-devel] [PATCH v3 1/1] rkisp1: add pipeline test for rkisp1

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Jan 14 00:02:24 CET 2020


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 at ideasonboard.com
> <mailto:kieran.bingham at 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 at ideasonboard.com
>     <mailto:kieran.bingham at 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 at linaro.org
>     <mailto:show.liu at 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


More information about the libcamera-devel mailing list