Patch Detail
Show a patch.
GET /api/1.1/patches/11753/?format=api
{ "id": 11753, "url": "https://patchwork.libcamera.org/api/1.1/patches/11753/?format=api", "web_url": "https://patchwork.libcamera.org/patch/11753/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20210329002715.74403-4-hiroh@chromium.org>", "date": "2021-03-29T00:27:15", "name": "[libcamera-devel,3/3] Regard a request error in the request completion", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": false, "hash": "d9931d1be0a2adf7cb7721a57221542150a2d53b", "submitter": { "id": 63, "url": "https://patchwork.libcamera.org/api/1.1/people/63/?format=api", "name": "Hirokazu Honda", "email": "hiroh@chromium.org" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/11753/mbox/", "series": [ { "id": 1856, "url": "https://patchwork.libcamera.org/api/1.1/series/1856/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1856", "date": "2021-03-29T00:27:12", "name": "Handle an request error", "version": 1, "mbox": "https://patchwork.libcamera.org/series/1856/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/11753/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/11753/checks/", "tags": {}, "headers": { "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>", "X-Original-To": "parsemail@patchwork.libcamera.org", "Delivered-To": "parsemail@patchwork.libcamera.org", "Received": [ "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id A583CC32ED\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 29 Mar 2021 00:27:32 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 615FB68784;\n\tMon, 29 Mar 2021 02:27:32 +0200 (CEST)", "from mail-pl1-x634.google.com (mail-pl1-x634.google.com\n\t[IPv6:2607:f8b0:4864:20::634])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 473CD602D2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 29 Mar 2021 02:27:29 +0200 (CEST)", "by mail-pl1-x634.google.com with SMTP id l1so3573470plg.12\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 28 Mar 2021 17:27:29 -0700 (PDT)", "from hiroh2.tok.corp.google.com\n\t([2401:fa00:8f:2:1db7:ae60:9288:b906])\n\tby smtp.gmail.com with ESMTPSA id\n\tj188sm15227209pfd.64.2021.03.28.17.27.26\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSun, 28 Mar 2021 17:27:27 -0700 (PDT)" ], "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"jeJ01GXy\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=qN4zyYtjze+RpnIPIXlkhNzNPt6huMpyeir3TFZj5MU=;\n\tb=jeJ01GXy7v9UaPcTs8rgCvKr/4rJTdUsxpB1P2BPZ8DCi4xKogd+HJFhxNQHKw76c7\n\tykxk8/5ANXocIVLZVEzTKHDsULh8pxSozl4LRx8e5Md13bda3u9TOtt6/xdK1rWwpVJR\n\thqMumJCkWMxX11mZ2nIrr18L0APwF3uaQzFhk=", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:mime-version:content-transfer-encoding;\n\tbh=qN4zyYtjze+RpnIPIXlkhNzNPt6huMpyeir3TFZj5MU=;\n\tb=Wxv4Uvgmx7Ki0rAdVduJBSSexcBs94c/3DVIjwQV75WYVD3EWEcmxNzZQCih7q9WGe\n\t0O6dpkr4Ppp8pr11iC6SMxiWQXXVpvbpe+4CYkdVDB+XkTOLa7NHyXJzWfA6jz4AzvXe\n\taesCxv3fGwbVB8Cj+OkiCB4+1mHXbXcdQtfHRkt5w4BWBtmUZAwwAsA4RpKwBiAIANL1\n\tynjnX3FILIjHjYMRDm5ESqEM5jZhPnmusyelNGVgZxd5UyWZO5nams8S30GT7V25h3PB\n\tYkZ5lCLMQFV5EgZssA3RDSbFW+bX+X1ZOgwac/7IWK134Jwmkp7DPb4Pf1hWs54SKDXE\n\txAVA==", "X-Gm-Message-State": "AOAM533XmsM8vNlgaly34GNpg81ByU7v6XHIn8R0N1em+TL5m5PK/e2H\n\tv7AyjNpzEfB+kNGA7yEBpnnyOpq0h3eseQ==", "X-Google-Smtp-Source": "ABdhPJzGZXQ/V5PiDltlP5G0Ljpoj4pTWmm4JwVBY5GvJneqxOS/P4zScEy3SH9aMKzSIF5oeSeftw==", "X-Received": "by 2002:a17:902:9897:b029:e6:f01d:9ca1 with SMTP id\n\ts23-20020a1709029897b02900e6f01d9ca1mr26443643plp.40.1616977647412; \n\tSun, 28 Mar 2021 17:27:27 -0700 (PDT)", "From": "Hirokazu Honda <hiroh@chromium.org>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Mon, 29 Mar 2021 09:27:15 +0900", "Message-Id": "<20210329002715.74403-4-hiroh@chromium.org>", "X-Mailer": "git-send-email 2.31.0.291.g576ba9dcdaf-goog", "In-Reply-To": "<20210329002715.74403-1-hiroh@chromium.org>", "References": "<20210329002715.74403-1-hiroh@chromium.org>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH 3/3] Regard a request error in the request\n\tcompletion", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.29", "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>", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "libcamera::Request contains an error value. Every\nlibcamera::Camera client should regards the error in a\nrequest completion.\n\nSigned-off-by: Hirokazu Honda <hiroh@chromium.org>\n---\n Documentation/guides/application-developer.rst | 4 ++--\n src/android/camera_device.cpp | 6 ++++--\n src/cam/capture.cpp | 4 +++-\n src/gstreamer/gstlibcamerasrc.cpp | 4 ++++\n src/qcam/main_window.cpp | 4 +++-\n src/v4l2/v4l2_camera.cpp | 4 +++-\n test/camera/buffer_import.cpp | 4 +++-\n test/camera/capture.cpp | 4 +++-\n 8 files changed, 25 insertions(+), 9 deletions(-)", "diff": "diff --git a/Documentation/guides/application-developer.rst b/Documentation/guides/application-developer.rst\nindex e3430f03..d7232e7c 100644\n--- a/Documentation/guides/application-developer.rst\n+++ b/Documentation/guides/application-developer.rst\n@@ -384,13 +384,13 @@ Request completion events can be emitted for requests which have been canceled,\n for example, by unexpected application shutdown. To avoid an application\n processing invalid image data, it’s worth checking that the request has\n completed successfully. The list of request completion statuses is available in\n-the `Request::Status`_ class enum documentation.\n+the `Request::Status`_ class enum documentation and `Request::result`_.\n \n .. _Request::Status: https://www.libcamera.org/api-html/classlibcamera_1_1Request.html#a2209ba8d51af8167b25f6e3e94d5c45b\n \n .. code:: cpp\n \n- if (request->status() == Request::RequestCancelled)\n+ if (request->status() == Request::RequestCancelled || request->result() != 0)\n return;\n \n If the ``Request`` has completed successfully, applications can access the\ndiff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\nindex ae693664..d02c1776 100644\n--- a/src/android/camera_device.cpp\n+++ b/src/android/camera_device.cpp\n@@ -1908,9 +1908,11 @@ void CameraDevice::requestComplete(Request *request)\n \tCamera3RequestDescriptor *descriptor =\n \t\treinterpret_cast<Camera3RequestDescriptor *>(request->cookie());\n \n-\tif (request->status() != Request::RequestComplete) {\n+\tif (request->status() != Request::RequestComplete ||\n+\t request->result() != 0) {\n \t\tLOG(HAL, Error) << \"Request not successfully completed: \"\n-\t\t\t\t<< request->status();\n+\t\t\t\t<< \"status=\" << request->status()\n+\t\t\t\t<< \", result=\" << request->result();\n \t\tstatus = CAMERA3_BUFFER_STATUS_ERROR;\n \t}\n \ndiff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\nindex 7b55fc67..24d0be32 100644\n--- a/src/cam/capture.cpp\n+++ b/src/cam/capture.cpp\n@@ -165,8 +165,10 @@ int Capture::queueRequest(Request *request)\n \n void Capture::requestComplete(Request *request)\n {\n-\tif (request->status() == Request::RequestCancelled)\n+\tif (request->status() == Request::RequestCancelled ||\n+\t request->result() != 0) {\n \t\treturn;\n+\t}\n \n \t/*\n \t * Defer processing of the completed request to the event loop, to avoid\ndiff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\nindex 87246b40..b36ac33c 100644\n--- a/src/gstreamer/gstlibcamerasrc.cpp\n+++ b/src/gstreamer/gstlibcamerasrc.cpp\n@@ -167,6 +167,10 @@ GstLibcameraSrcState::requestCompleted(Request *request)\n \t\tGST_DEBUG_OBJECT(src_, \"Request was cancelled\");\n \t\treturn;\n \t}\n+\tif (request->result() != 0) {\n+\t\tGST_DEBUG_OBJECT(src_, \"Request was not completed successfully\");\n+\t\treturn;\n+\t}\n \n \tGstBuffer *buffer;\n \tfor (GstPad *srcpad : srcpads_) {\ndiff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\nindex 39d034de..f90310f9 100644\n--- a/src/qcam/main_window.cpp\n+++ b/src/qcam/main_window.cpp\n@@ -692,8 +692,10 @@ void MainWindow::processRaw(FrameBuffer *buffer,\n \n void MainWindow::requestComplete(Request *request)\n {\n-\tif (request->status() == Request::RequestCancelled)\n+\tif (request->status() == Request::RequestCancelled ||\n+\t request->result() != 0) {\n \t\treturn;\n+\t}\n \n \t/*\n \t * We're running in the libcamera thread context, expensive operations\ndiff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp\nindex 97825c71..87153cd4 100644\n--- a/src/v4l2/v4l2_camera.cpp\n+++ b/src/v4l2/v4l2_camera.cpp\n@@ -82,8 +82,10 @@ std::vector<V4L2Camera::Buffer> V4L2Camera::completedBuffers()\n \n void V4L2Camera::requestComplete(Request *request)\n {\n-\tif (request->status() == Request::RequestCancelled)\n+\tif (request->status() == Request::RequestCancelled ||\n+\t request->result() != 0) {\n \t\treturn;\n+\t}\n \n \t/* We only have one stream at the moment. */\n \tbufferLock_.lock();\ndiff --git a/test/camera/buffer_import.cpp b/test/camera/buffer_import.cpp\nindex 61f4eb92..8f4efa5e 100644\n--- a/test/camera/buffer_import.cpp\n+++ b/test/camera/buffer_import.cpp\n@@ -47,8 +47,10 @@ protected:\n \n \tvoid requestComplete(Request *request)\n \t{\n-\t\tif (request->status() != Request::RequestComplete)\n+\t\tif (request->status() != Request::RequestComplete ||\n+\t\t request->result() != 0) {\n \t\t\treturn;\n+\t\t}\n \n \t\tconst Request::BufferMap &buffers = request->buffers();\n \ndiff --git a/test/camera/capture.cpp b/test/camera/capture.cpp\nindex c4bc2110..6cff9bb4 100644\n--- a/test/camera/capture.cpp\n+++ b/test/camera/capture.cpp\n@@ -43,8 +43,10 @@ protected:\n \n \tvoid requestComplete(Request *request)\n \t{\n-\t\tif (request->status() != Request::RequestComplete)\n+\t\tif (request->status() != Request::RequestComplete ||\n+\t\t request->result() != 0) {\n \t\t\treturn;\n+\t\t}\n \n \t\tconst Request::BufferMap &buffers = request->buffers();\n \n", "prefixes": [ "libcamera-devel", "3/3" ] }