[{"id":2563,"web_url":"https://patchwork.libcamera.org/comment/2563/","msgid":"<20190830121310.GM8479@bigcity.dyn.berto.se>","date":"2019-08-30T12:13:10","subject":"Re: [libcamera-devel] [PATCH v2 1/4] android: camera_device: Add\n\tmissing static metadata","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Jacopo,\n\nThanks for your work.\n\nOn 2019-08-29 18:53:08 +0200, Jacopo Mondi wrote:\n> Add all the static metadata keys part of the BC (backward compatible)\n> metadata group, which represent the minimum requirement for devices\n> supporting the LIMITED hardware level.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n\nOne small typo bellow, the rest looks ok with my limited understanding \nof the HAL. With the typo fixed,\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  src/android/camera_device.cpp | 272 +++++++++++++++++++++++++++++++---\n>  1 file changed, 248 insertions(+), 24 deletions(-)\n> \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index c27175ac090d..02bb6fc5d042 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -134,6 +134,149 @@ camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \tstaticMetadata_ = allocate_camera_metadata(STATIC_ENTRY_CAP,\n>  \t\t\t\t\t\t   STATIC_DATA_CAP);\n>  \n> +\t/* Color correction static metadata. */\n> +\tstd::vector<uint8_t> aberrationModes = {\n> +\t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,\n> +\t\t\taberrationModes.data(), aberrationModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\t/* Control static metadata. */\n> +\tstd::vector<uint8_t> aeAvailableAntiBandingModes = {\n> +\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,\n> +\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ,\n> +\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ,\n> +\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,\n> +\t\t\taeAvailableAntiBandingModes.data(),\n> +\t\t\taeAvailableAntiBandingModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> aeAvailableModes = {\n> +\t\tANDROID_CONTROL_AE_MODE_ON,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_AVAILABLE_MODES,\n> +\t\t\taeAvailableModes.data(), aeAvailableModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<int32_t> availableAeFpsTarget = {\n> +\t\t15, 30,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,\n> +\t\t\tavailableAeFpsTarget.data(),\n> +\t\t\tavailableAeFpsTarget.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<int32_t> aeCompensationRange = {\n> +\t\t0, 0,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_COMPENSATION_RANGE,\n> +\t\t\taeCompensationRange.data(),\n> +\t\t\taeCompensationRange.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tconst camera_metadata_rational_t aeCompensationStep[] = {\n> +\t\t{0, 1}\n\ns/{0, 1}/{ 0, 1 }/\n\nDoes the stylechecker warn for this?\n\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_COMPENSATION_STEP,\n> +\t\t\taeCompensationStep, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableAfModes = {\n> +\t\tANDROID_CONTROL_AF_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AF_AVAILABLE_MODES,\n> +\t\t\tavailableAfModes.data(), availableAfModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableEffects = {\n> +\t\tANDROID_CONTROL_EFFECT_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AVAILABLE_EFFECTS,\n> +\t\t\tavailableEffects.data(), availableEffects.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableSceneModes = {\n> +\t\tANDROID_CONTROL_SCENE_MODE_DISABLED,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AVAILABLE_SCENE_MODES,\n> +\t\t\tavailableSceneModes.data(), availableSceneModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableStabilizationModes = {\n> +\t\tANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,\n> +\t\t\tavailableStabilizationModes.data(),\n> +\t\t\tavailableStabilizationModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableAwbModes = {\n> +\t\tANDROID_CONTROL_AWB_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AWB_AVAILABLE_MODES,\n> +\t\t\tavailableAwbModes.data(), availableAwbModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<int32_t> availableMaxRegions = {\n> +\t\t0, 0, 0,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_MAX_REGIONS,\n> +\t\t\tavailableMaxRegions.data(), availableMaxRegions.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> sceneModesOverride = {\n> +\t\tANDROID_CONTROL_AE_MODE_ON,\n> +\t\tANDROID_CONTROL_AWB_MODE_AUTO,\n> +\t\tANDROID_CONTROL_AF_MODE_AUTO,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_SCENE_MODE_OVERRIDES,\n> +\t\t\tsceneModesOverride.data(), sceneModesOverride.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tuint8_t aeLockAvailable = ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_LOCK_AVAILABLE,\n> +\t\t\t&aeLockAvailable, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tuint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AWB_LOCK_AVAILABLE,\n> +\t\t\t&awbLockAvailable, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tchar availableControlModes = ANDROID_CONTROL_MODE_AUTO;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AVAILABLE_MODES,\n> +\t\t\t&availableControlModes, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\t/* JPEG static metadata. */\n> +\tstd::vector<int32_t> availableThumbnailSizes = {\n> +\t\t0, 0,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,\n> +\t\t\tavailableThumbnailSizes.data(),\n> +\t\t\tavailableThumbnailSizes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n>  \t/* Sensor static metadata. */\n>  \tint32_t pixelArraySize[] = {\n>  \t\t2592, 1944,\n> @@ -179,6 +322,47 @@ camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \t\t\t\t&orientation, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n> +\tstd::vector<int32_t> testPatterModes = {\n> +\t\tANDROID_SENSOR_TEST_PATTERN_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\t\tANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES,\n> +\t\t\t\ttestPatterModes.data(), testPatterModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<float> physicalSize = {\n> +\t\t2592, 1944,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\t\tANDROID_SENSOR_INFO_PHYSICAL_SIZE,\n> +\t\t\t\tphysicalSize.data(), physicalSize.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tuint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,\n> +\t\t\t&timestampSource, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\t/* Statistics static metadata. */\n> +\tuint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,\n> +\t\t\t&faceDetectMode, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tint32_t maxFaceCount = 0;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_STATISTICS_INFO_MAX_FACE_COUNT,\n> +\t\t\t&maxFaceCount, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\t/* Sync static metadata. */\n> +\tint32_t maxLatency = ANDROID_SYNC_MAX_LATENCY_UNKNOWN;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_SYNC_MAX_LATENCY, &maxLatency, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n>  \t/* Flash static metadata. */\n>  \tchar flashAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE;\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> @@ -187,50 +371,63 @@ camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \t/* Lens static metadata. */\n> -\tfloat fn = 2.53 / 100;\n> +\tstd::vector<float> lensApertures = {\n> +\t\t2.53 / 100,\n> +\t};\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\t\tANDROID_LENS_INFO_AVAILABLE_APERTURES, &fn, 1);\n> +\t\t\t\tANDROID_LENS_INFO_AVAILABLE_APERTURES,\n> +\t\t\t\tlensApertures.data(), lensApertures.size());\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\t/* Control metadata. */\n> -\tchar controlMetadata = ANDROID_CONTROL_MODE_AUTO;\n> +\tuint8_t lensFacing = ANDROID_LENS_FACING_FRONT;\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\tANDROID_CONTROL_AVAILABLE_MODES,\n> -\t\t\t&controlMetadata, 1);\n> +\t\t\t\tANDROID_LENS_FACING, &lensFacing, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\tchar availableAntiBandingModes[] = {\n> -\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,\n> -\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ,\n> -\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ,\n> -\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO,\n> +\tstd::vector<float> lensFocalLenghts = {\n> +\t\t1,\n>  \t};\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\tANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,\n> -\t\t\tavailableAntiBandingModes, 4);\n> +\t\t\t\tANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,\n> +\t\t\t\tlensFocalLenghts.data(),\n> +\t\t\t\tlensFocalLenghts.size());\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\tchar aeAvailableModes[] = {\n> -\t\tANDROID_CONTROL_AE_MODE_ON,\n> -\t\tANDROID_CONTROL_AE_MODE_OFF,\n> +\tstd::vector<uint8_t> opticalStabilizations = {\n> +\t\tANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF,\n>  \t};\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\tANDROID_CONTROL_AE_AVAILABLE_MODES,\n> -\t\t\taeAvailableModes, 2);\n> +\t\t\t\tANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,\n> +\t\t\t\topticalStabilizations.data(),\n> +\t\t\t\topticalStabilizations.size());\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\tcontrolMetadata = ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE;\n> +\tfloat hypeFocalDistance = 0;\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\tANDROID_CONTROL_AE_LOCK_AVAILABLE,\n> -\t\t\t&controlMetadata, 1);\n> +\t\t\t\tANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,\n> +\t\t\t\t&hypeFocalDistance, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\tuint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;\n> +\tfloat minFocusDistance = 0;\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\tANDROID_CONTROL_AWB_LOCK_AVAILABLE,\n> -\t\t\t&awbLockAvailable, 1);\n> +\t\t\t\tANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,\n> +\t\t\t\t&minFocusDistance, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\t/* Noise reduction modes. */\n> +\tuint8_t noiseReductionModes = ANDROID_NOISE_REDUCTION_MODE_OFF;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\t\tANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,\n> +\t\t\t\t&noiseReductionModes, 1);\n> +\tMETADATA_ASSERT(ret);\n>  \n>  \t/* Scaler static metadata. */\n> +\tfloat maxDigitalZoom = 1;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,\n> +\t\t\t&maxDigitalZoom, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n>  \tstd::vector<uint32_t> availableStreamFormats = {\n>  \t\tANDROID_SCALER_AVAILABLE_FORMATS_BLOB,\n>  \t\tANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888,\n> @@ -275,12 +472,39 @@ camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \t\t\tminFrameDurations.data(), minFrameDurations.size());\n>  \tMETADATA_ASSERT(ret);\n>  \n> +\tuint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_SCALER_CROPPING_TYPE, &croppingType, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n>  \t/* Info static metadata. */\n>  \tuint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n>  \t\t\tANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,\n>  \t\t\t&supportedHWLevel, 1);\n>  \n> +\t/* Request static metadata. */\n> +\tint32_t partialResultCount = 1;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_REQUEST_PARTIAL_RESULT_COUNT,\n> +\t\t\t&partialResultCount, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tuint8_t maxPipelineDepth = 1;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n> +\t\t\t&maxPipelineDepth, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableCapabilities = {\n> +\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES,\n> +\t\t\tavailableCapabilities.data(),\n> +\t\t\tavailableCapabilities.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n>  \treturn staticMetadata_;\n>  }\n>  \n> -- \n> 2.23.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":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lf1-x141.google.com (mail-lf1-x141.google.com\n\t[IPv6:2a00:1450:4864:20::141])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D6DD660BCF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 30 Aug 2019 14:13:12 +0200 (CEST)","by mail-lf1-x141.google.com with SMTP id j4so5171031lfh.8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 30 Aug 2019 05:13:12 -0700 (PDT)","from localhost (h-177-236.A463.priv.bahnhof.se. [217.31.177.236])\n\tby smtp.gmail.com with ESMTPSA id\n\ts10sm831501ljm.35.2019.08.30.05.13.11\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 30 Aug 2019 05:13:11 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to\n\t:user-agent; bh=3LePt4g9p2uCGTiMD19vWxTRVpYXb44QGb1owbBXwnw=;\n\tb=WW4qjT8PamktOw2StyJZAl7wpQgDfv/pkZsQF8RbxiotyZOBAquz8Kc2an6kaodvTR\n\tfWLfzedmtLe9wwHvX5oFwyhrH+RhiRT2YeOhXKe2HkJqpO9Q6AP55qSNVixahs9TWTT2\n\tsxmIjWy6L2Gq0PA3f1jUwWHjfHx/ls09G5GiDRUe+TNo3pkDWUguB2HKG+RXvMDyqWZz\n\t9HD8EdasGlcPfiSMCyEjZ/IQ/rYOv9l10hIH4gCNaP6uSoxr+E7tAt+BGWiG8Stj4rJD\n\tFbDfgLJuqLa3l6CfiII6uTyTTybipcn355EFUmKzrM9GSIOrz9QduYSyjw4cPjtJSb+u\n\tjl9g==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to:user-agent;\n\tbh=3LePt4g9p2uCGTiMD19vWxTRVpYXb44QGb1owbBXwnw=;\n\tb=IgjIFRg+3HxN/QduLhW72xgHzVw3EBedprEJCZgxrUK5+UY0IIuPbICzRqE6L4HfU3\n\tfJf0mJT3UbTJB0FRKaZ8oDeYSEpj+rz7+X7M+MOqNFrskvXH1jquA6QN6Q2L5apEKySU\n\tPp3/c2Sk3cfKoBEpIhIWdnobhvNjvloz2K9a1YA+fN4OJYd4ZwsebYhejJEEb/Mj0vQe\n\tG7oA1IjRqGB4m7tg3h+G17hcXW6Ok6CzEu4QYfW38fvHQbfGzF7FVGtaZMAyIgxuqD/r\n\t+I6pS6HzkkazB7AivDWAL/NTVC0pjX3sodZIkh2r3rhd7c+/MMyNoDzZmc8gBAvp25Kj\n\tj2LQ==","X-Gm-Message-State":"APjAAAV07UxR8WekC5vr1NlDGNZbiM1oHbts17Yh14LXz6YGtUcWMbt/\n\ts+uXrd7Arf/fwqSLNAJd0kXbJg==","X-Google-Smtp-Source":"APXvYqy50hqk05nzGOGZsxrjqws9Os0E3OJ3cno7dQe3hHPyNYc5cyFY0GXx+3ADpiLdTWslW5+uKQ==","X-Received":"by 2002:a19:f512:: with SMTP id\n\tj18mr9013867lfb.159.1567167191963; \n\tFri, 30 Aug 2019 05:13:11 -0700 (PDT)","Date":"Fri, 30 Aug 2019 14:13:10 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org, jcliang@google.com, wtlee@google.com","Message-ID":"<20190830121310.GM8479@bigcity.dyn.berto.se>","References":"<20190829165311.29196-1-jacopo@jmondi.org>\n\t<20190829165311.29196-2-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190829165311.29196-2-jacopo@jmondi.org>","User-Agent":"Mutt/1.12.1 (2019-06-15)","Subject":"Re: [libcamera-devel] [PATCH v2 1/4] android: camera_device: Add\n\tmissing static metadata","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":"Fri, 30 Aug 2019 12:13:13 -0000"}},{"id":2578,"web_url":"https://patchwork.libcamera.org/comment/2578/","msgid":"<20190903202402.GG4788@pendragon.ideasonboard.com>","date":"2019-09-03T20:24:02","subject":"Re: [libcamera-devel] [PATCH v2 1/4] android: camera_device: Add\n\tmissing static metadata","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nThank you for the patch.\n\nOn Thu, Aug 29, 2019 at 06:53:08PM +0200, Jacopo Mondi wrote:\n> Add all the static metadata keys part of the BC (backward compatible)\n> metadata group, which represent the minimum requirement for devices\n> supporting the LIMITED hardware level.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/android/camera_device.cpp | 272 +++++++++++++++++++++++++++++++---\n>  1 file changed, 248 insertions(+), 24 deletions(-)\n> \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index c27175ac090d..02bb6fc5d042 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -134,6 +134,149 @@ camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \tstaticMetadata_ = allocate_camera_metadata(STATIC_ENTRY_CAP,\n>  \t\t\t\t\t\t   STATIC_DATA_CAP);\n>  \n> +\t/* Color correction static metadata. */\n> +\tstd::vector<uint8_t> aberrationModes = {\n> +\t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,\n> +\t\t\taberrationModes.data(), aberrationModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\t/* Control static metadata. */\n> +\tstd::vector<uint8_t> aeAvailableAntiBandingModes = {\n> +\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,\n> +\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ,\n> +\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ,\n> +\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,\n> +\t\t\taeAvailableAntiBandingModes.data(),\n> +\t\t\taeAvailableAntiBandingModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> aeAvailableModes = {\n> +\t\tANDROID_CONTROL_AE_MODE_ON,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_AVAILABLE_MODES,\n> +\t\t\taeAvailableModes.data(), aeAvailableModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<int32_t> availableAeFpsTarget = {\n> +\t\t15, 30,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,\n> +\t\t\tavailableAeFpsTarget.data(),\n> +\t\t\tavailableAeFpsTarget.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<int32_t> aeCompensationRange = {\n> +\t\t0, 0,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_COMPENSATION_RANGE,\n> +\t\t\taeCompensationRange.data(),\n> +\t\t\taeCompensationRange.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tconst camera_metadata_rational_t aeCompensationStep[] = {\n> +\t\t{0, 1}\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_COMPENSATION_STEP,\n> +\t\t\taeCompensationStep, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableAfModes = {\n> +\t\tANDROID_CONTROL_AF_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AF_AVAILABLE_MODES,\n> +\t\t\tavailableAfModes.data(), availableAfModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableEffects = {\n> +\t\tANDROID_CONTROL_EFFECT_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AVAILABLE_EFFECTS,\n> +\t\t\tavailableEffects.data(), availableEffects.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableSceneModes = {\n> +\t\tANDROID_CONTROL_SCENE_MODE_DISABLED,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AVAILABLE_SCENE_MODES,\n> +\t\t\tavailableSceneModes.data(), availableSceneModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableStabilizationModes = {\n> +\t\tANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,\n> +\t\t\tavailableStabilizationModes.data(),\n> +\t\t\tavailableStabilizationModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableAwbModes = {\n> +\t\tANDROID_CONTROL_AWB_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AWB_AVAILABLE_MODES,\n> +\t\t\tavailableAwbModes.data(), availableAwbModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<int32_t> availableMaxRegions = {\n> +\t\t0, 0, 0,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_MAX_REGIONS,\n> +\t\t\tavailableMaxRegions.data(), availableMaxRegions.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> sceneModesOverride = {\n> +\t\tANDROID_CONTROL_AE_MODE_ON,\n> +\t\tANDROID_CONTROL_AWB_MODE_AUTO,\n> +\t\tANDROID_CONTROL_AF_MODE_AUTO,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_SCENE_MODE_OVERRIDES,\n> +\t\t\tsceneModesOverride.data(), sceneModesOverride.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tuint8_t aeLockAvailable = ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AE_LOCK_AVAILABLE,\n> +\t\t\t&aeLockAvailable, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tuint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AWB_LOCK_AVAILABLE,\n> +\t\t\t&awbLockAvailable, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tchar availableControlModes = ANDROID_CONTROL_MODE_AUTO;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_CONTROL_AVAILABLE_MODES,\n> +\t\t\t&availableControlModes, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\t/* JPEG static metadata. */\n> +\tstd::vector<int32_t> availableThumbnailSizes = {\n> +\t\t0, 0,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,\n> +\t\t\tavailableThumbnailSizes.data(),\n> +\t\t\tavailableThumbnailSizes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n>  \t/* Sensor static metadata. */\n>  \tint32_t pixelArraySize[] = {\n>  \t\t2592, 1944,\n> @@ -179,6 +322,47 @@ camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \t\t\t\t&orientation, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n> +\tstd::vector<int32_t> testPatterModes = {\n> +\t\tANDROID_SENSOR_TEST_PATTERN_MODE_OFF,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\t\tANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES,\n> +\t\t\t\ttestPatterModes.data(), testPatterModes.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<float> physicalSize = {\n> +\t\t2592, 1944,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\t\tANDROID_SENSOR_INFO_PHYSICAL_SIZE,\n> +\t\t\t\tphysicalSize.data(), physicalSize.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tuint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,\n> +\t\t\t&timestampSource, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\t/* Statistics static metadata. */\n> +\tuint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,\n> +\t\t\t&faceDetectMode, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tint32_t maxFaceCount = 0;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_STATISTICS_INFO_MAX_FACE_COUNT,\n> +\t\t\t&maxFaceCount, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\t/* Sync static metadata. */\n> +\tint32_t maxLatency = ANDROID_SYNC_MAX_LATENCY_UNKNOWN;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_SYNC_MAX_LATENCY, &maxLatency, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n>  \t/* Flash static metadata. */\n>  \tchar flashAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE;\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> @@ -187,50 +371,63 @@ camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \t/* Lens static metadata. */\n> -\tfloat fn = 2.53 / 100;\n> +\tstd::vector<float> lensApertures = {\n> +\t\t2.53 / 100,\n> +\t};\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\t\tANDROID_LENS_INFO_AVAILABLE_APERTURES, &fn, 1);\n> +\t\t\t\tANDROID_LENS_INFO_AVAILABLE_APERTURES,\n> +\t\t\t\tlensApertures.data(), lensApertures.size());\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\t/* Control metadata. */\n> -\tchar controlMetadata = ANDROID_CONTROL_MODE_AUTO;\n> +\tuint8_t lensFacing = ANDROID_LENS_FACING_FRONT;\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\tANDROID_CONTROL_AVAILABLE_MODES,\n> -\t\t\t&controlMetadata, 1);\n> +\t\t\t\tANDROID_LENS_FACING, &lensFacing, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\tchar availableAntiBandingModes[] = {\n> -\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,\n> -\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ,\n> -\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ,\n> -\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO,\n> +\tstd::vector<float> lensFocalLenghts = {\n> +\t\t1,\n>  \t};\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\tANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,\n> -\t\t\tavailableAntiBandingModes, 4);\n> +\t\t\t\tANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,\n> +\t\t\t\tlensFocalLenghts.data(),\n> +\t\t\t\tlensFocalLenghts.size());\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\tchar aeAvailableModes[] = {\n> -\t\tANDROID_CONTROL_AE_MODE_ON,\n> -\t\tANDROID_CONTROL_AE_MODE_OFF,\n> +\tstd::vector<uint8_t> opticalStabilizations = {\n> +\t\tANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF,\n>  \t};\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\tANDROID_CONTROL_AE_AVAILABLE_MODES,\n> -\t\t\taeAvailableModes, 2);\n> +\t\t\t\tANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,\n> +\t\t\t\topticalStabilizations.data(),\n> +\t\t\t\topticalStabilizations.size());\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\tcontrolMetadata = ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE;\n> +\tfloat hypeFocalDistance = 0;\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\tANDROID_CONTROL_AE_LOCK_AVAILABLE,\n> -\t\t\t&controlMetadata, 1);\n> +\t\t\t\tANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,\n> +\t\t\t\t&hypeFocalDistance, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\tuint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;\n> +\tfloat minFocusDistance = 0;\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n> -\t\t\tANDROID_CONTROL_AWB_LOCK_AVAILABLE,\n> -\t\t\t&awbLockAvailable, 1);\n> +\t\t\t\tANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,\n> +\t\t\t\t&minFocusDistance, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\t/* Noise reduction modes. */\n> +\tuint8_t noiseReductionModes = ANDROID_NOISE_REDUCTION_MODE_OFF;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\t\tANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,\n> +\t\t\t\t&noiseReductionModes, 1);\n> +\tMETADATA_ASSERT(ret);\n>  \n>  \t/* Scaler static metadata. */\n> +\tfloat maxDigitalZoom = 1;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,\n> +\t\t\t&maxDigitalZoom, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n>  \tstd::vector<uint32_t> availableStreamFormats = {\n>  \t\tANDROID_SCALER_AVAILABLE_FORMATS_BLOB,\n>  \t\tANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888,\n> @@ -275,12 +472,39 @@ camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \t\t\tminFrameDurations.data(), minFrameDurations.size());\n>  \tMETADATA_ASSERT(ret);\n>  \n> +\tuint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_SCALER_CROPPING_TYPE, &croppingType, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n>  \t/* Info static metadata. */\n>  \tuint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;\n>  \tret = add_camera_metadata_entry(staticMetadata_,\n>  \t\t\tANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,\n>  \t\t\t&supportedHWLevel, 1);\n>  \n> +\t/* Request static metadata. */\n> +\tint32_t partialResultCount = 1;\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_REQUEST_PARTIAL_RESULT_COUNT,\n> +\t\t\t&partialResultCount, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tuint8_t maxPipelineDepth = 1;\n\nAs discussed previously I would use 2 here, one step for exposure, one\nstep for readout. I think that's a better default.\n\nAcked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n> +\t\t\t&maxPipelineDepth, 1);\n> +\tMETADATA_ASSERT(ret);\n> +\n> +\tstd::vector<uint8_t> availableCapabilities = {\n> +\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,\n> +\t};\n> +\tret = add_camera_metadata_entry(staticMetadata_,\n> +\t\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES,\n> +\t\t\tavailableCapabilities.data(),\n> +\t\t\tavailableCapabilities.size());\n> +\tMETADATA_ASSERT(ret);\n> +\n>  \treturn staticMetadata_;\n>  }\n>","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F18ED60BCF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  3 Sep 2019 22:24:12 +0200 (CEST)","from pendragon.ideasonboard.com (85-76-18-41-nat.elisa-mobile.fi\n\t[85.76.18.41])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D3D14542;\n\tTue,  3 Sep 2019 22:24:11 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1567542252;\n\tbh=2yoYguo2UZiW6o5/z6KLWgYxLVwSnuieGUzJVM/makg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=lWYUw73ZALnLyzp/s/du9l1dW3FQ/T+xQHcxXsQBPp+WhVuFVDPLb+OuP+rB+mgAP\n\tUKR4jDQQsahHqS1OtTfkYHfjyWIKbhSzFSf1Cfpp88S1QYAdtWxvTQgskV9NyLnzHl\n\t4yF+KEX7RO2sz8jzYb++Uv0xAah+LQ6G4Przjpgg=","Date":"Tue, 3 Sep 2019 23:24:02 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org, jcliang@google.com, wtlee@google.com","Message-ID":"<20190903202402.GG4788@pendragon.ideasonboard.com>","References":"<20190829165311.29196-1-jacopo@jmondi.org>\n\t<20190829165311.29196-2-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190829165311.29196-2-jacopo@jmondi.org>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v2 1/4] android: camera_device: Add\n\tmissing static metadata","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":"Tue, 03 Sep 2019 20:24:13 -0000"}}]