From patchwork Thu Sep 5 21:09:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1943 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 60AC661567 for ; Thu, 5 Sep 2019 23:08:14 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 84614C0002; Thu, 5 Sep 2019 21:08:13 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Sep 2019 23:09:32 +0200 Message-Id: <20190905210940.32358-2-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190905210940.32358-1-jacopo@jmondi.org> References: <20190905210940.32358-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v7 1/9] android: camera_device: Add missing static metadata X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Sep 2019 21:08:14 -0000 Add all the static metadata keys part of the BC (backward compatible) metadata group, which represent the minimum requirement for devices supporting the LIMITED hardware level. Reviewed-by: Niklas Söderlund Acked-by: Laurent Pinchart Signed-off-by: Jacopo Mondi --- src/android/camera_device.cpp | 272 +++++++++++++++++++++++++++++++--- 1 file changed, 248 insertions(+), 24 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index c27175ac090d..15f57a7fe731 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -134,6 +134,149 @@ camera_metadata_t *CameraDevice::getStaticMetadata() staticMetadata_ = allocate_camera_metadata(STATIC_ENTRY_CAP, STATIC_DATA_CAP); + /* Color correction static metadata. */ + std::vector aberrationModes = { + ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, + aberrationModes.data(), aberrationModes.size()); + METADATA_ASSERT(ret); + + /* Control static metadata. */ + std::vector aeAvailableAntiBandingModes = { + ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, + ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, + ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, + ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, + aeAvailableAntiBandingModes.data(), + aeAvailableAntiBandingModes.size()); + METADATA_ASSERT(ret); + + std::vector aeAvailableModes = { + ANDROID_CONTROL_AE_MODE_ON, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AE_AVAILABLE_MODES, + aeAvailableModes.data(), aeAvailableModes.size()); + METADATA_ASSERT(ret); + + std::vector availableAeFpsTarget = { + 15, 30, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, + availableAeFpsTarget.data(), + availableAeFpsTarget.size()); + METADATA_ASSERT(ret); + + std::vector aeCompensationRange = { + 0, 0, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AE_COMPENSATION_RANGE, + aeCompensationRange.data(), + aeCompensationRange.size()); + METADATA_ASSERT(ret); + + const camera_metadata_rational_t aeCompensationStep[] = { + { 0, 1 } + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AE_COMPENSATION_STEP, + aeCompensationStep, 1); + METADATA_ASSERT(ret); + + std::vector availableAfModes = { + ANDROID_CONTROL_AF_MODE_OFF, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AF_AVAILABLE_MODES, + availableAfModes.data(), availableAfModes.size()); + METADATA_ASSERT(ret); + + std::vector availableEffects = { + ANDROID_CONTROL_EFFECT_MODE_OFF, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AVAILABLE_EFFECTS, + availableEffects.data(), availableEffects.size()); + METADATA_ASSERT(ret); + + std::vector availableSceneModes = { + ANDROID_CONTROL_SCENE_MODE_DISABLED, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AVAILABLE_SCENE_MODES, + availableSceneModes.data(), availableSceneModes.size()); + METADATA_ASSERT(ret); + + std::vector availableStabilizationModes = { + ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, + availableStabilizationModes.data(), + availableStabilizationModes.size()); + METADATA_ASSERT(ret); + + std::vector availableAwbModes = { + ANDROID_CONTROL_AWB_MODE_OFF, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AWB_AVAILABLE_MODES, + availableAwbModes.data(), availableAwbModes.size()); + METADATA_ASSERT(ret); + + std::vector availableMaxRegions = { + 0, 0, 0, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_MAX_REGIONS, + availableMaxRegions.data(), availableMaxRegions.size()); + METADATA_ASSERT(ret); + + std::vector sceneModesOverride = { + ANDROID_CONTROL_AE_MODE_ON, + ANDROID_CONTROL_AWB_MODE_AUTO, + ANDROID_CONTROL_AF_MODE_AUTO, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_SCENE_MODE_OVERRIDES, + sceneModesOverride.data(), sceneModesOverride.size()); + METADATA_ASSERT(ret); + + uint8_t aeLockAvailable = ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AE_LOCK_AVAILABLE, + &aeLockAvailable, 1); + METADATA_ASSERT(ret); + + uint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AWB_LOCK_AVAILABLE, + &awbLockAvailable, 1); + METADATA_ASSERT(ret); + + char availableControlModes = ANDROID_CONTROL_MODE_AUTO; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_CONTROL_AVAILABLE_MODES, + &availableControlModes, 1); + METADATA_ASSERT(ret); + + /* JPEG static metadata. */ + std::vector availableThumbnailSizes = { + 0, 0, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, + availableThumbnailSizes.data(), + availableThumbnailSizes.size()); + METADATA_ASSERT(ret); + /* Sensor static metadata. */ int32_t pixelArraySize[] = { 2592, 1944, @@ -179,6 +322,47 @@ camera_metadata_t *CameraDevice::getStaticMetadata() &orientation, 1); METADATA_ASSERT(ret); + std::vector testPatterModes = { + ANDROID_SENSOR_TEST_PATTERN_MODE_OFF, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, + testPatterModes.data(), testPatterModes.size()); + METADATA_ASSERT(ret); + + std::vector physicalSize = { + 2592, 1944, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_SENSOR_INFO_PHYSICAL_SIZE, + physicalSize.data(), physicalSize.size()); + METADATA_ASSERT(ret); + + uint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, + ×tampSource, 1); + METADATA_ASSERT(ret); + + /* Statistics static metadata. */ + uint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, + &faceDetectMode, 1); + METADATA_ASSERT(ret); + + int32_t maxFaceCount = 0; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, + &maxFaceCount, 1); + METADATA_ASSERT(ret); + + /* Sync static metadata. */ + int32_t maxLatency = ANDROID_SYNC_MAX_LATENCY_UNKNOWN; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_SYNC_MAX_LATENCY, &maxLatency, 1); + METADATA_ASSERT(ret); + /* Flash static metadata. */ char flashAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE; ret = add_camera_metadata_entry(staticMetadata_, @@ -187,50 +371,63 @@ camera_metadata_t *CameraDevice::getStaticMetadata() METADATA_ASSERT(ret); /* Lens static metadata. */ - float fn = 2.53 / 100; + std::vector lensApertures = { + 2.53 / 100, + }; ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_LENS_INFO_AVAILABLE_APERTURES, &fn, 1); + ANDROID_LENS_INFO_AVAILABLE_APERTURES, + lensApertures.data(), lensApertures.size()); METADATA_ASSERT(ret); - /* Control metadata. */ - char controlMetadata = ANDROID_CONTROL_MODE_AUTO; + uint8_t lensFacing = ANDROID_LENS_FACING_FRONT; ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AVAILABLE_MODES, - &controlMetadata, 1); + ANDROID_LENS_FACING, &lensFacing, 1); METADATA_ASSERT(ret); - char availableAntiBandingModes[] = { - ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, - ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, - ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, - ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, + std::vector lensFocalLenghts = { + 1, }; ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, - availableAntiBandingModes, 4); + ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, + lensFocalLenghts.data(), + lensFocalLenghts.size()); METADATA_ASSERT(ret); - char aeAvailableModes[] = { - ANDROID_CONTROL_AE_MODE_ON, - ANDROID_CONTROL_AE_MODE_OFF, + std::vector opticalStabilizations = { + ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF, }; ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AE_AVAILABLE_MODES, - aeAvailableModes, 2); + ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, + opticalStabilizations.data(), + opticalStabilizations.size()); METADATA_ASSERT(ret); - controlMetadata = ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE; + float hypeFocalDistance = 0; ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AE_LOCK_AVAILABLE, - &controlMetadata, 1); + ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, + &hypeFocalDistance, 1); METADATA_ASSERT(ret); - uint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE; + float minFocusDistance = 0; ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AWB_LOCK_AVAILABLE, - &awbLockAvailable, 1); + ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, + &minFocusDistance, 1); + METADATA_ASSERT(ret); + + /* Noise reduction modes. */ + uint8_t noiseReductionModes = ANDROID_NOISE_REDUCTION_MODE_OFF; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, + &noiseReductionModes, 1); + METADATA_ASSERT(ret); /* Scaler static metadata. */ + float maxDigitalZoom = 1; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, + &maxDigitalZoom, 1); + METADATA_ASSERT(ret); + std::vector availableStreamFormats = { ANDROID_SCALER_AVAILABLE_FORMATS_BLOB, ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888, @@ -275,12 +472,39 @@ camera_metadata_t *CameraDevice::getStaticMetadata() minFrameDurations.data(), minFrameDurations.size()); METADATA_ASSERT(ret); + uint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_SCALER_CROPPING_TYPE, &croppingType, 1); + METADATA_ASSERT(ret); + /* Info static metadata. */ uint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED; ret = add_camera_metadata_entry(staticMetadata_, ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, &supportedHWLevel, 1); + /* Request static metadata. */ + int32_t partialResultCount = 1; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_REQUEST_PARTIAL_RESULT_COUNT, + &partialResultCount, 1); + METADATA_ASSERT(ret); + + uint8_t maxPipelineDepth = 2; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_REQUEST_PIPELINE_MAX_DEPTH, + &maxPipelineDepth, 1); + METADATA_ASSERT(ret); + + std::vector availableCapabilities = { + ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE, + }; + ret = add_camera_metadata_entry(staticMetadata_, + ANDROID_REQUEST_AVAILABLE_CAPABILITIES, + availableCapabilities.data(), + availableCapabilities.size()); + METADATA_ASSERT(ret); + return staticMetadata_; } From patchwork Thu Sep 5 21:09:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1944 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id F0FF461567 for ; Thu, 5 Sep 2019 23:08:14 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 731FEC0005; Thu, 5 Sep 2019 21:08:14 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Sep 2019 23:09:33 +0200 Message-Id: <20190905210940.32358-3-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190905210940.32358-1-jacopo@jmondi.org> References: <20190905210940.32358-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v7 2/9] android: camera_device: Use correct sizes for static metadata X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Sep 2019 21:08:15 -0000 Use more opportune sizes for the static metadata pack, and for the dynamic metadata sizes which where wrongly set to use the ones defined for the static pack. Acked-by: Laurent Pinchart Signed-off-by: Jacopo Mondi --- src/android/camera_device.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 15f57a7fe731..dee60e3d2931 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -128,11 +128,11 @@ camera_metadata_t *CameraDevice::getStaticMetadata() * more. */ - /* \todo Use correct sizes */ - #define STATIC_ENTRY_CAP 256 - #define STATIC_DATA_CAP 6688 - staticMetadata_ = allocate_camera_metadata(STATIC_ENTRY_CAP, - STATIC_DATA_CAP); + /* + * \todo Keep this in sync with the actual number of entries. + * Currently: 46 entries, 390 bytes + */ + staticMetadata_ = allocate_camera_metadata(50, 500); /* Color correction static metadata. */ std::vector aberrationModes = { @@ -966,11 +966,11 @@ camera_metadata_t *CameraDevice::getResultMetadata(int frame_number, { int ret; - /* \todo Use correct sizes */ - #define RESULT_ENTRY_CAP 256 - #define RESULT_DATA_CAP 6688 - camera_metadata_t *resultMetadata = - allocate_camera_metadata(STATIC_ENTRY_CAP, STATIC_DATA_CAP); + /* + * \todo Keep this in sync with the actual number of entries. + * Currently: 13 entries, 36 bytes + */ + camera_metadata_t *resultMetadata = allocate_camera_metadata(15, 50); const uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED; ret = add_camera_metadata_entry(resultMetadata, ANDROID_CONTROL_AE_STATE, From patchwork Thu Sep 5 21:09:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1945 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9C13E61929 for ; Thu, 5 Sep 2019 23:08:15 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 20379C0002; Thu, 5 Sep 2019 21:08:14 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Sep 2019 23:09:34 +0200 Message-Id: <20190905210940.32358-4-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190905210940.32358-1-jacopo@jmondi.org> References: <20190905210940.32358-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v7 3/9] android: camera_device: Remove tags from request template X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Sep 2019 21:08:16 -0000 Remove metadata tags wrongly added to the request template constructed by the libcamera HAL. Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- src/android/camera_device.cpp | 97 ----------------------------------- 1 file changed, 97 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index dee60e3d2931..bd69198ec482 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -557,39 +557,6 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) return nullptr; } - /* Set to 0 the number of 'processed and stalling' streams (ie JPEG). */ - int32_t maxOutStream[] = { 0, 2, 0 }; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, - maxOutStream, 3); - METADATA_ASSERT(ret); - - uint8_t maxPipelineDepth = 5; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_REQUEST_PIPELINE_MAX_DEPTH, - &maxPipelineDepth, 1); - METADATA_ASSERT(ret); - - int32_t inputStreams = 0; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS, - &inputStreams, 1); - METADATA_ASSERT(ret); - - int32_t partialResultCount = 1; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_REQUEST_PARTIAL_RESULT_COUNT, - &partialResultCount, 1); - METADATA_ASSERT(ret); - - uint8_t availableCapabilities[] = { - ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE, - }; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_REQUEST_AVAILABLE_CAPABILITIES, - availableCapabilities, 1); - METADATA_ASSERT(ret); - uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; ret = add_camera_metadata_entry(requestTemplate_, ANDROID_CONTROL_AE_MODE, @@ -632,12 +599,6 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) &awbLock, 1); METADATA_ASSERT(ret); - uint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_CONTROL_AWB_LOCK_AVAILABLE, - &awbLockAvailable, 1); - METADATA_ASSERT(ret); - uint8_t flashMode = ANDROID_FLASH_MODE_OFF; ret = add_camera_metadata_entry(requestTemplate_, ANDROID_FLASH_MODE, @@ -655,64 +616,6 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) &captureIntent, 1); METADATA_ASSERT(ret); - /* - * This is quite hard to list at the moment wihtout knowing what - * we could control. - * - * For now, just list in the available Request keys and in the available - * result keys the control and reporting of the AE algorithm. - */ - std::vector availableRequestKeys = { - ANDROID_CONTROL_AE_MODE, - ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, - ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, - ANDROID_CONTROL_AE_LOCK, - ANDROID_CONTROL_AF_TRIGGER, - ANDROID_CONTROL_AWB_MODE, - ANDROID_CONTROL_AWB_LOCK, - ANDROID_CONTROL_AWB_LOCK_AVAILABLE, - ANDROID_CONTROL_CAPTURE_INTENT, - ANDROID_FLASH_MODE, - ANDROID_STATISTICS_FACE_DETECT_MODE, - }; - - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, - availableRequestKeys.data(), - availableRequestKeys.size()); - METADATA_ASSERT(ret); - - std::vector availableResultKeys = { - ANDROID_CONTROL_AE_MODE, - ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, - ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, - ANDROID_CONTROL_AE_LOCK, - ANDROID_CONTROL_AF_TRIGGER, - ANDROID_CONTROL_AWB_MODE, - ANDROID_CONTROL_AWB_LOCK, - ANDROID_CONTROL_AWB_LOCK_AVAILABLE, - ANDROID_CONTROL_CAPTURE_INTENT, - ANDROID_FLASH_MODE, - ANDROID_STATISTICS_FACE_DETECT_MODE, - }; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_REQUEST_AVAILABLE_RESULT_KEYS, - availableResultKeys.data(), - availableResultKeys.size()); - METADATA_ASSERT(ret); - - /* - * \todo The available characteristics are be the tags reported - * as part of the static metadata reported at hal_get_camera_info() - * time. As of now, report an empty list. - */ - std::vector availableCharacteristicsKeys = {}; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, - availableCharacteristicsKeys.data(), - availableCharacteristicsKeys.size()); - METADATA_ASSERT(ret); - return requestTemplate_; } From patchwork Thu Sep 5 21:09:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1946 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4B7DE61567 for ; Thu, 5 Sep 2019 23:08:16 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id BCC58C0007; Thu, 5 Sep 2019 21:08:15 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Sep 2019 23:09:35 +0200 Message-Id: <20190905210940.32358-5-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190905210940.32358-1-jacopo@jmondi.org> References: <20190905210940.32358-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v7 4/9] android: camera_device: Add missing tags in request template X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Sep 2019 21:08:16 -0000 Add two missing tags from the request template generated by the HAL. The tags are reported as missing by the cros_camera_test tool. Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- src/android/camera_device.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index bd69198ec482..969c8192c316 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -611,6 +611,17 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) &faceDetectMode, 1); METADATA_ASSERT(ret); + uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF; + ret = add_camera_metadata_entry(requestTemplate_, + ANDROID_NOISE_REDUCTION_MODE, &noiseReduction, 1); + METADATA_ASSERT(ret); + + uint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF; + ret = add_camera_metadata_entry(requestTemplate_, + ANDROID_COLOR_CORRECTION_ABERRATION_MODE, + &aberrationMode, 1); + METADATA_ASSERT(ret); + ret = add_camera_metadata_entry(requestTemplate_, ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1); From patchwork Thu Sep 5 21:09:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1947 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id F230561931 for ; Thu, 5 Sep 2019 23:08:16 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 68DA0C0005; Thu, 5 Sep 2019 21:08:16 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Sep 2019 23:09:36 +0200 Message-Id: <20190905210940.32358-6-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190905210940.32358-1-jacopo@jmondi.org> References: <20190905210940.32358-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v7 5/9] android: camera_device: Use precise sizes for request template X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Sep 2019 21:08:17 -0000 Use more opportune sizes, manually calculated, for the generated request template. Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- src/android/camera_device.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 969c8192c316..5f8d19b9ef3d 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -547,11 +547,11 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) if (requestTemplate_) return requestTemplate_; - /* \todo Use correct sizes */ - #define REQUEST_TEMPLATE_ENTRIES 30 - #define REQUEST_TEMPLATE_DATA 2048 - requestTemplate_ = allocate_camera_metadata(REQUEST_TEMPLATE_ENTRIES, - REQUEST_TEMPLATE_DATA); + /* + * \todo Keep this in sync with the actual number of entries. + * Currently: 12 entries, 15 bytes + */ + requestTemplate_ = allocate_camera_metadata(15, 20); if (!requestTemplate_) { LOG(HAL, Error) << "Failed to allocate template metadata"; return nullptr; From patchwork Thu Sep 5 21:09:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1948 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A278F61937 for ; Thu, 5 Sep 2019 23:08:17 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 1F399C0002; Thu, 5 Sep 2019 21:08:16 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Sep 2019 23:09:37 +0200 Message-Id: <20190905210940.32358-7-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190905210940.32358-1-jacopo@jmondi.org> References: <20190905210940.32358-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v7 6/9] android: Add CameraMetadata helper class X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Sep 2019 21:08:18 -0000 From: Laurent Pinchart The new CameraMetadata helper class wraps the Android camera_metadata_t to simplify its usage. Reviewed-by: Jacopo Mondi Signed-off-by: Laurent Pinchart --- src/android/camera_metadata.cpp | 52 +++++++++++++++++++++++++++++++++ src/android/camera_metadata.h | 30 +++++++++++++++++++ src/android/meson.build | 1 + 3 files changed, 83 insertions(+) create mode 100644 src/android/camera_metadata.cpp create mode 100644 src/android/camera_metadata.h diff --git a/src/android/camera_metadata.cpp b/src/android/camera_metadata.cpp new file mode 100644 index 000000000000..76965108c08b --- /dev/null +++ b/src/android/camera_metadata.cpp @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * camera_metadata.cpp - libcamera Android Camera Metadata Helper + */ + +#include "camera_metadata.h" + +#include "log.h" + +using namespace libcamera; + +LOG_DEFINE_CATEGORY(CameraMetadata); + +CameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) +{ + metadata_ = allocate_camera_metadata(entryCapacity, dataCapacity); + valid_ = metadata_ != nullptr; +} + +CameraMetadata::~CameraMetadata() +{ + if (metadata_) + free_camera_metadata(metadata_); +} + +bool CameraMetadata::addEntry(uint32_t tag, const void *data, size_t count) +{ + if (!valid_) + return false; + + if (!add_camera_metadata_entry(metadata_, tag, data, count)) + return true; + + const char *name = get_camera_metadata_tag_name(tag); + if (name) + LOG(CameraMetadata, Error) + << "Failed to add tag " << name; + else + LOG(CameraMetadata, Error) + << "Failed to add unknown tag " << tag; + + valid_ = false; + + return false; +} + +camera_metadata_t *CameraMetadata::get() +{ + return valid_ ? metadata_ : nullptr; +} diff --git a/src/android/camera_metadata.h b/src/android/camera_metadata.h new file mode 100644 index 000000000000..75a9d7066f31 --- /dev/null +++ b/src/android/camera_metadata.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * camera_metadata.h - libcamera Android Camera Metadata Helper + */ +#ifndef __ANDROID_CAMERA_METADATA_H__ +#define __ANDROID_CAMERA_METADATA_H__ + +#include + +#include + +class CameraMetadata +{ +public: + CameraMetadata(size_t entryCapacity, size_t dataCapacity); + ~CameraMetadata(); + + bool isValid() { return valid_; } + bool addEntry(uint32_t tag, const void *data, size_t data_count); + + camera_metadata_t *get(); + +private: + camera_metadata_t *metadata_; + bool valid_; +}; + +#endif /* __ANDROID_CAMERA_METADATA_H__ */ diff --git a/src/android/meson.build b/src/android/meson.build index 26537794bc29..b5e4eeeb73a8 100644 --- a/src/android/meson.build +++ b/src/android/meson.build @@ -2,6 +2,7 @@ android_hal_sources = files([ 'camera3_hal.cpp', 'camera_hal_manager.cpp', 'camera_device.cpp', + 'camera_metadata.cpp', 'camera_proxy.cpp', 'thread_rpc.cpp' ]) From patchwork Thu Sep 5 21:09:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1949 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7827661935 for ; Thu, 5 Sep 2019 23:08:18 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id C0099C0007; Thu, 5 Sep 2019 21:08:17 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Sep 2019 23:09:38 +0200 Message-Id: <20190905210940.32358-8-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190905210940.32358-1-jacopo@jmondi.org> References: <20190905210940.32358-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v7 7/9] android: camera_device: Use the new CameraMetadata helper class X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Sep 2019 21:08:18 -0000 From: Laurent Pinchart Simplify the implementation of metadata handling in the CameraDevice class by using the new CameraMetadata helper class. Signed-off-by: Laurent Pinchart Signed-off-by: Jacopo Mondi --- src/android/camera_device.cpp | 535 ++++++++++++++-------------------- src/android/camera_device.h | 15 +- 2 files changed, 221 insertions(+), 329 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 5f8d19b9ef3d..8d42b13b60b8 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -7,10 +7,10 @@ #include "camera_device.h" -#include - #include "log.h" +#include "utils.h" +#include "camera_metadata.h" #include "thread_rpc.h" using namespace libcamera; @@ -59,12 +59,10 @@ CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr &camer CameraDevice::~CameraDevice() { if (staticMetadata_) - free_camera_metadata(staticMetadata_); - staticMetadata_ = nullptr; + delete staticMetadata_; if (requestTemplate_) - free_camera_metadata(requestTemplate_); - requestTemplate_ = nullptr; + delete requestTemplate_; } /* @@ -117,10 +115,8 @@ void CameraDevice::setCallbacks(const camera3_callback_ops_t *callbacks) */ camera_metadata_t *CameraDevice::getStaticMetadata() { - int ret; - if (staticMetadata_) - return staticMetadata_; + return staticMetadata_->get(); /* * The here reported metadata are enough to implement a basic capture @@ -132,16 +128,21 @@ camera_metadata_t *CameraDevice::getStaticMetadata() * \todo Keep this in sync with the actual number of entries. * Currently: 46 entries, 390 bytes */ - staticMetadata_ = allocate_camera_metadata(50, 500); + staticMetadata_ = new CameraMetadata(50, 500); + if (!staticMetadata_->isValid()) { + LOG(HAL, Error) << "Failed to allocate static metadata"; + delete staticMetadata_; + staticMetadata_ = nullptr; + return nullptr; + } /* Color correction static metadata. */ std::vector aberrationModes = { ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, - aberrationModes.data(), aberrationModes.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, + aberrationModes.data(), + aberrationModes.size()); /* Control static metadata. */ std::vector aeAvailableAntiBandingModes = { @@ -150,294 +151,228 @@ camera_metadata_t *CameraDevice::getStaticMetadata() ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, - aeAvailableAntiBandingModes.data(), - aeAvailableAntiBandingModes.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, + aeAvailableAntiBandingModes.data(), + aeAvailableAntiBandingModes.size()); std::vector aeAvailableModes = { ANDROID_CONTROL_AE_MODE_ON, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AE_AVAILABLE_MODES, - aeAvailableModes.data(), aeAvailableModes.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_MODES, + aeAvailableModes.data(), + aeAvailableModes.size()); std::vector availableAeFpsTarget = { 15, 30, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, - availableAeFpsTarget.data(), - availableAeFpsTarget.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, + availableAeFpsTarget.data(), + availableAeFpsTarget.size()); std::vector aeCompensationRange = { 0, 0, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AE_COMPENSATION_RANGE, - aeCompensationRange.data(), - aeCompensationRange.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AE_COMPENSATION_RANGE, + aeCompensationRange.data(), + aeCompensationRange.size()); const camera_metadata_rational_t aeCompensationStep[] = { { 0, 1 } }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AE_COMPENSATION_STEP, - aeCompensationStep, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AE_COMPENSATION_STEP, + aeCompensationStep, 1); std::vector availableAfModes = { ANDROID_CONTROL_AF_MODE_OFF, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AF_AVAILABLE_MODES, - availableAfModes.data(), availableAfModes.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AF_AVAILABLE_MODES, + availableAfModes.data(), + availableAfModes.size()); std::vector availableEffects = { ANDROID_CONTROL_EFFECT_MODE_OFF, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AVAILABLE_EFFECTS, - availableEffects.data(), availableEffects.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AVAILABLE_EFFECTS, + availableEffects.data(), + availableEffects.size()); std::vector availableSceneModes = { ANDROID_CONTROL_SCENE_MODE_DISABLED, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AVAILABLE_SCENE_MODES, - availableSceneModes.data(), availableSceneModes.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, + availableSceneModes.data(), + availableSceneModes.size()); std::vector availableStabilizationModes = { ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, - availableStabilizationModes.data(), - availableStabilizationModes.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, + availableStabilizationModes.data(), + availableStabilizationModes.size()); std::vector availableAwbModes = { ANDROID_CONTROL_AWB_MODE_OFF, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AWB_AVAILABLE_MODES, - availableAwbModes.data(), availableAwbModes.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AWB_AVAILABLE_MODES, + availableAwbModes.data(), + availableAwbModes.size()); std::vector availableMaxRegions = { 0, 0, 0, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_MAX_REGIONS, - availableMaxRegions.data(), availableMaxRegions.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_MAX_REGIONS, + availableMaxRegions.data(), + availableMaxRegions.size()); std::vector sceneModesOverride = { ANDROID_CONTROL_AE_MODE_ON, ANDROID_CONTROL_AWB_MODE_AUTO, ANDROID_CONTROL_AF_MODE_AUTO, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_SCENE_MODE_OVERRIDES, - sceneModesOverride.data(), sceneModesOverride.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, + sceneModesOverride.data(), + sceneModesOverride.size()); uint8_t aeLockAvailable = ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AE_LOCK_AVAILABLE, - &aeLockAvailable, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AE_LOCK_AVAILABLE, + &aeLockAvailable, 1); uint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AWB_LOCK_AVAILABLE, - &awbLockAvailable, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AWB_LOCK_AVAILABLE, + &awbLockAvailable, 1); char availableControlModes = ANDROID_CONTROL_MODE_AUTO; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_CONTROL_AVAILABLE_MODES, - &availableControlModes, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_CONTROL_AVAILABLE_MODES, + &availableControlModes, 1); /* JPEG static metadata. */ std::vector availableThumbnailSizes = { 0, 0, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, - availableThumbnailSizes.data(), - availableThumbnailSizes.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, + availableThumbnailSizes.data(), + availableThumbnailSizes.size()); /* Sensor static metadata. */ int32_t pixelArraySize[] = { 2592, 1944, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, - &pixelArraySize, 2); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, + &pixelArraySize, 2); int32_t sensorSizes[] = { 0, 0, 2560, 1920, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, - &sensorSizes, 4); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, + &sensorSizes, 4); int32_t sensitivityRange[] = { 32, 2400, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, - &sensitivityRange, 2); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, + &sensitivityRange, 2); uint16_t filterArr = ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, - &filterArr, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, + &filterArr, 1); int64_t exposureTimeRange[] = { 100000, 200000000, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, - &exposureTimeRange, 2); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, + &exposureTimeRange, 2); int32_t orientation = 0; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SENSOR_ORIENTATION, - &orientation, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SENSOR_ORIENTATION, + &orientation, 1); std::vector testPatterModes = { ANDROID_SENSOR_TEST_PATTERN_MODE_OFF, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, - testPatterModes.data(), testPatterModes.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, + testPatterModes.data(), + testPatterModes.size()); std::vector physicalSize = { 2592, 1944, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SENSOR_INFO_PHYSICAL_SIZE, - physicalSize.data(), physicalSize.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, + physicalSize.data(), + physicalSize.size()); uint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, - ×tampSource, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, + ×tampSource, 1); /* Statistics static metadata. */ uint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, - &faceDetectMode, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, + &faceDetectMode, 1); int32_t maxFaceCount = 0; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, - &maxFaceCount, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, + &maxFaceCount, 1); /* Sync static metadata. */ int32_t maxLatency = ANDROID_SYNC_MAX_LATENCY_UNKNOWN; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SYNC_MAX_LATENCY, &maxLatency, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SYNC_MAX_LATENCY, &maxLatency, 1); /* Flash static metadata. */ char flashAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_FLASH_INFO_AVAILABLE, - &flashAvailable, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_FLASH_INFO_AVAILABLE, + &flashAvailable, 1); /* Lens static metadata. */ std::vector lensApertures = { 2.53 / 100, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_LENS_INFO_AVAILABLE_APERTURES, - lensApertures.data(), lensApertures.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_LENS_INFO_AVAILABLE_APERTURES, + lensApertures.data(), + lensApertures.size()); uint8_t lensFacing = ANDROID_LENS_FACING_FRONT; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_LENS_FACING, &lensFacing, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_LENS_FACING, &lensFacing, 1); std::vector lensFocalLenghts = { 1, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, - lensFocalLenghts.data(), - lensFocalLenghts.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, + lensFocalLenghts.data(), + lensFocalLenghts.size()); std::vector opticalStabilizations = { ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, - opticalStabilizations.data(), - opticalStabilizations.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, + opticalStabilizations.data(), + opticalStabilizations.size()); float hypeFocalDistance = 0; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, - &hypeFocalDistance, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, + &hypeFocalDistance, 1); float minFocusDistance = 0; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, - &minFocusDistance, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, + &minFocusDistance, 1); /* Noise reduction modes. */ uint8_t noiseReductionModes = ANDROID_NOISE_REDUCTION_MODE_OFF; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, - &noiseReductionModes, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, + &noiseReductionModes, 1); /* Scaler static metadata. */ float maxDigitalZoom = 1; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, - &maxDigitalZoom, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, + &maxDigitalZoom, 1); std::vector availableStreamFormats = { ANDROID_SCALER_AVAILABLE_FORMATS_BLOB, ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888, ANDROID_SCALER_AVAILABLE_FORMATS_IMPLEMENTATION_DEFINED, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SCALER_AVAILABLE_FORMATS, - availableStreamFormats.data(), - availableStreamFormats.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_FORMATS, + availableStreamFormats.data(), + availableStreamFormats.size()); std::vector availableStreamConfigurations = { ANDROID_SCALER_AVAILABLE_FORMATS_BLOB, 2560, 1920, @@ -447,65 +382,58 @@ camera_metadata_t *CameraDevice::getStaticMetadata() ANDROID_SCALER_AVAILABLE_FORMATS_IMPLEMENTATION_DEFINED, 2560, 1920, ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, - availableStreamConfigurations.data(), - availableStreamConfigurations.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, + availableStreamConfigurations.data(), + availableStreamConfigurations.size()); std::vector availableStallDurations = { ANDROID_SCALER_AVAILABLE_FORMATS_BLOB, 2560, 1920, 33333333, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, - availableStallDurations.data(), - availableStallDurations.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, + availableStallDurations.data(), + availableStallDurations.size()); std::vector minFrameDurations = { ANDROID_SCALER_AVAILABLE_FORMATS_BLOB, 2560, 1920, 33333333, ANDROID_SCALER_AVAILABLE_FORMATS_IMPLEMENTATION_DEFINED, 2560, 1920, 33333333, ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888, 2560, 1920, 33333333, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, - minFrameDurations.data(), minFrameDurations.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, + minFrameDurations.data(), + minFrameDurations.size()); uint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_SCALER_CROPPING_TYPE, &croppingType, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_SCALER_CROPPING_TYPE, &croppingType, 1); /* Info static metadata. */ uint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, - &supportedHWLevel, 1); + staticMetadata_->addEntry(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, + &supportedHWLevel, 1); /* Request static metadata. */ int32_t partialResultCount = 1; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_REQUEST_PARTIAL_RESULT_COUNT, - &partialResultCount, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_REQUEST_PARTIAL_RESULT_COUNT, + &partialResultCount, 1); uint8_t maxPipelineDepth = 2; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_REQUEST_PIPELINE_MAX_DEPTH, - &maxPipelineDepth, 1); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH, + &maxPipelineDepth, 1); std::vector availableCapabilities = { ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE, }; - ret = add_camera_metadata_entry(staticMetadata_, - ANDROID_REQUEST_AVAILABLE_CAPABILITIES, - availableCapabilities.data(), - availableCapabilities.size()); - METADATA_ASSERT(ret); + staticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, + availableCapabilities.data(), + availableCapabilities.size()); + + if (!staticMetadata_->isValid()) { + LOG(HAL, Error) << "Failed to construct static metadata"; + delete staticMetadata_; + staticMetadata_ = nullptr; + return nullptr; + } - return staticMetadata_; + return staticMetadata_->get(); } /* @@ -513,8 +441,6 @@ camera_metadata_t *CameraDevice::getStaticMetadata() */ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) { - int ret; - /* * \todo Inspect type and pick the right metadata pack. * As of now just use a single one for all templates. @@ -545,89 +471,75 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) } if (requestTemplate_) - return requestTemplate_; + return requestTemplate_->get(); /* * \todo Keep this in sync with the actual number of entries. * Currently: 12 entries, 15 bytes */ - requestTemplate_ = allocate_camera_metadata(15, 20); + requestTemplate_ = new CameraMetadata(15, 20); if (!requestTemplate_) { LOG(HAL, Error) << "Failed to allocate template metadata"; + delete requestTemplate_; + requestTemplate_ = nullptr; return nullptr; } uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_CONTROL_AE_MODE, - &aeMode, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_CONTROL_AE_MODE, + &aeMode, 1); int32_t aeExposureCompensation = 0; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, - &aeExposureCompensation, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, + &aeExposureCompensation, 1); uint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, - &aePrecaptureTrigger, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, + &aePrecaptureTrigger, 1); uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_CONTROL_AE_LOCK, - &aeLock, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_CONTROL_AE_LOCK, + &aeLock, 1); uint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_CONTROL_AF_TRIGGER, - &afTrigger, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_CONTROL_AF_TRIGGER, + &afTrigger, 1); uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_CONTROL_AWB_MODE, - &awbMode, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_CONTROL_AWB_MODE, + &awbMode, 1); uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_CONTROL_AWB_LOCK, - &awbLock, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_CONTROL_AWB_LOCK, + &awbLock, 1); uint8_t flashMode = ANDROID_FLASH_MODE_OFF; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_FLASH_MODE, - &flashMode, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_FLASH_MODE, + &flashMode, 1); uint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_STATISTICS_FACE_DETECT_MODE, - &faceDetectMode, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE, + &faceDetectMode, 1); uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_NOISE_REDUCTION_MODE, &noiseReduction, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_NOISE_REDUCTION_MODE, + &noiseReduction, 1); uint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF; - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_COLOR_CORRECTION_ABERRATION_MODE, - &aberrationMode, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, + &aberrationMode, 1); - ret = add_camera_metadata_entry(requestTemplate_, - ANDROID_CONTROL_CAPTURE_INTENT, - &captureIntent, 1); - METADATA_ASSERT(ret); + requestTemplate_->addEntry(ANDROID_CONTROL_CAPTURE_INTENT, + &captureIntent, 1); - return requestTemplate_; + if (!requestTemplate_->isValid()) { + LOG(HAL, Error) << "Failed to construct request template"; + delete requestTemplate_; + requestTemplate_ = nullptr; + return nullptr; + } + + return requestTemplate_->get(); } /* @@ -799,7 +711,7 @@ void CameraDevice::requestComplete(Request *request, { Buffer *libcameraBuffer = buffers.begin()->second; camera3_buffer_status status = CAMERA3_BUFFER_STATUS_OK; - camera_metadata_t *resultMetadata = nullptr; + std::unique_ptr resultMetadata; if (request->status() != Request::RequestComplete) { LOG(HAL, Error) << "Request not succesfully completed: " @@ -826,27 +738,30 @@ void CameraDevice::requestComplete(Request *request, captureResult.output_buffers = const_cast(descriptor->buffers); - if (status == CAMERA3_BUFFER_STATUS_ERROR) { - /* \todo Improve error handling. */ - notifyError(descriptor->frameNumber, - descriptor->buffers[0].stream); - } else { + if (status == CAMERA3_BUFFER_STATUS_OK) { notifyShutter(descriptor->frameNumber, libcameraBuffer->timestamp()); captureResult.partial_result = 1; resultMetadata = getResultMetadata(descriptor->frameNumber, libcameraBuffer->timestamp()); - captureResult.result = resultMetadata; + captureResult.result = resultMetadata->get(); + } + + if (status == CAMERA3_BUFFER_STATUS_ERROR || !captureResult.result) { + /* \todo Improve error handling. In case we notify an error + * because the metadata generation fails, a shutter event has + * already been notified for this frame number before the erro + * is here signaled. Make shure the error path plays well with + * the camera stack state machine. + */ + notifyError(descriptor->frameNumber, + descriptor->buffers[0].stream); } callbacks_->process_capture_result(callbacks_, &captureResult); delete descriptor; - if (resultMetadata) - free_camera_metadata(resultMetadata); - - return; } void CameraDevice::notifyShutter(uint32_t frameNumber, uint64_t timestamp) @@ -875,89 +790,71 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream) /* * Produce a set of fixed result metadata. */ -camera_metadata_t *CameraDevice::getResultMetadata(int frame_number, - int64_t timestamp) +std::unique_ptr CameraDevice::getResultMetadata(int frame_number, + int64_t timestamp) { - int ret; - /* * \todo Keep this in sync with the actual number of entries. * Currently: 13 entries, 36 bytes */ - camera_metadata_t *resultMetadata = allocate_camera_metadata(15, 50); + std::unique_ptr resultMetadata = + utils::make_unique(15, 50); + if (!resultMetadata->isValid()) { + LOG(HAL, Error) << "Failed to allocate static metadata"; + return nullptr; + } const uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED; - ret = add_camera_metadata_entry(resultMetadata, ANDROID_CONTROL_AE_STATE, - &ae_state, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_CONTROL_AE_STATE, &ae_state, 1); const uint8_t ae_lock = ANDROID_CONTROL_AE_LOCK_OFF; - ret = add_camera_metadata_entry(resultMetadata, ANDROID_CONTROL_AE_LOCK, - &ae_lock, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_CONTROL_AE_LOCK, &ae_lock, 1); uint8_t af_state = ANDROID_CONTROL_AF_STATE_INACTIVE; - ret = add_camera_metadata_entry(resultMetadata, ANDROID_CONTROL_AF_STATE, - &af_state, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_CONTROL_AF_STATE, &af_state, 1); const uint8_t awb_state = ANDROID_CONTROL_AWB_STATE_CONVERGED; - ret = add_camera_metadata_entry(resultMetadata, - ANDROID_CONTROL_AWB_STATE, - &awb_state, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_CONTROL_AWB_STATE, &awb_state, 1); const uint8_t awb_lock = ANDROID_CONTROL_AWB_LOCK_OFF; - ret = add_camera_metadata_entry(resultMetadata, - ANDROID_CONTROL_AWB_LOCK, - &awb_lock, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_CONTROL_AWB_LOCK, &awb_lock, 1); const uint8_t lens_state = ANDROID_LENS_STATE_STATIONARY; - ret = add_camera_metadata_entry(resultMetadata, - ANDROID_LENS_STATE, - &lens_state, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_LENS_STATE, &lens_state, 1); int32_t sensorSizes[] = { 0, 0, 2560, 1920, }; - ret = add_camera_metadata_entry(resultMetadata, - ANDROID_SCALER_CROP_REGION, - sensorSizes, 4); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_SCALER_CROP_REGION, sensorSizes, 4); - ret = add_camera_metadata_entry(resultMetadata, - ANDROID_SENSOR_TIMESTAMP, - ×tamp, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); /* 33.3 msec */ const int64_t rolling_shutter_skew = 33300000; - ret = add_camera_metadata_entry(resultMetadata, - ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, - &rolling_shutter_skew, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, + &rolling_shutter_skew, 1); /* 16.6 msec */ const int64_t exposure_time = 16600000; - ret = add_camera_metadata_entry(resultMetadata, - ANDROID_SENSOR_EXPOSURE_TIME, - &exposure_time, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_SENSOR_EXPOSURE_TIME, + &exposure_time, 1); const uint8_t lens_shading_map_mode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF; - ret = add_camera_metadata_entry(resultMetadata, - ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, - &lens_shading_map_mode, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, + &lens_shading_map_mode, 1); const uint8_t scene_flicker = ANDROID_STATISTICS_SCENE_FLICKER_NONE; - ret = add_camera_metadata_entry(resultMetadata, - ANDROID_STATISTICS_SCENE_FLICKER, - &scene_flicker, 1); - METADATA_ASSERT(ret); + resultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER, + &scene_flicker, 1); + + /* + * Return the result metadata pack even is not valid: get() will return + * nullptr. + */ + if (!resultMetadata->isValid()) { + LOG(HAL, Error) << "Failed to construct result metadata"; + } return resultMetadata; } diff --git a/src/android/camera_device.h b/src/android/camera_device.h index 7897ba9dc5c7..65ba877a02ea 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -19,13 +19,7 @@ #include "message.h" -#define METADATA_ASSERT(_r) \ - do { \ - if (!(_r)) break; \ - LOG(HAL, Error) << "Error: " << __func__ << ":" << __LINE__; \ - return nullptr; \ - } while(0); - +class CameraMetadata; class ThreadRpc; class CameraDevice : public libcamera::Object @@ -59,14 +53,15 @@ private: void notifyShutter(uint32_t frameNumber, uint64_t timestamp); void notifyError(uint32_t frameNumber, camera3_stream_t *stream); - camera_metadata_t *getResultMetadata(int frame_number, int64_t timestamp); + std::unique_ptr getResultMetadata(int frame_number, + int64_t timestamp); bool running_; std::shared_ptr camera_; std::unique_ptr config_; - camera_metadata_t *staticMetadata_; - camera_metadata_t *requestTemplate_; + CameraMetadata *staticMetadata_; + CameraMetadata *requestTemplate_; const camera3_callback_ops_t *callbacks_; }; From patchwork Thu Sep 5 21:09:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1950 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3191E61931 for ; Thu, 5 Sep 2019 23:08:19 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 9929FC0002; Thu, 5 Sep 2019 21:08:18 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Sep 2019 23:09:39 +0200 Message-Id: <20190905210940.32358-9-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190905210940.32358-1-jacopo@jmondi.org> References: <20190905210940.32358-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v7 8/9] android: camera_device: Fix handling of request template X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Sep 2019 21:08:19 -0000 According to the Android camera HALv3 documentation, the request template metadata pack should not be modified after it is returned to the camera stack from the HAL. Currently, the same metadata pack is used for all types of template request, without updating the capture intent there contained to match the requested template type, as correctly reported by the cros_camera_test test application. In order to avoid modifying the single request template already returned to the camera stack in order to update the capture intent it contains, create a map that associates a dedicated template to each supported capture type. Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- src/android/camera_device.cpp | 82 +++++++++++++++++------------------ src/android/camera_device.h | 2 +- 2 files changed, 40 insertions(+), 44 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 8d42b13b60b8..73b3989947d4 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -50,8 +50,7 @@ CameraDevice::Camera3RequestDescriptor::~Camera3RequestDescriptor() */ CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr &camera) - : running_(false), camera_(camera), staticMetadata_(nullptr), - requestTemplate_(nullptr) + : running_(false), camera_(camera), staticMetadata_(nullptr) { camera_->requestCompleted.connect(this, &CameraDevice::requestComplete); } @@ -61,8 +60,8 @@ CameraDevice::~CameraDevice() if (staticMetadata_) delete staticMetadata_; - if (requestTemplate_) - delete requestTemplate_; + for (auto &it : requestTemplates_) + delete it.second; } /* @@ -441,10 +440,11 @@ camera_metadata_t *CameraDevice::getStaticMetadata() */ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) { - /* - * \todo Inspect type and pick the right metadata pack. - * As of now just use a single one for all templates. - */ + auto it = requestTemplates_.find(type); + if (it != requestTemplates_.end()) + return it->second->get(); + + /* Use the capture intent matching the requested template type. */ uint8_t captureIntent; switch (type) { case CAMERA3_TEMPLATE_PREVIEW: @@ -470,76 +470,72 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) return nullptr; } - if (requestTemplate_) - return requestTemplate_->get(); - /* * \todo Keep this in sync with the actual number of entries. * Currently: 12 entries, 15 bytes */ - requestTemplate_ = new CameraMetadata(15, 20); - if (!requestTemplate_) { + CameraMetadata *requestTemplate = new CameraMetadata(15, 20); + if (!requestTemplate->isValid()) { LOG(HAL, Error) << "Failed to allocate template metadata"; - delete requestTemplate_; - requestTemplate_ = nullptr; + delete requestTemplate; return nullptr; } uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; - requestTemplate_->addEntry(ANDROID_CONTROL_AE_MODE, - &aeMode, 1); + requestTemplate->addEntry(ANDROID_CONTROL_AE_MODE, + &aeMode, 1); int32_t aeExposureCompensation = 0; - requestTemplate_->addEntry(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, - &aeExposureCompensation, 1); + requestTemplate->addEntry(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, + &aeExposureCompensation, 1); uint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE; - requestTemplate_->addEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, - &aePrecaptureTrigger, 1); + requestTemplate->addEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, + &aePrecaptureTrigger, 1); uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; - requestTemplate_->addEntry(ANDROID_CONTROL_AE_LOCK, - &aeLock, 1); + requestTemplate->addEntry(ANDROID_CONTROL_AE_LOCK, + &aeLock, 1); uint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE; - requestTemplate_->addEntry(ANDROID_CONTROL_AF_TRIGGER, - &afTrigger, 1); + requestTemplate->addEntry(ANDROID_CONTROL_AF_TRIGGER, + &afTrigger, 1); uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; - requestTemplate_->addEntry(ANDROID_CONTROL_AWB_MODE, - &awbMode, 1); + requestTemplate->addEntry(ANDROID_CONTROL_AWB_MODE, + &awbMode, 1); uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; - requestTemplate_->addEntry(ANDROID_CONTROL_AWB_LOCK, - &awbLock, 1); + requestTemplate->addEntry(ANDROID_CONTROL_AWB_LOCK, + &awbLock, 1); uint8_t flashMode = ANDROID_FLASH_MODE_OFF; - requestTemplate_->addEntry(ANDROID_FLASH_MODE, - &flashMode, 1); + requestTemplate->addEntry(ANDROID_FLASH_MODE, + &flashMode, 1); uint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; - requestTemplate_->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE, - &faceDetectMode, 1); + requestTemplate->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE, + &faceDetectMode, 1); uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF; - requestTemplate_->addEntry(ANDROID_NOISE_REDUCTION_MODE, - &noiseReduction, 1); + requestTemplate->addEntry(ANDROID_NOISE_REDUCTION_MODE, + &noiseReduction, 1); uint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF; - requestTemplate_->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, - &aberrationMode, 1); + requestTemplate->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, + &aberrationMode, 1); - requestTemplate_->addEntry(ANDROID_CONTROL_CAPTURE_INTENT, - &captureIntent, 1); + requestTemplate->addEntry(ANDROID_CONTROL_CAPTURE_INTENT, + &captureIntent, 1); - if (!requestTemplate_->isValid()) { + if (!requestTemplate->isValid()) { LOG(HAL, Error) << "Failed to construct request template"; - delete requestTemplate_; - requestTemplate_ = nullptr; + delete requestTemplate; return nullptr; } - return requestTemplate_->get(); + requestTemplates_[type] = requestTemplate; + return requestTemplate->get(); } /* diff --git a/src/android/camera_device.h b/src/android/camera_device.h index 65ba877a02ea..d5d136a74f4a 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -61,7 +61,7 @@ private: std::unique_ptr config_; CameraMetadata *staticMetadata_; - CameraMetadata *requestTemplate_; + std::map requestTemplates_; const camera3_callback_ops_t *callbacks_; }; From patchwork Thu Sep 5 21:09:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1951 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C605761567 for ; Thu, 5 Sep 2019 23:08:19 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 46EE3C000B; Thu, 5 Sep 2019 21:08:19 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Sep 2019 23:09:40 +0200 Message-Id: <20190905210940.32358-10-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190905210940.32358-1-jacopo@jmondi.org> References: <20190905210940.32358-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v7 9/9] android: camera_device: Report available keys X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Sep 2019 21:08:20 -0000 Report the list of available static metadata tags (characteristicKeys), of supported controls (requestKeys) and produced metadata (resultKeys) in the static metadata pack. Reviewed-by: Laurent Pinchart Signed-off-by: Jacopo Mondi --- src/android/camera_device.cpp | 93 ++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 73b3989947d4..cd99ea6a3cb2 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -125,9 +125,9 @@ camera_metadata_t *CameraDevice::getStaticMetadata() /* * \todo Keep this in sync with the actual number of entries. - * Currently: 46 entries, 390 bytes + * Currently: 49 entries, 666 bytes */ - staticMetadata_ = new CameraMetadata(50, 500); + staticMetadata_ = new CameraMetadata(50, 700); if (!staticMetadata_->isValid()) { LOG(HAL, Error) << "Failed to allocate static metadata"; delete staticMetadata_; @@ -425,6 +425,95 @@ camera_metadata_t *CameraDevice::getStaticMetadata() availableCapabilities.data(), availableCapabilities.size()); + std::vector availableCharacteristicsKeys = { + ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, + ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, + ANDROID_CONTROL_AE_AVAILABLE_MODES, + ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, + ANDROID_CONTROL_AE_COMPENSATION_RANGE, + ANDROID_CONTROL_AE_COMPENSATION_STEP, + ANDROID_CONTROL_AF_AVAILABLE_MODES, + ANDROID_CONTROL_AVAILABLE_EFFECTS, + ANDROID_CONTROL_AVAILABLE_SCENE_MODES, + ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, + ANDROID_CONTROL_AWB_AVAILABLE_MODES, + ANDROID_CONTROL_MAX_REGIONS, + ANDROID_CONTROL_SCENE_MODE_OVERRIDES, + ANDROID_CONTROL_AE_LOCK_AVAILABLE, + ANDROID_CONTROL_AWB_LOCK_AVAILABLE, + ANDROID_CONTROL_AVAILABLE_MODES, + ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, + ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, + ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, + ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, + ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, + ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, + ANDROID_SENSOR_ORIENTATION, + ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, + ANDROID_SENSOR_INFO_PHYSICAL_SIZE, + ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, + ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, + ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, + ANDROID_SYNC_MAX_LATENCY, + ANDROID_FLASH_INFO_AVAILABLE, + ANDROID_LENS_INFO_AVAILABLE_APERTURES, + ANDROID_LENS_FACING, + ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, + ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, + ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, + ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, + ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, + ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, + ANDROID_SCALER_AVAILABLE_FORMATS, + ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, + ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, + ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, + ANDROID_SCALER_CROPPING_TYPE, + ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, + ANDROID_REQUEST_PARTIAL_RESULT_COUNT, + ANDROID_REQUEST_PIPELINE_MAX_DEPTH, + ANDROID_REQUEST_AVAILABLE_CAPABILITIES, + }; + staticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, + availableCharacteristicsKeys.data(), + availableCharacteristicsKeys.size()); + + std::vector availableRequestKeys = { + ANDROID_CONTROL_AE_MODE, + ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, + ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, + ANDROID_CONTROL_AE_LOCK, + ANDROID_CONTROL_AF_TRIGGER, + ANDROID_CONTROL_AWB_MODE, + ANDROID_CONTROL_AWB_LOCK, + ANDROID_FLASH_MODE, + ANDROID_STATISTICS_FACE_DETECT_MODE, + ANDROID_NOISE_REDUCTION_MODE, + ANDROID_COLOR_CORRECTION_ABERRATION_MODE, + ANDROID_CONTROL_CAPTURE_INTENT, + }; + staticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, + availableRequestKeys.data(), + availableRequestKeys.size()); + + std::vector availableResultKeys = { + ANDROID_CONTROL_AE_STATE, + ANDROID_CONTROL_AE_LOCK, + ANDROID_CONTROL_AF_STATE, + ANDROID_CONTROL_AWB_STATE, + ANDROID_CONTROL_AWB_LOCK, + ANDROID_LENS_STATE, + ANDROID_SCALER_CROP_REGION, + ANDROID_SENSOR_TIMESTAMP, + ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, + ANDROID_SENSOR_EXPOSURE_TIME, + ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, + ANDROID_STATISTICS_SCENE_FLICKER, + }; + staticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS, + availableResultKeys.data(), + availableResultKeys.size()); + if (!staticMetadata_->isValid()) { LOG(HAL, Error) << "Failed to construct static metadata"; delete staticMetadata_;