Show a patch.

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

{
    "id": 1950,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/1950/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/1950/",
    "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": "<20190905210940.32358-9-jacopo@jmondi.org>",
    "date": "2019-09-05T21:09:39",
    "name": "[libcamera-devel,v7,8/9] android: camera_device: Fix handling of request template",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "0a91312f29a4ce9f55e71406c039bb7856b64c31",
    "submitter": {
        "id": 3,
        "url": "https://patchwork.libcamera.org/api/1.1/people/3/?format=api",
        "name": "Jacopo Mondi",
        "email": "jacopo@jmondi.org"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/1950/mbox/",
    "series": [
        {
            "id": 482,
            "url": "https://patchwork.libcamera.org/api/1.1/series/482/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=482",
            "date": "2019-09-05T21:09:31",
            "name": "android: Rework metadata tags",
            "version": 7,
            "mbox": "https://patchwork.libcamera.org/series/482/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/1950/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/1950/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<jacopo@jmondi.org>",
        "Received": [
            "from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net\n\t[217.70.183.198])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3191E61931\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  5 Sep 2019 23:08:19 +0200 (CEST)",
            "from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 9929FC0002;\n\tThu,  5 Sep 2019 21:08:18 +0000 (UTC)"
        ],
        "X-Originating-IP": "2.224.242.101",
        "From": "Jacopo Mondi <jacopo@jmondi.org>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Thu,  5 Sep 2019 23:09:39 +0200",
        "Message-Id": "<20190905210940.32358-9-jacopo@jmondi.org>",
        "X-Mailer": "git-send-email 2.23.0",
        "In-Reply-To": "<20190905210940.32358-1-jacopo@jmondi.org>",
        "References": "<20190905210940.32358-1-jacopo@jmondi.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v7 8/9] android: camera_device: Fix\n\thandling of request template",
        "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": "Thu, 05 Sep 2019 21:08:19 -0000"
    },
    "content": "According to the Android camera HALv3 documentation, the request\ntemplate metadata pack should not be modified after it is returned to\nthe camera stack from the HAL.\n\nCurrently, the same metadata pack is used for all types of template\nrequest, without updating the capture intent there contained to match\nthe requested template type, as correctly reported by the\ncros_camera_test test application.\n\nIn order to avoid modifying the single request template already returned\nto the camera stack in order to update the capture intent it contains,\ncreate a map that associates a dedicated template to each supported\ncapture type.\n\nSigned-off-by: Jacopo Mondi <jacopo@jmondi.org>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/android/camera_device.cpp | 82 +++++++++++++++++------------------\n src/android/camera_device.h   |  2 +-\n 2 files changed, 40 insertions(+), 44 deletions(-)",
    "diff": "diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\nindex 8d42b13b60b8..73b3989947d4 100644\n--- a/src/android/camera_device.cpp\n+++ b/src/android/camera_device.cpp\n@@ -50,8 +50,7 @@ CameraDevice::Camera3RequestDescriptor::~Camera3RequestDescriptor()\n  */\n \n CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camera)\n-\t: running_(false), camera_(camera), staticMetadata_(nullptr),\n-\t  requestTemplate_(nullptr)\n+\t: running_(false), camera_(camera), staticMetadata_(nullptr)\n {\n \tcamera_->requestCompleted.connect(this, &CameraDevice::requestComplete);\n }\n@@ -61,8 +60,8 @@ CameraDevice::~CameraDevice()\n \tif (staticMetadata_)\n \t\tdelete staticMetadata_;\n \n-\tif (requestTemplate_)\n-\t\tdelete requestTemplate_;\n+\tfor (auto &it : requestTemplates_)\n+\t\tdelete it.second;\n }\n \n /*\n@@ -441,10 +440,11 @@ camera_metadata_t *CameraDevice::getStaticMetadata()\n  */\n const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)\n {\n-\t/*\n-\t * \\todo Inspect type and pick the right metadata pack.\n-\t * As of now just use a single one for all templates.\n-\t */\n+\tauto it = requestTemplates_.find(type);\n+\tif (it != requestTemplates_.end())\n+\t\treturn it->second->get();\n+\n+\t/* Use the capture intent matching the requested template type. */\n \tuint8_t captureIntent;\n \tswitch (type) {\n \tcase CAMERA3_TEMPLATE_PREVIEW:\n@@ -470,76 +470,72 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)\n \t\treturn nullptr;\n \t}\n \n-\tif (requestTemplate_)\n-\t\treturn requestTemplate_->get();\n-\n \t/*\n \t * \\todo Keep this in sync with the actual number of entries.\n \t * Currently: 12 entries, 15 bytes\n \t */\n-\trequestTemplate_ = new CameraMetadata(15, 20);\n-\tif (!requestTemplate_) {\n+\tCameraMetadata *requestTemplate = new CameraMetadata(15, 20);\n+\tif (!requestTemplate->isValid()) {\n \t\tLOG(HAL, Error) << \"Failed to allocate template metadata\";\n-\t\tdelete requestTemplate_;\n-\t\trequestTemplate_ = nullptr;\n+\t\tdelete requestTemplate;\n \t\treturn nullptr;\n \t}\n \n \tuint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;\n-\trequestTemplate_->addEntry(ANDROID_CONTROL_AE_MODE,\n-\t\t\t\t   &aeMode, 1);\n+\trequestTemplate->addEntry(ANDROID_CONTROL_AE_MODE,\n+\t\t\t\t  &aeMode, 1);\n \n \tint32_t aeExposureCompensation = 0;\n-\trequestTemplate_->addEntry(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,\n-\t\t\t\t   &aeExposureCompensation, 1);\n+\trequestTemplate->addEntry(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,\n+\t\t\t\t  &aeExposureCompensation, 1);\n \n \tuint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;\n-\trequestTemplate_->addEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,\n-\t\t\t\t   &aePrecaptureTrigger, 1);\n+\trequestTemplate->addEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,\n+\t\t\t\t  &aePrecaptureTrigger, 1);\n \n \tuint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;\n-\trequestTemplate_->addEntry(ANDROID_CONTROL_AE_LOCK,\n-\t\t\t\t   &aeLock, 1);\n+\trequestTemplate->addEntry(ANDROID_CONTROL_AE_LOCK,\n+\t\t\t\t  &aeLock, 1);\n \n \tuint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;\n-\trequestTemplate_->addEntry(ANDROID_CONTROL_AF_TRIGGER,\n-\t\t\t\t   &afTrigger, 1);\n+\trequestTemplate->addEntry(ANDROID_CONTROL_AF_TRIGGER,\n+\t\t\t\t  &afTrigger, 1);\n \n \tuint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;\n-\trequestTemplate_->addEntry(ANDROID_CONTROL_AWB_MODE,\n-\t\t\t\t   &awbMode, 1);\n+\trequestTemplate->addEntry(ANDROID_CONTROL_AWB_MODE,\n+\t\t\t\t  &awbMode, 1);\n \n \tuint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;\n-\trequestTemplate_->addEntry(ANDROID_CONTROL_AWB_LOCK,\n-\t\t\t\t   &awbLock, 1);\n+\trequestTemplate->addEntry(ANDROID_CONTROL_AWB_LOCK,\n+\t\t\t\t  &awbLock, 1);\n \n \tuint8_t flashMode = ANDROID_FLASH_MODE_OFF;\n-\trequestTemplate_->addEntry(ANDROID_FLASH_MODE,\n-\t\t\t\t   &flashMode, 1);\n+\trequestTemplate->addEntry(ANDROID_FLASH_MODE,\n+\t\t\t\t  &flashMode, 1);\n \n \tuint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;\n-\trequestTemplate_->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE,\n-\t\t\t\t   &faceDetectMode, 1);\n+\trequestTemplate->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE,\n+\t\t\t\t  &faceDetectMode, 1);\n \n \tuint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF;\n-\trequestTemplate_->addEntry(ANDROID_NOISE_REDUCTION_MODE,\n-\t\t\t\t   &noiseReduction, 1);\n+\trequestTemplate->addEntry(ANDROID_NOISE_REDUCTION_MODE,\n+\t\t\t\t  &noiseReduction, 1);\n \n \tuint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;\n-\trequestTemplate_->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE,\n-\t\t\t\t   &aberrationMode, 1);\n+\trequestTemplate->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE,\n+\t\t\t\t  &aberrationMode, 1);\n \n-\trequestTemplate_->addEntry(ANDROID_CONTROL_CAPTURE_INTENT,\n-\t\t\t\t   &captureIntent, 1);\n+\trequestTemplate->addEntry(ANDROID_CONTROL_CAPTURE_INTENT,\n+\t\t\t\t  &captureIntent, 1);\n \n-\tif (!requestTemplate_->isValid()) {\n+\tif (!requestTemplate->isValid()) {\n \t\tLOG(HAL, Error) << \"Failed to construct request template\";\n-\t\tdelete requestTemplate_;\n-\t\trequestTemplate_ = nullptr;\n+\t\tdelete requestTemplate;\n \t\treturn nullptr;\n \t}\n \n-\treturn requestTemplate_->get();\n+\trequestTemplates_[type] = requestTemplate;\n+\treturn requestTemplate->get();\n }\n \n /*\ndiff --git a/src/android/camera_device.h b/src/android/camera_device.h\nindex 65ba877a02ea..d5d136a74f4a 100644\n--- a/src/android/camera_device.h\n+++ b/src/android/camera_device.h\n@@ -61,7 +61,7 @@ private:\n \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n \n \tCameraMetadata *staticMetadata_;\n-\tCameraMetadata *requestTemplate_;\n+\tstd::map<unsigned int, CameraMetadata *> requestTemplates_;\n \tconst camera3_callback_ops_t *callbacks_;\n };\n \n",
    "prefixes": [
        "libcamera-devel",
        "v7",
        "8/9"
    ]
}