Show a patch.

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

{
    "id": 12072,
    "url": "https://patchwork.libcamera.org/api/patches/12072/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/12072/",
    "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": "<20210422094102.371772-6-paul.elder@ideasonboard.com>",
    "date": "2021-04-22T09:40:55",
    "name": "[libcamera-devel,RFC,v2,05/12] android: camera_device: Set static metadata for FULL requirements",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "09767f847b986c90f8c17eeaac2d5096a4ccd683",
    "submitter": {
        "id": 17,
        "url": "https://patchwork.libcamera.org/api/people/17/?format=api",
        "name": "Paul Elder",
        "email": "paul.elder@ideasonboard.com"
    },
    "delegate": {
        "id": 17,
        "url": "https://patchwork.libcamera.org/api/users/17/?format=api",
        "username": "epaul",
        "first_name": "Paul",
        "last_name": "Elder",
        "email": "paul.elder@ideasonboard.com"
    },
    "mbox": "https://patchwork.libcamera.org/patch/12072/mbox/",
    "series": [
        {
            "id": 1962,
            "url": "https://patchwork.libcamera.org/api/series/1962/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1962",
            "date": "2021-04-22T09:40:50",
            "name": "FULL hardware level fixes",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/1962/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/12072/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/12072/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 8B9C0BDB17\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 22 Apr 2021 09:41:25 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1D8EE68868;\n\tThu, 22 Apr 2021 11:41:25 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 60EFC6884C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 22 Apr 2021 11:41:22 +0200 (CEST)",
            "from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 142F99DA;\n\tThu, 22 Apr 2021 11:41:20 +0200 (CEST)"
        ],
        "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=\"h6DYH8Yg\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1619084482;\n\tbh=YccilF9HvnDsp0N9neku+1bINCLZ/OJGPkBbPnWtCNU=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=h6DYH8YgZxfpngYkBTEB/Blxl7OI62qzCyRMm2UIIqMgh0BS5nSbUVXyS8NIh4Lra\n\tLGK7AB+22eBWP73mfoCRVAjIXwSPTA+6tKAID52Vs32AnZVjcrtBTn/fToVzBx/hfe\n\tVAtQTIv5qnDinTBIXBIxFvGZDE/pvGKdesltC89E=",
        "From": "Paul Elder <paul.elder@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Thu, 22 Apr 2021 18:40:55 +0900",
        "Message-Id": "<20210422094102.371772-6-paul.elder@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20210422094102.371772-1-paul.elder@ideasonboard.com>",
        "References": "<20210422094102.371772-1-paul.elder@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Subject": "[libcamera-devel] [RFC PATCH v2 05/12] android: camera_device: Set\n\tstatic metadata for FULL requirements",
        "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": "Set the static metadata as required by CTS for FULL hardware level.\n\nThe tests that this fixes are:\nandroid.hardware.camera2.cts.StaticMetadataTest#testHwSupportedLevel\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n\n---\nThis patch actually introduces more failures in CTS, but that's because\nwe report that we support many more things in the static metadata.\n\nThe main thing I'm not sure of in this patch is if the entries in any\nAVAILABLE_* tags require allocated space in the static metadata. Also\nthe android docs say that they need to be int32_t while CTS (and other\nHAL implementations) say that they need to be uint8_t.\n---\n src/android/camera_device.cpp | 148 +++++++++++++++++++++++++++++++---\n 1 file changed, 139 insertions(+), 9 deletions(-)",
    "diff": "diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\nindex a11ad848..7f0f8f1a 100644\n--- a/src/android/camera_device.cpp\n+++ b/src/android/camera_device.cpp\n@@ -776,10 +776,19 @@ std::tuple<uint32_t, uint32_t> CameraDevice::calculateStaticMetadataSize()\n {\n \t/*\n \t * \\todo Keep this in sync with the actual number of entries.\n-\t * Currently: 54 entries, 874 bytes of static metadata\n+\t * Currently: 63 entries, 990 bytes of static metadata\n \t */\n-\tuint32_t numEntries = 54;\n-\tuint32_t byteSize = 874;\n+\tuint32_t numEntries = 63;\n+\tuint32_t byteSize = 990;\n+\n+\t// do i need to add for entries in the available keys?\n+\t// +1, +4 for EDGE_AVAILABLE_EDGE_MODES\n+\t// +1, +4 for LENS_INFO_AVAILABLE_FILTER_DENSITIES\n+\t// +1, +4 for BLACK_LEVEL_PATTERN\n+\t// +1, +4 for TONEMAP_AVAILABLE_TONE_MAP_MODES\n+\t// +1, +4 for TONEMAP_MAX_CURVE_POINTS\n+\n+\t// +36 for new request keys\n \n \t/*\n \t * Calculate space occupation in bytes for dynamically built metadata\n@@ -861,7 +870,9 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\t\t\t  aeAvailableAntiBandingModes.data(),\n \t\t\t\t  aeAvailableAntiBandingModes.size());\n \n+\t/* \\todo FULL requires OFF */\n \tstd::vector<uint8_t> aeAvailableModes = {\n+\t\tANDROID_CONTROL_AE_MODE_OFF,\n \t\tANDROID_CONTROL_AE_MODE_ON,\n \t};\n \tstaticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_MODES,\n@@ -958,9 +969,11 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \n \t/*\n \t * \\todo Inspect the Camera capabilities to report the available\n-\t * AWB modes. Default to AUTO as CTS tests require it.\n+\t * AWB modes. Default to AUTO as CTS tests require it. FULL requires\n+\t * OFF.\n \t */\n \tstd::vector<uint8_t> availableAwbModes = {\n+\t\tANDROID_CONTROL_AWB_MODE_OFF,\n \t\tANDROID_CONTROL_AWB_MODE_AUTO,\n \t};\n \tstaticMetadata_->addEntry(ANDROID_CONTROL_AWB_AVAILABLE_MODES,\n@@ -983,17 +996,32 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\t\t\t  sceneModesOverride.data(),\n \t\t\t\t  sceneModesOverride.size());\n \n-\tuint8_t aeLockAvailable = ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;\n+\t/* true for MANUAL_SENSOR or BURST_CAPTURE capable devices */\n+\tuint8_t aeLockAvailable = ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE;\n \tstaticMetadata_->addEntry(ANDROID_CONTROL_AE_LOCK_AVAILABLE,\n \t\t\t\t  &aeLockAvailable, 1);\n \n-\tuint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;\n+\t/* true for MANUAL_SENSOR or BURST_CAPTURE capable devices */\n+\tuint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE;\n \tstaticMetadata_->addEntry(ANDROID_CONTROL_AWB_LOCK_AVAILABLE,\n \t\t\t\t  &awbLockAvailable, 1);\n \n \tchar availableControlModes = ANDROID_CONTROL_MODE_AUTO;\n \tstaticMetadata_->addEntry(ANDROID_CONTROL_AVAILABLE_MODES,\n \t\t\t\t  &availableControlModes, 1);\n+\t/*\n+\t * FULL - always support OFF\n+\t * camera devices that support YUV_REPROCESSING or PRIVATE_REPROCESSING - ZERO_SHUTTER_LAG\n+\t * all devices will list FAST\n+\t */\n+\tstd::vector<uint8_t> availableEdgeModes = {\n+\t\tANDROID_EDGE_MODE_OFF,\n+\t\tANDROID_EDGE_MODE_FAST,\n+\t\tANDROID_EDGE_MODE_HIGH_QUALITY,\n+\t};\n+\tstaticMetadata_->addEntry(ANDROID_EDGE_AVAILABLE_EDGE_MODES,\n+\t\t\t\t  availableEdgeModes.data(),\n+\t\t\t\t  availableEdgeModes.size());\n \n \t/* JPEG static metadata. */\n \n@@ -1079,10 +1107,20 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\t\texposureInfo->second.min().get<int32_t>() * 1000LL,\n \t\t\texposureInfo->second.max().get<int32_t>() * 1000LL,\n \t\t};\n+\t\t/* min must be at most 100us, max at least 100ms */\n+\t\tif (exposureTimeRange[0] > 100000)\n+\t\t\texposureTimeRange[0] = 100000;\n+\t\tif (exposureTimeRange[1] < 100000000)\n+\t\t\texposureTimeRange[1] = 100000000;\n \t\tstaticMetadata_->addEntry(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,\n \t\t\t\t\t  &exposureTimeRange, 2);\n \t}\n \n+\t/* min at most 100, max at least 800 */\n+\tint32_t maxAnalogSensitivity = 800;\n+\tstaticMetadata_->addEntry(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,\n+\t\t\t\t  &maxAnalogSensitivity, 1);\n+\n \tstaticMetadata_->addEntry(ANDROID_SENSOR_ORIENTATION, &orientation_, 1);\n \n \tstd::vector<int32_t> testPatterModes = {\n@@ -1092,6 +1130,21 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\t\t\t  testPatterModes.data(),\n \t\t\t\t  testPatterModes.size());\n \n+\t/*\n+\t * required for FULL (docs don't say it is, but cts says it is)\n+\t * \\todo figure out how this works\n+\t */\n+\tstd::vector<int32_t> blackLevelPattern = { 0, 0, 0, 0 };\n+\tstaticMetadata_->addEntry(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,\n+\t\t\t\t  blackLevelPattern.data(),\n+\t\t\t\t  blackLevelPattern.size());\n+\n+\t/* range of valid values: > 255 (8-bit output) */\n+\t/* this xnor BLACK_LEVEL_PATTERN must be available */\n+\tint32_t whiteLevel = 256;\n+\tstaticMetadata_->addEntry(ANDROID_SENSOR_INFO_WHITE_LEVEL,\n+\t\t\t\t  &whiteLevel, 1);\n+\n \tstd::vector<float> physicalSize = {\n \t\t2592, 1944,\n \t};\n@@ -1131,7 +1184,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t}\n \n \t/* Sync static metadata. */\n-\tint32_t maxLatency = ANDROID_SYNC_MAX_LATENCY_UNKNOWN;\n+\tint32_t maxLatency = ANDROID_SYNC_MAX_LATENCY_PER_FRAME_CONTROL;\n \tstaticMetadata_->addEntry(ANDROID_SYNC_MAX_LATENCY, &maxLatency, 1);\n \n \t/* Flash static metadata. */\n@@ -1147,6 +1200,15 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\t\t\t  lensApertures.data(),\n \t\t\t\t  lensApertures.size());\n \n+\t/*\n+\t * Required for FULL\n+\t * \\todo get this information from the camera, in ascending order\n+\t */\n+\tstd::vector<float> availableFilterDensities = { 0 };\n+\tstaticMetadata_->addEntry(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,\n+\t\t\t\t  availableFilterDensities.data(),\n+\t\t\t\t  availableFilterDensities.size());\n+\n \tuint8_t lensFacing;\n \tswitch (facing_) {\n \tdefault:\n@@ -1176,6 +1238,11 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\t\t\t  opticalStabilizations.data(),\n \t\t\t\t  opticalStabilizations.size());\n \n+\t/* \\todo set this based on camera capability */\n+\tint distanceCalibration = ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE;\n+\tstaticMetadata_->addEntry(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,\n+\t\t\t\t  &distanceCalibration, 1);\n+\n \tfloat hypeFocalDistance = 0;\n \tstaticMetadata_->addEntry(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,\n \t\t\t\t  &hypeFocalDistance, 1);\n@@ -1188,12 +1255,18 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t{\n \t\tstd::vector<uint8_t> data;\n \t\tdata.reserve(5);\n+\t\t/*\n+\t\t * \\todo if this doesn't have OFF and FAST and HIGH_QUALITY\n+\t\t * then this camera does not support FULL\n+\t\t */\n \t\tconst auto &infoMap = controlsInfo.find(&controls::draft::NoiseReductionMode);\n \t\tif (infoMap != controlsInfo.end()) {\n \t\t\tfor (const auto &value : infoMap->second.values())\n \t\t\t\tdata.push_back(value.get<int32_t>());\n \t\t} else {\n \t\t\tdata.push_back(ANDROID_NOISE_REDUCTION_MODE_OFF);\n+\t\t\tdata.push_back(ANDROID_NOISE_REDUCTION_MODE_FAST);\n+\t\t\tdata.push_back(ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY);\n \t\t}\n \t\tstaticMetadata_->addEntry(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,\n \t\t\t\t\t  data.data(), data.size());\n@@ -1261,6 +1334,16 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \tuint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;\n \tstaticMetadata_->addEntry(ANDROID_SCALER_CROPPING_TYPE, &croppingType, 1);\n \n+\t/* \\todo figure out if this should be int32 as documented */\n+\tstd::vector<uint8_t> shadingAvailableModes = {\n+\t\tANDROID_SHADING_MODE_OFF,\n+\t\tANDROID_SHADING_MODE_FAST,\n+\t\tANDROID_SHADING_MODE_HIGH_QUALITY,\n+\t};\n+\tstaticMetadata_->addEntry(ANDROID_SHADING_AVAILABLE_MODES,\n+\t\t\t\t  shadingAvailableModes.data(),\n+\t\t\t\t  shadingAvailableModes.size());\n+\n \t/* Info static metadata. */\n \tuint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;\n \tstaticMetadata_->addEntry(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,\n@@ -1288,6 +1371,10 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \n \tstd::vector<uint8_t> availableCapabilities = {\n \t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,\n+\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR,\n+\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING,\n+\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS,\n+\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE,\n \t};\n \n \t/* Report if camera supports RAW. */\n@@ -1306,7 +1393,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t}\n \n \t/* Number of { RAW, YUV, JPEG } supported output streams */\n-\tint32_t numOutStreams[] = { rawStreamAvailable, 2, 1 };\n+\tint32_t numOutStreams[] = { rawStreamAvailable, 3, 1 };\n \tstaticMetadata_->addEntry(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,\n \t\t\t\t  &numOutStreams, 3);\n \n@@ -1314,6 +1401,29 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\t\t\t  availableCapabilities.data(),\n \t\t\t\t  availableCapabilities.size());\n \n+\t/*\n+\t * required for FULL\n+\t * at least one of the below mode combinations:\n+\t * - CONTRAST_CURVE, FAST, HIGH_QUALITY\n+\t * - GAMMA_VALUE, PRESET_CURVE, FAST, HIGH_QUALITY\n+\t */\n+\tstd::vector<uint8_t> availableTonemapModes = {\n+\t\tANDROID_TONEMAP_MODE_CONTRAST_CURVE,\n+\t\tANDROID_TONEMAP_MODE_FAST,\n+\t\tANDROID_TONEMAP_MODE_HIGH_QUALITY,\n+\t};\n+\tstaticMetadata_->addEntry(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES,\n+\t\t\t\t  availableTonemapModes.data(),\n+\t\t\t\t  availableTonemapModes.size());\n+\n+\t/*\n+\t * required for FULL\n+\t * \\todo get from camera (camCapabilities[camId]->tonemapCurvePoints?)\n+\t */\n+\tint32_t tonemapCurvePoints = 0;\n+\tstaticMetadata_->addEntry(ANDROID_TONEMAP_MAX_CURVE_POINTS,\n+\t\t\t\t  &tonemapCurvePoints, 1);\n+\n \tstd::vector<int32_t> availableCharacteristicsKeys = {\n \t\tANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,\n \t\tANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,\n@@ -1331,14 +1441,17 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\tANDROID_CONTROL_AWB_LOCK_AVAILABLE,\n \t\tANDROID_CONTROL_MAX_REGIONS,\n \t\tANDROID_CONTROL_SCENE_MODE_OVERRIDES,\n+\t\tANDROID_EDGE_AVAILABLE_EDGE_MODES,\n \t\tANDROID_FLASH_INFO_AVAILABLE,\n \t\tANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,\n \t\tANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,\n \t\tANDROID_JPEG_MAX_SIZE,\n \t\tANDROID_LENS_FACING,\n \t\tANDROID_LENS_INFO_AVAILABLE_APERTURES,\n+\t\tANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,\n \t\tANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,\n \t\tANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,\n+\t\tANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,\n \t\tANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,\n \t\tANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,\n \t\tANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,\n@@ -1353,6 +1466,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\tANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,\n \t\tANDROID_SCALER_CROPPING_TYPE,\n \t\tANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES,\n+\t\tANDROID_SENSOR_BLACK_LEVEL_PATTERN,\n \t\tANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,\n \t\tANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,\n \t\tANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,\n@@ -1361,17 +1475,25 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\tANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,\n \t\tANDROID_SENSOR_INFO_SENSITIVITY_RANGE,\n \t\tANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,\n+\t\tANDROID_SENSOR_INFO_WHITE_LEVEL,\n+\t\tANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,\n \t\tANDROID_SENSOR_ORIENTATION,\n+\t\tANDROID_SHADING_AVAILABLE_MODES,\n \t\tANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,\n \t\tANDROID_STATISTICS_INFO_MAX_FACE_COUNT,\n \t\tANDROID_SYNC_MAX_LATENCY,\n+\t\tANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES,\n+\t\tANDROID_TONEMAP_MAX_CURVE_POINTS,\n \t};\n \tstaticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,\n \t\t\t\t  availableCharacteristicsKeys.data(),\n \t\t\t\t  availableCharacteristicsKeys.size());\n \n \tstd::vector<int32_t> availableRequestKeys = {\n+\t\tANDROID_BLACK_LEVEL_LOCK,\n \t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE,\n+\t\tANDROID_COLOR_CORRECTION_GAINS,\n+\t\tANDROID_COLOR_CORRECTION_TRANSFORM,\n \t\tANDROID_CONTROL_AE_ANTIBANDING_MODE,\n \t\tANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,\n \t\tANDROID_CONTROL_AE_LOCK,\n@@ -1387,16 +1509,24 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \t\tANDROID_CONTROL_MODE,\n \t\tANDROID_CONTROL_SCENE_MODE,\n \t\tANDROID_CONTROL_VIDEO_STABILIZATION_MODE,\n+\t\tANDROID_EDGE_MODE,\n \t\tANDROID_FLASH_MODE,\n \t\tANDROID_JPEG_ORIENTATION,\n \t\tANDROID_JPEG_QUALITY,\n \t\tANDROID_JPEG_THUMBNAIL_QUALITY,\n \t\tANDROID_JPEG_THUMBNAIL_SIZE,\n \t\tANDROID_LENS_APERTURE,\n+\t\tANDROID_LENS_FILTER_DENSITY,\n \t\tANDROID_LENS_OPTICAL_STABILIZATION_MODE,\n \t\tANDROID_NOISE_REDUCTION_MODE,\n \t\tANDROID_SCALER_CROP_REGION,\n-\t\tANDROID_STATISTICS_FACE_DETECT_MODE\n+\t\tANDROID_SENSOR_EXPOSURE_TIME,\n+\t\tANDROID_SENSOR_FRAME_DURATION,\n+\t\tANDROID_SENSOR_SENSITIVITY,\n+\t\tANDROID_SHADING_MODE,\n+\t\tANDROID_STATISTICS_FACE_DETECT_MODE,\n+\t\tANDROID_STATISTICS_LENS_SHADING_MAP_MODE,\n+\t\tANDROID_TONEMAP_MODE,\n \t};\n \tstaticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS,\n \t\t\t\t  availableRequestKeys.data(),\n",
    "prefixes": [
        "libcamera-devel",
        "RFC",
        "v2",
        "05/12"
    ]
}