Show a patch.

GET /api/patches/10492/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 10492,
    "url": "https://patchwork.libcamera.org/api/patches/10492/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/10492/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/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": "<20201124174342.19587-4-laurent.pinchart@ideasonboard.com>",
    "date": "2020-11-24T17:43:42",
    "name": "[libcamera-devel,3/3] qcam: Make log less verbose by default",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "9c565c6da187d312643d1fc93eadce34f80e3540",
    "submitter": {
        "id": 2,
        "url": "https://patchwork.libcamera.org/api/people/2/?format=api",
        "name": "Laurent Pinchart",
        "email": "laurent.pinchart@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/10492/mbox/",
    "series": [
        {
            "id": 1479,
            "url": "https://patchwork.libcamera.org/api/series/1479/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1479",
            "date": "2020-11-24T17:43:39",
            "name": "qcam: Miscellaneous patches",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/1479/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/10492/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/10492/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 B5C4CBE176\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 24 Nov 2020 17:43:58 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8391663406;\n\tTue, 24 Nov 2020 18:43:58 +0100 (CET)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EA02763401\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 24 Nov 2020 18:43:54 +0100 (CET)",
            "from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8A446183D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 24 Nov 2020 18:43:54 +0100 (CET)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"mRfZnKi3\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1606239834;\n\tbh=ITJjNxAMP1497s7O7f8PabXr5v0n8HehKBvdz27narY=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=mRfZnKi3zVah7rV6D2X/awlWFOdhw8h0SuuvuJU/ObPK48t0DkKZqbXZUDzxAs6+W\n\t4zqXm7aPKb3ExHEmhgJGGkAHJz3vI2KW7c0tk9bEx0r9fZ99pNUt4Zi5BjcG52MAMq\n\tTE7noLLD/95fyPlz9LROTVztw6xjeOQi9u/9POZs=",
        "From": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Tue, 24 Nov 2020 19:43:42 +0200",
        "Message-Id": "<20201124174342.19587-4-laurent.pinchart@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20201124174342.19587-1-laurent.pinchart@ideasonboard.com>",
        "References": "<20201124174342.19587-1-laurent.pinchart@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Subject": "[libcamera-devel] [PATCH 3/3] qcam: Make log less verbose by default",
        "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=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "The qcam log prints one message per frame, which is pretty verbose. This\nfeature is useful for debugging, but not necessarily as a default\noption. Silence it by default, and add a -v/--verbose command line\nparameter to make the log verbose.\n\nWhile this could have been handled manually by checking a verbose flag\nwhen printing the message, the feature is instead integrated with the Qt\nlog infrastructure to make it more flexible. Messages printed by\nqDebug() are now silenced by default and controlled by the -v/--verbose\nargument.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/qcam/main.cpp            |  5 +++++\n src/qcam/main_window.cpp     |  2 +-\n src/qcam/main_window.h       |  2 ++\n src/qcam/meson.build         |  1 +\n src/qcam/message_handler.cpp | 27 +++++++++++++++++++++++++++\n src/qcam/message_handler.h   | 26 ++++++++++++++++++++++++++\n 6 files changed, 62 insertions(+), 1 deletion(-)\n create mode 100644 src/qcam/message_handler.cpp\n create mode 100644 src/qcam/message_handler.h",
    "diff": "diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp\nindex 5505a5d88ef6..5eff90a3fa66 100644\n--- a/src/qcam/main.cpp\n+++ b/src/qcam/main.cpp\n@@ -16,6 +16,7 @@\n #include \"../cam/options.h\"\n #include \"../cam/stream_options.h\"\n #include \"main_window.h\"\n+#include \"message_handler.h\"\n \n void signalHandler([[maybe_unused]] int signal)\n {\n@@ -38,6 +39,8 @@ OptionsParser::Options parseOptions(int argc, char *argv[])\n \t\t\t \"renderer\", ArgumentRequired, \"renderer\");\n \tparser.addOption(OptStream, &streamKeyValue,\n \t\t\t \"Set configuration of a camera stream\", \"stream\", true);\n+\tparser.addOption(OptVerbose, OptionNone,\n+\t\t\t \"Print verbose log messages\", \"verbose\");\n \n \tOptionsParser::Options options = parser.parse(argc, argv);\n \tif (options.isSet(OptHelp))\n@@ -57,6 +60,8 @@ int main(int argc, char **argv)\n \tif (options.isSet(OptHelp))\n \t\treturn 0;\n \n+\tMessageHandler msgHandler(options.isSet(OptVerbose));\n+\n \tstruct sigaction sa = {};\n \tsa.sa_handler = &signalHandler;\n \tsigaction(SIGINT, &sa, nullptr);\ndiff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\nindex 2502ecd40abe..39d034de6bb2 100644\n--- a/src/qcam/main_window.cpp\n+++ b/src/qcam/main_window.cpp\n@@ -746,7 +746,7 @@ void MainWindow::processViewfinder(FrameBuffer *buffer)\n \tfps = lastBufferTime_ && fps ? 1000000000.0 / fps : 0.0;\n \tlastBufferTime_ = metadata.timestamp;\n \n-\tqInfo().noquote()\n+\tqDebug().noquote()\n \t\t<< QString(\"seq: %1\").arg(metadata.sequence, 6, 10, QLatin1Char('0'))\n \t\t<< \"bytesused:\" << metadata.planes[0].bytesused\n \t\t<< \"timestamp:\" << metadata.timestamp\ndiff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\nindex 64bcfebc7dbd..a9aa8ffcd8fd 100644\n--- a/src/qcam/main_window.h\n+++ b/src/qcam/main_window.h\n@@ -41,6 +41,7 @@ enum {\n \tOptHelp = 'h',\n \tOptRenderer = 'r',\n \tOptStream = 's',\n+\tOptVerbose = 'v',\n };\n \n class MainWindow : public QMainWindow\n@@ -98,6 +99,7 @@ private:\n \n \t/* Options */\n \tconst OptionsParser::Options &options_;\n+\tbool verbose_;\n \n \t/* Camera manager, camera, configuration and buffers */\n \tCameraManager *cm_;\ndiff --git a/src/qcam/meson.build b/src/qcam/meson.build\nindex 9bb48c0d06c5..ebcd5ca010cf 100644\n--- a/src/qcam/meson.build\n+++ b/src/qcam/meson.build\n@@ -6,6 +6,7 @@ qcam_sources = files([\n     'format_converter.cpp',\n     'main.cpp',\n     'main_window.cpp',\n+    'message_handler.cpp',\n     'viewfinder_qt.cpp',\n ])\n \ndiff --git a/src/qcam/message_handler.cpp b/src/qcam/message_handler.cpp\nnew file mode 100644\nindex 000000000000..261623e19ca9\n--- /dev/null\n+++ b/src/qcam/message_handler.cpp\n@@ -0,0 +1,27 @@\n+/* SPDX-License-Identifier: GPL-2.0-or-later */\n+/*\n+ * Copyright (C) 2020, Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n+ *\n+ * message_handler.cpp - qcam - Log message handling\n+ */\n+\n+#include \"message_handler.h\"\n+\n+QtMessageHandler MessageHandler::handler_ = nullptr;\n+bool MessageHandler::verbose_ = false;\n+\n+MessageHandler::MessageHandler(bool verbose)\n+{\n+\tverbose_ = verbose;\n+\thandler_ = qInstallMessageHandler(&MessageHandler::handleMessage);\n+}\n+\n+void MessageHandler::handleMessage(QtMsgType type,\n+\t\t\t\t   const QMessageLogContext &context,\n+\t\t\t\t   const QString &msg)\n+{\n+\tif (type == QtDebugMsg && !verbose_)\n+\t\treturn;\n+\n+\thandler_(type, context, msg);\n+}\ndiff --git a/src/qcam/message_handler.h b/src/qcam/message_handler.h\nnew file mode 100644\nindex 000000000000..4534db9d93f7\n--- /dev/null\n+++ b/src/qcam/message_handler.h\n@@ -0,0 +1,26 @@\n+/* SPDX-License-Identifier: GPL-2.0-or-later */\n+/*\n+ * Copyright (C) 2020, Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n+ *\n+ * message_handler.cpp - qcam - Log message handling\n+ */\n+#ifndef __QCAM_MESSAGE_HANDLER_H__\n+#define __QCAM_MESSAGE_HANDLER_H__\n+\n+#include <QtGlobal>\n+\n+class MessageHandler\n+{\n+public:\n+\tMessageHandler(bool verbose);\n+\n+private:\n+\tstatic void handleMessage(QtMsgType type,\n+\t\t\t\t  const QMessageLogContext &context,\n+\t\t\t\t  const QString &msg);\n+\n+\tstatic QtMessageHandler handler_;\n+\tstatic bool verbose_;\n+};\n+\n+#endif /* __QCAM_MESSAGE_HANDLER_H__ */\n",
    "prefixes": [
        "libcamera-devel",
        "3/3"
    ]
}