[{"id":16614,"web_url":"https://patchwork.libcamera.org/comment/16614/","msgid":"<YIeWol3/dde7dxwQ@pendragon.ideasonboard.com>","date":"2021-04-27T04:44:18","subject":"Re: [libcamera-devel] [RFC PATCH v2 05/12] android: camera_device:\n\tSet static metadata for FULL requirements","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Paul,\n\nThank you for the patch.\n\nOn Thu, Apr 22, 2021 at 06:40:55PM +0900, Paul Elder wrote:\n> Set the static metadata as required by CTS for FULL hardware level.\n> \n> The tests that this fixes are:\n> android.hardware.camera2.cts.StaticMetadataTest#testHwSupportedLevel\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> \n> ---\n> This patch actually introduces more failures in CTS, but that's because\n> we report that we support many more things in the static metadata.\n> \n> The main thing I'm not sure of in this patch is if the entries in any\n> AVAILABLE_* tags require allocated space in the static metadata. Also\n> the android docs say that they need to be int32_t while CTS (and other\n> HAL implementations) say that they need to be uint8_t.\n\nHiro, do you think you could get more information on this ?\n\n> ---\n>  src/android/camera_device.cpp | 148 +++++++++++++++++++++++++++++++---\n>  1 file changed, 139 insertions(+), 9 deletions(-)\n> \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 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\nC-style comments.\n\nA question for Jacopo maybe ?\n\nI think it's time to bite the bullet and stop computing sizes manually.\n\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\nThis needs to be plumbed to the pipeline handler, and made conditional\non a property. Same in several locations below I suppose. We can't\nhardcode metadata for FULL mode only, we need to make sure we can\nsupport LIMITED mode devices.\n\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(),","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 04B4DBDCA6\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 27 Apr 2021 04:44:28 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5C443688A8;\n\tTue, 27 Apr 2021 06:44:27 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 27D5A60512\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 27 Apr 2021 06:44:25 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 71C75E9;\n\tTue, 27 Apr 2021 06:44:24 +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=\"DsptKPVv\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1619498664;\n\tbh=vom1LQF2IlH9u4TReJf9gMlDcohRD5HhJI68M6iiiyI=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=DsptKPVvyNq9QHF1FMAFyiZDtv4i4SafrpJVZr2lvb4Y5r9aC4tv3S8o2fto6jGc3\n\tCSEdSzb2f5V3hZFczTs9O6ZEgLmCmTrKRoNtewhD9yVKL8zHPPe9EfcMygtsBTJIM4\n\tcSDXSh/uJeDu1oXCn+cVR/gi8aVzpjzqINuGbQE0=","Date":"Tue, 27 Apr 2021 07:44:18 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<YIeWol3/dde7dxwQ@pendragon.ideasonboard.com>","References":"<20210422094102.371772-1-paul.elder@ideasonboard.com>\n\t<20210422094102.371772-6-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20210422094102.371772-6-paul.elder@ideasonboard.com>","Subject":"Re: [libcamera-devel] [RFC PATCH v2 05/12] android: camera_device:\n\tSet static 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>","Cc":"libcamera-devel@lists.libcamera.org","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>"}},{"id":16647,"web_url":"https://patchwork.libcamera.org/comment/16647/","msgid":"<20210427081541.cj5cgfosfgjs677e@uno.localdomain>","date":"2021-04-27T08:15:41","subject":"Re: [libcamera-devel] [RFC PATCH v2 05/12] android: camera_device:\n\tSet static metadata for FULL requirements","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Paul,\n\nOn Thu, Apr 22, 2021 at 06:40:55PM +0900, Paul Elder wrote:\n> Set the static metadata as required by CTS for FULL hardware level.\n>\n> The tests that this fixes are:\n> android.hardware.camera2.cts.StaticMetadataTest#testHwSupportedLevel\n>\n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n>\n> ---\n> This patch actually introduces more failures in CTS, but that's because\n> we report that we support many more things in the static metadata.\n>\n> The main thing I'm not sure of in this patch is if the entries in any\n> AVAILABLE_* tags require allocated space in the static metadata. Also\n> the android docs say that they need to be int32_t while CTS (and other\n> HAL 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(-)\n>\n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 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\nFor each new tag you add in availableCharacteristicsKeys is +4, for\nnew value associated with an existing or a new tag, it depends which\ntype the tag accepts\n\nI've not validated the above calculations yet\n\n\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\n+1\n\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\n+1\n\nI wonder if it is correct to make this unconditional.\nThe drawback is that it requires an IPA and requires the PH to\nregister property correctly. If for the IPU3 we have that, I would\nfetch this information from the Camera.\n\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\nAgain, should this come from the camera ?\n\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\nditto\n\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\n+3\n\n> +\tstaticMetadata_->addEntry(ANDROID_EDGE_AVAILABLE_EDGE_MODES,\n> +\t\t\t\t  availableEdgeModes.data(),\n> +\t\t\t\t  availableEdgeModes.size());\n\nEdging I'm not sure we have it from Camera\n\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\nUnderated and probably worth a separate patch ?\n\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+4\n\nAn information for the sensor database ?\nAlso, we might want a draft control, and plum this from the db, to the\npipeline handler, to the HAL\n\n> +\n\nempty line not required\n\n>  \tstaticMetadata_->addEntry(ANDROID_SENSOR_ORIENTATION, &orientation_, 1);\n\n\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\n+16\n\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\n+4\n\n> +\tstaticMetadata_->addEntry(ANDROID_SENSOR_INFO_WHITE_LEVEL,\n> +\t\t\t\t  &whiteLevel, 1);\n> +\n\nI'm not sure where these info should come from\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\nThis is an hard statement to make :)\n\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\n+4\n\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\nLens info should come from the ConfigurationFile. Add a \\todo maybe ?\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\nOr configuration file\n\n> +\tint distanceCalibration = ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE;\n\nit's a BYTE\n\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\ndoc says byte x n\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\nSo +3\n\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\nAre all of these required for FULL mode ?\n\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\nWe should do a little more than just bumping this number up to claim\nthis :)\n\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\nI'm sincerely not sure where these info sould come from\n\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\nEach new one is +4\n\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\nI've done this multiple time, but I'll just re-state that we're\nclaiming support for controls without actually handling them\n\nThanks\n   j\n>  \t};\n\n>  \tstaticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS,\n>  \t\t\t\t  availableRequestKeys.data(),\n> --\n> 2.27.0\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","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 02704BDCC3\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 27 Apr 2021 08:15:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2F467688C2;\n\tTue, 27 Apr 2021 10:15:01 +0200 (CEST)","from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net\n\t[217.70.183.196])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 68A61688B5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 27 Apr 2021 10:15:00 +0200 (CEST)","from uno.localdomain (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay4-d.mail.gandi.net (Postfix) with ESMTPSA id C9800E0007;\n\tTue, 27 Apr 2021 08:14:59 +0000 (UTC)"],"X-Originating-IP":"93.61.96.190","Date":"Tue, 27 Apr 2021 10:15:41 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<20210427081541.cj5cgfosfgjs677e@uno.localdomain>","References":"<20210422094102.371772-1-paul.elder@ideasonboard.com>\n\t<20210422094102.371772-6-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20210422094102.371772-6-paul.elder@ideasonboard.com>","Subject":"Re: [libcamera-devel] [RFC PATCH v2 05/12] android: camera_device:\n\tSet static 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>","Cc":"libcamera-devel@lists.libcamera.org","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>"}}]