[{"id":1723,"web_url":"https://patchwork.libcamera.org/comment/1723/","msgid":"<a4870c1c-8af5-2d5b-cf1a-5025678615e7@ideasonboard.com>","date":"2019-05-29T13:03:56","subject":"Re: [libcamera-devel] [PATCH 2/8] libcamera: pipeline: add name,\n\tmajor version, and minor version","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Paul,\n\nOn 27/05/2019 23:35, Paul Elder wrote:\n> In order to match an IPA module with a pipeline handler, the pipeline\n> handler must have a name and a major and minor version. Add these to\n> PipelineHandler as functions, so that they can be automatically defined\n> by REGISTER_PIPELINE_HANDLER. Also update documentation accordingly.\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> ---\n>  src/libcamera/include/pipeline_handler.h | 20 ++++++++++++++++++--\n>  src/libcamera/pipeline/ipu3/ipu3.cpp     |  6 +++++-\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp |  6 +++++-\n>  src/libcamera/pipeline/uvcvideo.cpp      |  6 +++++-\n>  src/libcamera/pipeline/vimc.cpp          |  6 +++++-\n>  src/libcamera/pipeline_handler.cpp       | 20 ++++++++++++++++++++\n>  6 files changed, 58 insertions(+), 6 deletions(-)\n> \n> diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\n> index 7da6df1..7963e7a 100644\n> --- a/src/libcamera/include/pipeline_handler.h\n> +++ b/src/libcamera/include/pipeline_handler.h\n> @@ -77,6 +77,10 @@ public:\n>  \tbool completeBuffer(Camera *camera, Request *request, Buffer *buffer);\n>  \tvoid completeRequest(Camera *camera, Request *request);\n>  \n> +\tvirtual const char *name() = 0;\n> +\tvirtual int majorVersion() = 0;\n> +\tvirtual int minorVersion() = 0;\n> +\n>  protected:\n>  \tvoid registerCamera(std::shared_ptr<Camera> camera,\n>  \t\t\t    std::unique_ptr<CameraData> data);\n> @@ -112,7 +116,7 @@ private:\n>  \tstd::string name_;\n>  };\n>  \n> -#define REGISTER_PIPELINE_HANDLER(handler)\t\t\t\t\\\n> +#define REGISTER_PIPELINE_HANDLER(handler, majorV, minorV)\t\t\\\n>  class handler##Factory final : public PipelineHandlerFactory\t\t\\\n>  {\t\t\t\t\t\t\t\t\t\\\n>  public:\t\t\t\t\t\t\t\t\t\\\n> @@ -122,7 +126,19 @@ public:\t\t\t\t\t\t\t\t\t\\\n>  \t\treturn std::make_shared<handler>(manager);\t\t\\\n>  \t}\t\t\t\t\t\t\t\t\\\n>  };\t\t\t\t\t\t\t\t\t\\\n> -static handler##Factory global_##handler##Factory;\n> +static handler##Factory global_##handler##Factory;\t\t\t\\\n> +const char *handler::name()\t\t\t\t\t\t\\\n> +{\t\t\t\t\t\t\t\t\t\\\n> +\treturn #handler;\t\t\t\t\t\t\\\n> +}\t\t\t\t\t\t\t\t\t\\\n> +int handler::majorVersion()\t\t\t\t\t\t\\\n> +{\t\t\t\t\t\t\t\t\t\\\n> +\treturn majorV;\t\t\t\t\t\t\t\\\n> +}\t\t\t\t\t\t\t\t\t\\\n> +int handler::minorVersion()\t\t\t\t\t\t\\\n> +{\t\t\t\t\t\t\t\t\t\\\n> +\treturn minorV;\t\t\t\t\t\t\t\\\n> +}\n\nInstead of duplicating these in each class, can they be put into the\nbase class at construction time, and handled by member functions there?\n\n\n\n>  } /* namespace libcamera */\n>  \n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 05005c4..a1b06fe 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -212,6 +212,10 @@ public:\n>  \n>  \tbool match(DeviceEnumerator *enumerator) override;\n>  \n> +\tconst char *name() override;\n> +\tint majorVersion() override;\n> +\tint minorVersion() override;\n\nThen we wouldn't have to add these overrides to each handler...\n\n> +\n>  private:\n>  \tIPU3CameraData *cameraData(const Camera *camera)\n>  \t{\n> @@ -1452,6 +1456,6 @@ int CIO2Device::mediaBusToFormat(unsigned int code)\n>  \t}\n>  }\n>  \n> -REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3);\n> +REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3, 0, 1);\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 9b3eea2..7042e7f 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -92,6 +92,10 @@ public:\n>  \n>  \tbool match(DeviceEnumerator *enumerator) override;\n>  \n> +\tconst char *name() override;\n> +\tint majorVersion() override;\n> +\tint minorVersion() override;\n> +\n>  private:\n>  \tRkISP1CameraData *cameraData(const Camera *camera)\n>  \t{\n> @@ -499,6 +503,6 @@ void PipelineHandlerRkISP1::bufferReady(Buffer *buffer)\n>  \tcompleteRequest(activeCamera_, request);\n>  }\n>  \n> -REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1);\n> +REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1, 0, 1);\n\nDo we define the rules anywhere on when the version number should be\nupdated?\n\nCould we potentially automate this in the future in anyway?\n(checksum of the PipelineHandler? (probably too crazy, and not linear\nfor matching and tracking backwards compatibility)\n\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\n> index 45260f3..27c731e 100644\n> --- a/src/libcamera/pipeline/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo.cpp\n> @@ -68,6 +68,10 @@ public:\n>  \n>  \tbool match(DeviceEnumerator *enumerator) override;\n>  \n> +\tconst char *name() override;\n> +\tint majorVersion() override;\n> +\tint minorVersion() override;\n> +\n>  private:\n>  \tUVCCameraData *cameraData(const Camera *camera)\n>  \t{\n> @@ -263,6 +267,6 @@ void UVCCameraData::bufferReady(Buffer *buffer)\n>  \tpipe_->completeRequest(camera_, request);\n>  }\n>  \n> -REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC);\n> +REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC, 0, 1);\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\n> index 0e4eede..d3ff527 100644\n> --- a/src/libcamera/pipeline/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc.cpp\n> @@ -71,6 +71,10 @@ public:\n>  \n>  \tbool match(DeviceEnumerator *enumerator) override;\n>  \n> +\tconst char *name() override;\n> +\tint majorVersion() override;\n> +\tint minorVersion() override;\n> +\n>  private:\n>  \tVimcCameraData *cameraData(const Camera *camera)\n>  \t{\n> @@ -274,6 +278,6 @@ void VimcCameraData::bufferReady(Buffer *buffer)\n>  \tpipe_->completeRequest(camera_, request);\n>  }\n>  \n> -REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc);\n> +REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc, 0, 1);\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> index dd56907..8f83307 100644\n> --- a/src/libcamera/pipeline_handler.cpp\n> +++ b/src/libcamera/pipeline_handler.cpp\n> @@ -505,6 +505,24 @@ CameraData *PipelineHandler::cameraData(const Camera *camera)\n>   * constant for the whole lifetime of the pipeline handler.\n>   */\n>  \n> +/**\n> + * \\fn PipelineHandler::name()\n> + * \\brief Retrieve the pipeline handler name\n> + * \\return The pipeline handler name\n> + */\n> +\n> +/**\n> + * \\fn PipelineHandler::majorVersion()\n> + * \\brief Retrieve the pipeline handler major version\n> + * \\return The pipeline handler major version\n> + */\n> +\n> +/**\n> + * \\fn PipelineHandler::minorVersion()\n> + * \\brief Retrieve the pipeline handler minor version\n> + * \\return The pipeline handler minor version\n> + */\n> +\n>  /**\n>   * \\class PipelineHandlerFactory\n>   * \\brief Registration of PipelineHandler classes and creation of instances\n> @@ -586,6 +604,8 @@ std::vector<PipelineHandlerFactory *> &PipelineHandlerFactory::factories()\n>   * \\def REGISTER_PIPELINE_HANDLER\n>   * \\brief Register a pipeline handler with the pipeline handler factory\n>   * \\param[in] handler Class name of PipelineHandler derived class to register\n> + * \\param[in] majorV Major version of the PipelineHandler\n> + * \\param[in] minorV Minor version of the PipelineHandler\n>   *\n>   * Register a PipelineHandler subclass with the factory and make it available to\n>   * try and match devices.\n>","headers":{"Return-Path":"<kieran.bingham@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 29CE060E46\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 29 May 2019 15:04:00 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7C1D2524;\n\tWed, 29 May 2019 15:03:59 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1559135039;\n\tbh=BZ8IQBML4bo1t8ZJ2FJWb68Ma8Ow6ldVnqYdl2xUlJg=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=VEbEpr9iz2abHslqkSdm7SJfZ771fDskQraMvqxp2wpT0JS4si51ymN6kx35InRF+\n\tU+f+/kiLKoekO79s18RdP50rOVCrX84kob7BW+r2Gb6H7ZnPlgS4rDnT0kwL/QSKVU\n\t8ZxPTW0VZpWT5hrhGz0Vn0m+XzAy/A1FCwB2F3u8=","Reply-To":"kieran.bingham@ideasonboard.com","To":"Paul Elder <paul.elder@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20190527223540.21855-1-paul.elder@ideasonboard.com>\n\t<20190527223540.21855-3-paul.elder@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Openpgp":"preference=signencrypt","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tsbsRB8KNNvVXBOVNwko86rQqF9drZuw=","Organization":"Ideas on Board","Message-ID":"<a4870c1c-8af5-2d5b-cf1a-5025678615e7@ideasonboard.com>","Date":"Wed, 29 May 2019 14:03:56 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101\n\tThunderbird/60.6.1","MIME-Version":"1.0","In-Reply-To":"<20190527223540.21855-3-paul.elder@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [PATCH 2/8] libcamera: pipeline: add name,\n\tmajor version, and minor version","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Wed, 29 May 2019 13:04:00 -0000"}},{"id":1744,"web_url":"https://patchwork.libcamera.org/comment/1744/","msgid":"<20190603222110.GE2960@bigcity.dyn.berto.se>","date":"2019-06-03T22:21:10","subject":"Re: [libcamera-devel] [PATCH 2/8] libcamera: pipeline: add name,\n\tmajor version, and minor version","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Paul,\n\nThanks for your work.\n\nOn 2019-05-27 18:35:34 -0400, Paul Elder wrote:\n> In order to match an IPA module with a pipeline handler, the pipeline\n> handler must have a name and a major and minor version. Add these to\n> PipelineHandler as functions, so that they can be automatically defined\n> by REGISTER_PIPELINE_HANDLER. Also update documentation accordingly.\n\nI'm a bit curious why you went with a major and minor version \nidentifiers. I understand they can be useful to describe API version \n(major) and bugfix state (minior).\n\nMy question is will this be useful for PipelineHandler <-> IPA matching?\n\nI have really bad experience working with major.minor versioning. In my \nexperience it's likely to creep in API changes in minor bug fixes even \nif that is not the intent. Once that happens once, one of two things are \nlikely to follow,\n\n    1. On a new release of libcamera all pipeline handlers needs to be \n       tested with all minor versions of major versions IPA's not \n       shipped with libcamera claim to support.\n\n    2. Begin to exclusively match on a list of known good major.minior \n       combinations. Preventing libcamera to work with bugfixes of 3rd \n       party IPA who might be well behaved.\n\nMaybe I'm being cynical but I would like for us to consider a single \ninteger as a version indicator. This version would describe the API \nbetween pipeline handler and IPA and not the version of the components \nthemself. Or maybe I'm misunderstanding the advantages of major.minor \ndesign in this problem ;-)\n\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> ---\n>  src/libcamera/include/pipeline_handler.h | 20 ++++++++++++++++++--\n>  src/libcamera/pipeline/ipu3/ipu3.cpp     |  6 +++++-\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp |  6 +++++-\n>  src/libcamera/pipeline/uvcvideo.cpp      |  6 +++++-\n>  src/libcamera/pipeline/vimc.cpp          |  6 +++++-\n>  src/libcamera/pipeline_handler.cpp       | 20 ++++++++++++++++++++\n>  6 files changed, 58 insertions(+), 6 deletions(-)\n> \n> diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\n> index 7da6df1..7963e7a 100644\n> --- a/src/libcamera/include/pipeline_handler.h\n> +++ b/src/libcamera/include/pipeline_handler.h\n> @@ -77,6 +77,10 @@ public:\n>  \tbool completeBuffer(Camera *camera, Request *request, Buffer *buffer);\n>  \tvoid completeRequest(Camera *camera, Request *request);\n>  \n> +\tvirtual const char *name() = 0;\n> +\tvirtual int majorVersion() = 0;\n> +\tvirtual int minorVersion() = 0;\n> +\n>  protected:\n>  \tvoid registerCamera(std::shared_ptr<Camera> camera,\n>  \t\t\t    std::unique_ptr<CameraData> data);\n> @@ -112,7 +116,7 @@ private:\n>  \tstd::string name_;\n>  };\n>  \n> -#define REGISTER_PIPELINE_HANDLER(handler)\t\t\t\t\\\n> +#define REGISTER_PIPELINE_HANDLER(handler, majorV, minorV)\t\t\\\n>  class handler##Factory final : public PipelineHandlerFactory\t\t\\\n>  {\t\t\t\t\t\t\t\t\t\\\n>  public:\t\t\t\t\t\t\t\t\t\\\n> @@ -122,7 +126,19 @@ public:\t\t\t\t\t\t\t\t\t\\\n>  \t\treturn std::make_shared<handler>(manager);\t\t\\\n>  \t}\t\t\t\t\t\t\t\t\\\n>  };\t\t\t\t\t\t\t\t\t\\\n> -static handler##Factory global_##handler##Factory;\n> +static handler##Factory global_##handler##Factory;\t\t\t\\\n> +const char *handler::name()\t\t\t\t\t\t\\\n> +{\t\t\t\t\t\t\t\t\t\\\n> +\treturn #handler;\t\t\t\t\t\t\\\n> +}\t\t\t\t\t\t\t\t\t\\\n> +int handler::majorVersion()\t\t\t\t\t\t\\\n> +{\t\t\t\t\t\t\t\t\t\\\n> +\treturn majorV;\t\t\t\t\t\t\t\\\n> +}\t\t\t\t\t\t\t\t\t\\\n> +int handler::minorVersion()\t\t\t\t\t\t\\\n> +{\t\t\t\t\t\t\t\t\t\\\n> +\treturn minorV;\t\t\t\t\t\t\t\\\n> +}\n>  \n>  } /* namespace libcamera */\n>  \n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 05005c4..a1b06fe 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -212,6 +212,10 @@ public:\n>  \n>  \tbool match(DeviceEnumerator *enumerator) override;\n>  \n> +\tconst char *name() override;\n> +\tint majorVersion() override;\n> +\tint minorVersion() override;\n> +\n>  private:\n>  \tIPU3CameraData *cameraData(const Camera *camera)\n>  \t{\n> @@ -1452,6 +1456,6 @@ int CIO2Device::mediaBusToFormat(unsigned int code)\n>  \t}\n>  }\n>  \n> -REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3);\n> +REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3, 0, 1);\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 9b3eea2..7042e7f 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -92,6 +92,10 @@ public:\n>  \n>  \tbool match(DeviceEnumerator *enumerator) override;\n>  \n> +\tconst char *name() override;\n> +\tint majorVersion() override;\n> +\tint minorVersion() override;\n> +\n>  private:\n>  \tRkISP1CameraData *cameraData(const Camera *camera)\n>  \t{\n> @@ -499,6 +503,6 @@ void PipelineHandlerRkISP1::bufferReady(Buffer *buffer)\n>  \tcompleteRequest(activeCamera_, request);\n>  }\n>  \n> -REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1);\n> +REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1, 0, 1);\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\n> index 45260f3..27c731e 100644\n> --- a/src/libcamera/pipeline/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo.cpp\n> @@ -68,6 +68,10 @@ public:\n>  \n>  \tbool match(DeviceEnumerator *enumerator) override;\n>  \n> +\tconst char *name() override;\n> +\tint majorVersion() override;\n> +\tint minorVersion() override;\n> +\n>  private:\n>  \tUVCCameraData *cameraData(const Camera *camera)\n>  \t{\n> @@ -263,6 +267,6 @@ void UVCCameraData::bufferReady(Buffer *buffer)\n>  \tpipe_->completeRequest(camera_, request);\n>  }\n>  \n> -REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC);\n> +REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC, 0, 1);\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\n> index 0e4eede..d3ff527 100644\n> --- a/src/libcamera/pipeline/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc.cpp\n> @@ -71,6 +71,10 @@ public:\n>  \n>  \tbool match(DeviceEnumerator *enumerator) override;\n>  \n> +\tconst char *name() override;\n> +\tint majorVersion() override;\n> +\tint minorVersion() override;\n> +\n>  private:\n>  \tVimcCameraData *cameraData(const Camera *camera)\n>  \t{\n> @@ -274,6 +278,6 @@ void VimcCameraData::bufferReady(Buffer *buffer)\n>  \tpipe_->completeRequest(camera_, request);\n>  }\n>  \n> -REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc);\n> +REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc, 0, 1);\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> index dd56907..8f83307 100644\n> --- a/src/libcamera/pipeline_handler.cpp\n> +++ b/src/libcamera/pipeline_handler.cpp\n> @@ -505,6 +505,24 @@ CameraData *PipelineHandler::cameraData(const Camera *camera)\n>   * constant for the whole lifetime of the pipeline handler.\n>   */\n>  \n> +/**\n> + * \\fn PipelineHandler::name()\n> + * \\brief Retrieve the pipeline handler name\n> + * \\return The pipeline handler name\n> + */\n> +\n> +/**\n> + * \\fn PipelineHandler::majorVersion()\n> + * \\brief Retrieve the pipeline handler major version\n> + * \\return The pipeline handler major version\n> + */\n> +\n> +/**\n> + * \\fn PipelineHandler::minorVersion()\n> + * \\brief Retrieve the pipeline handler minor version\n> + * \\return The pipeline handler minor version\n> + */\n> +\n>  /**\n>   * \\class PipelineHandlerFactory\n>   * \\brief Registration of PipelineHandler classes and creation of instances\n> @@ -586,6 +604,8 @@ std::vector<PipelineHandlerFactory *> &PipelineHandlerFactory::factories()\n>   * \\def REGISTER_PIPELINE_HANDLER\n>   * \\brief Register a pipeline handler with the pipeline handler factory\n>   * \\param[in] handler Class name of PipelineHandler derived class to register\n> + * \\param[in] majorV Major version of the PipelineHandler\n> + * \\param[in] minorV Minor version of the PipelineHandler\n>   *\n>   * Register a PipelineHandler subclass with the factory and make it available to\n>   * try and match devices.\n> -- \n> 2.20.1\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lj1-x244.google.com (mail-lj1-x244.google.com\n\t[IPv6:2a00:1450:4864:20::244])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A8C7760B1B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  4 Jun 2019 00:21:12 +0200 (CEST)","by mail-lj1-x244.google.com with SMTP id 131so5215802ljf.4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 03 Jun 2019 15:21:12 -0700 (PDT)","from localhost (89-233-230-99.cust.bredband2.com. [89.233.230.99])\n\tby smtp.gmail.com with ESMTPSA id\n\tz6sm532919lfa.45.2019.06.03.15.21.11\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tMon, 03 Jun 2019 15:21:11 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to\n\t:user-agent; bh=i20wvR6cDx2YOYrNXbuSOn2ASMjvBjlL+Rcp1wf6QAg=;\n\tb=X7qIo1vMrzvfNhCBUpr4ZtrawPWUyTOgLDemaAhtoEXv96da9mmKs2edcMDw5IW+Zj\n\t0t1om+DVZ0WntOzdLkvUsjf+eTGHMhYNXJCcOF7ZbI69uTspQRVFlcmF8F8Roq7MKrSN\n\tKelAzn4WQkMuTnzz0sd6pxqUxghgBeptjRTwthvLrcnkmQin5kgGpGGg3l/UGsuatQJR\n\tlPf4hEe8VOmg1aMvObglnshOkD7A5w+zWUQNP3hJuTCamU4K0ci/TMEsBPqtUnnn1FUa\n\tEIVYUH/4DbGvq5mTsM6w0pTpcPysKv1tsqA3atrOu22T4IA3j6ikBaOb3MXmbUawG595\n\tagNg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to:user-agent;\n\tbh=i20wvR6cDx2YOYrNXbuSOn2ASMjvBjlL+Rcp1wf6QAg=;\n\tb=O13a2/w7QPjIpB0M6qaTs9QPuffwbNY8OqUFcBnarj3ewzKo32w+UOZRS7NKrHmuTD\n\t7Wa8qtLDQourrbo1dcC3meKUETEuUzDyBKmy0TXgPUubdWyeUihYW5pQNdTuT759WNyd\n\tZuOhIwgfxCG7BEel4Uc8lSV52UmFlfyYNIRIorjXhoUGNp+Rhcd+OfrkUtT6zMz7Fg8b\n\tc6wVCwDWlHlcXIsq1/HP2TBYPTnLHhoDyv+DOZm8/y+tKoaxX2OkT1knWP0Sjr+0f2iT\n\tatXPG/5xIRRfEoOtSKxJ5FpvQycral3OHTefe8gVVTQPwP+tpzN3UNtYV0vtl/06lgiq\n\tdTSQ==","X-Gm-Message-State":"APjAAAWET08EkQ2zuQRUZuAQ4bwWAYyfsaifS2cTuIDX69/TpRy6dyJ7\n\t/C8lgTlX/mkEzJnBovxGx1h6JA==","X-Google-Smtp-Source":"APXvYqz8O8vRKMDWgk0Cgxzq3DgIqg9bW92IStEdWx7pmVjZ41IE2IOAkG5VXVOEJx6beu6pXEC8mA==","X-Received":"by 2002:a2e:9bc5:: with SMTP id w5mr15433257ljj.87.1559600472147;\n\tMon, 03 Jun 2019 15:21:12 -0700 (PDT)","Date":"Tue, 4 Jun 2019 00:21:10 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190603222110.GE2960@bigcity.dyn.berto.se>","References":"<20190527223540.21855-1-paul.elder@ideasonboard.com>\n\t<20190527223540.21855-3-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190527223540.21855-3-paul.elder@ideasonboard.com>","User-Agent":"Mutt/1.11.4 (2019-03-13)","Subject":"Re: [libcamera-devel] [PATCH 2/8] libcamera: pipeline: add name,\n\tmajor version, and minor version","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Mon, 03 Jun 2019 22:21:13 -0000"}},{"id":1750,"web_url":"https://patchwork.libcamera.org/comment/1750/","msgid":"<20190604093148.GC4771@pendragon.ideasonboard.com>","date":"2019-06-04T09:31:48","subject":"Re: [libcamera-devel] [PATCH 2/8] libcamera: pipeline: add name,\n\tmajor version, and minor version","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nOn Tue, Jun 04, 2019 at 12:21:10AM +0200, Niklas Söderlund wrote:\n> On 2019-05-27 18:35:34 -0400, Paul Elder wrote:\n> > In order to match an IPA module with a pipeline handler, the pipeline\n> > handler must have a name and a major and minor version. Add these to\n> > PipelineHandler as functions, so that they can be automatically defined\n> > by REGISTER_PIPELINE_HANDLER. Also update documentation accordingly.\n> \n> I'm a bit curious why you went with a major and minor version \n> identifiers. I understand they can be useful to describe API version \n> (major) and bugfix state (minior).\n> \n> My question is will this be useful for PipelineHandler <-> IPA matching?\n> \n> I have really bad experience working with major.minor versioning. In my \n> experience it's likely to creep in API changes in minor bug fixes even \n> if that is not the intent. Once that happens once, one of two things are \n> likely to follow,\n> \n>     1. On a new release of libcamera all pipeline handlers needs to be \n>        tested with all minor versions of major versions IPA's not \n>        shipped with libcamera claim to support.\n> \n>     2. Begin to exclusively match on a list of known good major.minior \n>        combinations. Preventing libcamera to work with bugfixes of 3rd \n>        party IPA who might be well behaved.\n> \n> Maybe I'm being cynical but I would like for us to consider a single \n> integer as a version indicator. This version would describe the API \n> between pipeline handler and IPA and not the version of the components \n> themself. Or maybe I'm misunderstanding the advantages of major.minor \n> design in this problem ;-)\n\nOur problem here is that some IPAs will be shipped as closed-source .so\nthat we won't be able to update, blocking the update of libcamera. If a\nsmall change is needed in the API between a pipeline handler and its\nIPA, in order to enable a new feature, and that change can be done\nwithout breaking backward compatibility, we don't want all the existing\nIPAs to stop working.\n\n> > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> > ---\n> >  src/libcamera/include/pipeline_handler.h | 20 ++++++++++++++++++--\n> >  src/libcamera/pipeline/ipu3/ipu3.cpp     |  6 +++++-\n> >  src/libcamera/pipeline/rkisp1/rkisp1.cpp |  6 +++++-\n> >  src/libcamera/pipeline/uvcvideo.cpp      |  6 +++++-\n> >  src/libcamera/pipeline/vimc.cpp          |  6 +++++-\n> >  src/libcamera/pipeline_handler.cpp       | 20 ++++++++++++++++++++\n> >  6 files changed, 58 insertions(+), 6 deletions(-)\n> > \n> > diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\n> > index 7da6df1..7963e7a 100644\n> > --- a/src/libcamera/include/pipeline_handler.h\n> > +++ b/src/libcamera/include/pipeline_handler.h\n> > @@ -77,6 +77,10 @@ public:\n> >  \tbool completeBuffer(Camera *camera, Request *request, Buffer *buffer);\n> >  \tvoid completeRequest(Camera *camera, Request *request);\n> >  \n> > +\tvirtual const char *name() = 0;\n> > +\tvirtual int majorVersion() = 0;\n> > +\tvirtual int minorVersion() = 0;\n> > +\n> >  protected:\n> >  \tvoid registerCamera(std::shared_ptr<Camera> camera,\n> >  \t\t\t    std::unique_ptr<CameraData> data);\n> > @@ -112,7 +116,7 @@ private:\n> >  \tstd::string name_;\n> >  };\n> >  \n> > -#define REGISTER_PIPELINE_HANDLER(handler)\t\t\t\t\\\n> > +#define REGISTER_PIPELINE_HANDLER(handler, majorV, minorV)\t\t\\\n> >  class handler##Factory final : public PipelineHandlerFactory\t\t\\\n> >  {\t\t\t\t\t\t\t\t\t\\\n> >  public:\t\t\t\t\t\t\t\t\t\\\n> > @@ -122,7 +126,19 @@ public:\t\t\t\t\t\t\t\t\t\\\n> >  \t\treturn std::make_shared<handler>(manager);\t\t\\\n> >  \t}\t\t\t\t\t\t\t\t\\\n> >  };\t\t\t\t\t\t\t\t\t\\\n> > -static handler##Factory global_##handler##Factory;\n> > +static handler##Factory global_##handler##Factory;\t\t\t\\\n> > +const char *handler::name()\t\t\t\t\t\t\\\n> > +{\t\t\t\t\t\t\t\t\t\\\n> > +\treturn #handler;\t\t\t\t\t\t\\\n> > +}\t\t\t\t\t\t\t\t\t\\\n> > +int handler::majorVersion()\t\t\t\t\t\t\\\n> > +{\t\t\t\t\t\t\t\t\t\\\n> > +\treturn majorV;\t\t\t\t\t\t\t\\\n> > +}\t\t\t\t\t\t\t\t\t\\\n> > +int handler::minorVersion()\t\t\t\t\t\t\\\n> > +{\t\t\t\t\t\t\t\t\t\\\n> > +\treturn minorV;\t\t\t\t\t\t\t\\\n> > +}\n> >  \n> >  } /* namespace libcamera */\n> >  \n> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > index 05005c4..a1b06fe 100644\n> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > @@ -212,6 +212,10 @@ public:\n> >  \n> >  \tbool match(DeviceEnumerator *enumerator) override;\n> >  \n> > +\tconst char *name() override;\n> > +\tint majorVersion() override;\n> > +\tint minorVersion() override;\n> > +\n> >  private:\n> >  \tIPU3CameraData *cameraData(const Camera *camera)\n> >  \t{\n> > @@ -1452,6 +1456,6 @@ int CIO2Device::mediaBusToFormat(unsigned int code)\n> >  \t}\n> >  }\n> >  \n> > -REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3);\n> > +REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3, 0, 1);\n> >  \n> >  } /* namespace libcamera */\n> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > index 9b3eea2..7042e7f 100644\n> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > @@ -92,6 +92,10 @@ public:\n> >  \n> >  \tbool match(DeviceEnumerator *enumerator) override;\n> >  \n> > +\tconst char *name() override;\n> > +\tint majorVersion() override;\n> > +\tint minorVersion() override;\n> > +\n> >  private:\n> >  \tRkISP1CameraData *cameraData(const Camera *camera)\n> >  \t{\n> > @@ -499,6 +503,6 @@ void PipelineHandlerRkISP1::bufferReady(Buffer *buffer)\n> >  \tcompleteRequest(activeCamera_, request);\n> >  }\n> >  \n> > -REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1);\n> > +REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1, 0, 1);\n> >  \n> >  } /* namespace libcamera */\n> > diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\n> > index 45260f3..27c731e 100644\n> > --- a/src/libcamera/pipeline/uvcvideo.cpp\n> > +++ b/src/libcamera/pipeline/uvcvideo.cpp\n> > @@ -68,6 +68,10 @@ public:\n> >  \n> >  \tbool match(DeviceEnumerator *enumerator) override;\n> >  \n> > +\tconst char *name() override;\n> > +\tint majorVersion() override;\n> > +\tint minorVersion() override;\n> > +\n> >  private:\n> >  \tUVCCameraData *cameraData(const Camera *camera)\n> >  \t{\n> > @@ -263,6 +267,6 @@ void UVCCameraData::bufferReady(Buffer *buffer)\n> >  \tpipe_->completeRequest(camera_, request);\n> >  }\n> >  \n> > -REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC);\n> > +REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC, 0, 1);\n> >  \n> >  } /* namespace libcamera */\n> > diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\n> > index 0e4eede..d3ff527 100644\n> > --- a/src/libcamera/pipeline/vimc.cpp\n> > +++ b/src/libcamera/pipeline/vimc.cpp\n> > @@ -71,6 +71,10 @@ public:\n> >  \n> >  \tbool match(DeviceEnumerator *enumerator) override;\n> >  \n> > +\tconst char *name() override;\n> > +\tint majorVersion() override;\n> > +\tint minorVersion() override;\n> > +\n> >  private:\n> >  \tVimcCameraData *cameraData(const Camera *camera)\n> >  \t{\n> > @@ -274,6 +278,6 @@ void VimcCameraData::bufferReady(Buffer *buffer)\n> >  \tpipe_->completeRequest(camera_, request);\n> >  }\n> >  \n> > -REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc);\n> > +REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc, 0, 1);\n> >  \n> >  } /* namespace libcamera */\n> > diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> > index dd56907..8f83307 100644\n> > --- a/src/libcamera/pipeline_handler.cpp\n> > +++ b/src/libcamera/pipeline_handler.cpp\n> > @@ -505,6 +505,24 @@ CameraData *PipelineHandler::cameraData(const Camera *camera)\n> >   * constant for the whole lifetime of the pipeline handler.\n> >   */\n> >  \n> > +/**\n> > + * \\fn PipelineHandler::name()\n> > + * \\brief Retrieve the pipeline handler name\n> > + * \\return The pipeline handler name\n> > + */\n> > +\n> > +/**\n> > + * \\fn PipelineHandler::majorVersion()\n> > + * \\brief Retrieve the pipeline handler major version\n> > + * \\return The pipeline handler major version\n> > + */\n> > +\n> > +/**\n> > + * \\fn PipelineHandler::minorVersion()\n> > + * \\brief Retrieve the pipeline handler minor version\n> > + * \\return The pipeline handler minor version\n> > + */\n> > +\n> >  /**\n> >   * \\class PipelineHandlerFactory\n> >   * \\brief Registration of PipelineHandler classes and creation of instances\n> > @@ -586,6 +604,8 @@ std::vector<PipelineHandlerFactory *> &PipelineHandlerFactory::factories()\n> >   * \\def REGISTER_PIPELINE_HANDLER\n> >   * \\brief Register a pipeline handler with the pipeline handler factory\n> >   * \\param[in] handler Class name of PipelineHandler derived class to register\n> > + * \\param[in] majorV Major version of the PipelineHandler\n> > + * \\param[in] minorV Minor version of the PipelineHandler\n> >   *\n> >   * Register a PipelineHandler subclass with the factory and make it available to\n> >   * try and match devices.","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 092F961BE8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  4 Jun 2019 11:32:02 +0200 (CEST)","from pendragon.ideasonboard.com (unknown\n\t[IPv6:2a02:2788:668:163:5bb7:9f6c:564c:d55e])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8562B51C;\n\tTue,  4 Jun 2019 11:32:01 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1559640721;\n\tbh=8yQ3M/ewlRueDCosBKy/6fEmMBW1B1hxHBWojFMKLk4=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=q+ZN2Mn4mzfI1Bfpbmkk0csgW8DKsc0KI3uWrIWJe9l5HpTylaMYYQjaYh15z1wQk\n\tF/80yS+BJvefjWLBBv9x7tJfh55IEeKfXWmtnpF9WxJDFye5tdpFJrBHeKBntE4Mqi\n\ta+9CX3eD49OSiWGDjjoEaQEw1evGTebY6GvO28jI=","Date":"Tue, 4 Jun 2019 12:31:48 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"Paul Elder <paul.elder@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Message-ID":"<20190604093148.GC4771@pendragon.ideasonboard.com>","References":"<20190527223540.21855-1-paul.elder@ideasonboard.com>\n\t<20190527223540.21855-3-paul.elder@ideasonboard.com>\n\t<20190603222110.GE2960@bigcity.dyn.berto.se>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190603222110.GE2960@bigcity.dyn.berto.se>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 2/8] libcamera: pipeline: add name,\n\tmajor version, and minor version","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Tue, 04 Jun 2019 09:32:02 -0000"}}]