From patchwork Wed Feb 20 23:59:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 600 Return-Path: Received: from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net [195.74.38.227]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C067660100 for ; Thu, 21 Feb 2019 00:59:53 +0100 (CET) X-Halon-ID: 9b8396a3-356b-11e9-b530-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [89.233.230.99]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id 9b8396a3-356b-11e9-b530-005056917a89; Thu, 21 Feb 2019 00:59:50 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Thu, 21 Feb 2019 00:59:36 +0100 Message-Id: <20190220235939.25147-2-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190220235939.25147-1-niklas.soderlund@ragnatech.se> References: <20190220235939.25147-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/4] libcamera: pipeline_handler: extend documentation for configureStreams() X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Feb 2019 23:59:54 -0000 Extend the documentation to explicitly state that the pipeline handler implementations are responsible to validate the requested configuration can be exactly satisfied by the hardware. Signed-off-by: Niklas Söderlund --- src/libcamera/pipeline_handler.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 616838fed702fec7..991674b34286ab16 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -136,6 +136,15 @@ PipelineHandler::~PipelineHandler() * is the Camera class which will receive configuration to apply from the * application. * + * Each pipeline handler implementation is responsible to validate that the + * configuration requested in \a config is exactly the same that is actually + * programmed and accepted by the hardware itself. If the format programmed + * differers from the one requested the pipeline handler shall return the + * error -EINVAL. If one streams configuration can't be satisfied by the + * hardware the pipeline handler does not need to try and program any other + * streams in \a config and the whole operation shall be consider to have + * failed. + * * \return 0 on success or a negative error code on error. */ From patchwork Wed Feb 20 23:59:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 601 Return-Path: Received: from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net [195.74.38.229]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3B3E660100 for ; Thu, 21 Feb 2019 00:59:54 +0100 (CET) X-Halon-ID: 9bcdbd45-356b-11e9-b530-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [89.233.230.99]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id 9bcdbd45-356b-11e9-b530-005056917a89; Thu, 21 Feb 2019 00:59:50 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Thu, 21 Feb 2019 00:59:37 +0100 Message-Id: <20190220235939.25147-3-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190220235939.25147-1-niklas.soderlund@ragnatech.se> References: <20190220235939.25147-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/4] libcamera: pipeline: uvcvideo: enforce stream configuration X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Feb 2019 23:59:54 -0000 The format requested by configureStreams() should exactly match what programmed on the video device it self. If they do not match the call should fail as the application in that case will not know what configuration actually was programmed. Signed-off-by: Niklas Söderlund --- src/libcamera/pipeline/uvcvideo.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index 37a3477c2c56f3ea..b7b8ff109109e9c5 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -84,6 +84,7 @@ int PipelineHandlerUVC::configureStreams(Camera *camera, std::map &config) { StreamConfiguration *cfg = &config[&stream_]; + int ret; LOG(UVC, Debug) << "Configure the camera for resolution " << cfg->width << "x" << cfg->height; @@ -93,7 +94,16 @@ int PipelineHandlerUVC::configureStreams(Camera *camera, format.height = cfg->height; format.fourcc = cfg->pixelFormat; - return video_->setFormat(&format); + ret = video_->setFormat(&format); + if (ret) + return ret; + + if (format.width != cfg->width || + format.height != cfg->height || + format.fourcc != cfg->pixelFormat) + return -EINVAL; + + return 0; } int PipelineHandlerUVC::allocateBuffers(Camera *camera, Stream *stream) From patchwork Wed Feb 20 23:59:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 602 Return-Path: Received: from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net [195.74.38.229]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 71419601E4 for ; Thu, 21 Feb 2019 00:59:54 +0100 (CET) X-Halon-ID: 9c1aa7d2-356b-11e9-b530-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [89.233.230.99]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id 9c1aa7d2-356b-11e9-b530-005056917a89; Thu, 21 Feb 2019 00:59:51 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Thu, 21 Feb 2019 00:59:38 +0100 Message-Id: <20190220235939.25147-4-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190220235939.25147-1-niklas.soderlund@ragnatech.se> References: <20190220235939.25147-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/4] libcamera: pipeline: vimc: enforce stream configuration X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Feb 2019 23:59:54 -0000 The format requested by configureStreams() should exactly match what programmed on the video device it self. If they do not match the call should fail as the application in that case will not know what configuration actually was programmed. Signed-off-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- src/libcamera/pipeline/vimc.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp index a93a7589643834c6..812777cffbb3e618 100644 --- a/src/libcamera/pipeline/vimc.cpp +++ b/src/libcamera/pipeline/vimc.cpp @@ -83,6 +83,7 @@ int PipelineHandlerVimc::configureStreams(Camera *camera, std::map &config) { StreamConfiguration *cfg = &config[&stream_]; + int ret; LOG(VIMC, Debug) << "Configure the camera for resolution " << cfg->width << "x" << cfg->height; @@ -92,7 +93,16 @@ int PipelineHandlerVimc::configureStreams(Camera *camera, format.height = cfg->height; format.fourcc = cfg->pixelFormat; - return video_->setFormat(&format); + ret = video_->setFormat(&format); + if (ret) + return ret; + + if (format.width != cfg->width || + format.height != cfg->height || + format.fourcc != cfg->pixelFormat) + return -EINVAL; + + return 0; } int PipelineHandlerVimc::allocateBuffers(Camera *camera, Stream *stream) From patchwork Wed Feb 20 23:59:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 603 Return-Path: Received: from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net [195.74.38.229]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E59E6601E7 for ; Thu, 21 Feb 2019 00:59:54 +0100 (CET) X-Halon-ID: 9c61c101-356b-11e9-b530-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [89.233.230.99]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id 9c61c101-356b-11e9-b530-005056917a89; Thu, 21 Feb 2019 00:59:51 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Thu, 21 Feb 2019 00:59:39 +0100 Message-Id: <20190220235939.25147-5-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190220235939.25147-1-niklas.soderlund@ragnatech.se> References: <20190220235939.25147-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 4/4] cam: fix return type of configureStreams() X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Feb 2019 23:59:55 -0000 The only caller of configureStreams() stores its return value as an int and not bool. This is confusing and also prevents the (possibly) different error codes returned by Camera::configureStreams() to be propagated inside the cam tool. Fix this by changing the return type to int and propagate the return value from the camera. Signed-off-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- src/cam/main.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/cam/main.cpp b/src/cam/main.cpp index 9b67ab75a6a1663e..7c47ce652aa025d1 100644 --- a/src/cam/main.cpp +++ b/src/cam/main.cpp @@ -78,7 +78,7 @@ static int parseOptions(int argc, char *argv[]) return 0; } -static bool configureStreams(Camera *camera, std::vector &streams) +static int configureStreams(Camera *camera, std::vector &streams) { KeyValueParser::Options format = options[OptFormat]; Stream *id = streams.front(); @@ -98,10 +98,7 @@ static bool configureStreams(Camera *camera, std::vector &streams) config[id].pixelFormat = format["pixelformat"]; } - if (camera->configureStreams(config)) - return false; - - return true; + return camera->configureStreams(config); } static void requestComplete(Request *request, const std::map &buffers)