| /* Copyright 2016 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef CAMERA_HAL_USB_METADATA_HANDLER_H_ |
| #define CAMERA_HAL_USB_METADATA_HANDLER_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <vector> |
| |
| #include <base/threading/thread_checker.h> |
| #include <camera/camera_metadata.h> |
| #include <hardware/camera3.h> |
| |
| #include "hal/usb/common_types.h" |
| #include "hal/usb/sensor_handler.h" |
| #include "hal/usb/v4l2_camera_device.h" |
| |
| namespace cros { |
| |
| using AwbModeToTemperatureMap = |
| std::map<camera_metadata_enum_android_control_awb_mode, uint32_t>; |
| |
| struct CameraMetadataDeleter { |
| inline void operator()(camera_metadata_t* metadata) const { |
| free_camera_metadata(metadata); |
| } |
| }; |
| |
| typedef std::unique_ptr<camera_metadata_t, CameraMetadataDeleter> |
| ScopedCameraMetadata; |
| |
| // MetadataHandler is thread-safe. It is used for saving metadata states of |
| // CameraDevice. |
| class MetadataHandler { |
| public: |
| MetadataHandler(const camera_metadata_t& static_metadata, |
| const camera_metadata_t& request_template, |
| const DeviceInfo& device_info, |
| V4L2CameraDevice* device, |
| const SupportedFormats& supported_formats); |
| ~MetadataHandler(); |
| |
| static int FillDefaultMetadata(android::CameraMetadata* static_metadata, |
| android::CameraMetadata* request_metadata); |
| |
| static int FillMetadataFromSupportedFormats( |
| const SupportedFormats& supported_formats, |
| const DeviceInfo& device_info, |
| android::CameraMetadata* static_metadata, |
| android::CameraMetadata* request_metadata); |
| |
| static int FillMetadataFromDeviceInfo( |
| const DeviceInfo& device_info, |
| android::CameraMetadata* static_metadata, |
| android::CameraMetadata* request_metadata); |
| |
| static int FillSensorInfo(const DeviceInfo& device_info, |
| android::CameraMetadata* metadata, |
| int32_t array_width, |
| int32_t array_height); |
| |
| // Get default settings according to the |template_type|. Can be called on |
| // any thread. |
| const camera_metadata_t* GetDefaultRequestSettings(int template_type); |
| |
| // PreHandleRequest and PostHandleRequest should run on the same thread. |
| |
| // Called before the request is processed. This function is used for checking |
| // metadata values to setup related states and image settings. |
| int PreHandleRequest(int frame_number, |
| const Size& resolution, |
| android::CameraMetadata* metadata); |
| |
| // Called after the request is processed. This function is used to update |
| // required metadata which can be gotton from 3A or image processor. |
| int PostHandleRequest(int frame_number, |
| int64_t timestamp, |
| android::CameraMetadata* metadata); |
| |
| private: |
| // Check |template_type| is valid or not. |
| bool IsValidTemplateType(int template_type); |
| |
| // Check if constant frame rate should be enabled or not. |
| bool ShouldEnableConstantFrameRate( |
| const android::CameraMetadata* metadata) const; |
| |
| // Return a copy of metadata according to |template_type|. |
| ScopedCameraMetadata CreateDefaultRequestSettings(int template_type); |
| int FillDefaultPreviewSettings(android::CameraMetadata* metadata); |
| int FillDefaultStillCaptureSettings(android::CameraMetadata* metadata); |
| int FillDefaultVideoRecordSettings(android::CameraMetadata* metadata); |
| int FillDefaultVideoSnapshotSettings(android::CameraMetadata* metadata); |
| int FillDefaultZeroShutterLagSettings(android::CameraMetadata* metadata); |
| int FillDefaultManualSettings(android::CameraMetadata* metadata); |
| |
| static AwbModeToTemperatureMap GetAvailableAwbTemperatures( |
| const DeviceInfo& device_info); |
| |
| // Metadata containing persistent camera characteristics. |
| android::CameraMetadata static_metadata_; |
| // The base template for constructing request settings. |
| android::CameraMetadata request_template_; |
| |
| // Static array of standard camera settings templates. These are owned by |
| // CameraClient. |
| ScopedCameraMetadata template_settings_[CAMERA3_TEMPLATE_COUNT]; |
| |
| // Use to check PreHandleRequest and PostHandleRequest are called on the same |
| // thread. |
| base::ThreadChecker thread_checker_; |
| |
| // Camera device information. |
| const DeviceInfo device_info_; |
| |
| // Delegate to communicate with camera device. Caller owns the ownership. |
| V4L2CameraDevice* device_; |
| |
| int current_frame_number_; |
| |
| bool af_trigger_; |
| |
| int max_supported_fps_; |
| |
| // Sensor handler to get sensor related metadata. |
| std::unique_ptr<SensorHandler> sensor_handler_; |
| |
| // Awb mode to color temperature map |
| AwbModeToTemperatureMap awb_temperature_; |
| bool is_awb_control_supported_; |
| |
| bool is_brightness_control_supported_; |
| bool is_contrast_control_supported_; |
| bool is_pan_control_supported_; |
| bool is_saturation_control_supported_; |
| bool is_sharpness_control_supported_; |
| bool is_tilt_control_supported_; |
| bool is_zoom_control_supported_; |
| }; |
| |
| } // namespace cros |
| |
| #endif // CAMERA_HAL_USB_METADATA_HANDLER_H_ |