1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef EMULATOR_CAMERA_HAL_LOGICAL_REQUEST_STATE_H 18 #define EMULATOR_CAMERA_HAL_LOGICAL_REQUEST_STATE_H 19 20 #include "EmulatedRequestState.h" 21 #include "hwl_types.h" 22 #include "utils/HWLUtils.h" 23 24 namespace android { 25 26 using google_camera_hal::HalCameraMetadata; 27 using google_camera_hal::HalStream; 28 using google_camera_hal::HwlPipelineCallback; 29 30 struct EmulatedStream : public HalStream { 31 uint32_t width, height; 32 size_t buffer_size; 33 bool is_input; 34 int32_t group_id; 35 int64_t use_case; 36 }; 37 38 struct EmulatedPipeline { 39 HwlPipelineCallback cb; 40 // stream id -> stream map 41 std::unordered_map<uint32_t, EmulatedStream> streams; 42 uint32_t physical_camera_id, pipeline_id; 43 }; 44 45 // [physical_camera_id -> [group_id -> stream_id]] 46 typedef std::map<uint32_t, std::map<uint32_t, int32_t>> DynamicStreamIdMapType; 47 48 // Info keeping track of mapping between zoom ratio range, focal length, and 49 // physical camera Id. 50 struct ZoomRatioPhysicalCameraInfo { 51 float focal_length; 52 float min_zoom_ratio; 53 float max_zoom_ratio; 54 uint32_t physical_camera_id; 55 }; 56 57 class EmulatedLogicalRequestState { 58 public: 59 EmulatedLogicalRequestState(uint32_t camera_id); 60 virtual ~EmulatedLogicalRequestState(); 61 62 status_t Initialize(std::unique_ptr<HalCameraMetadata> static_meta, 63 PhysicalDeviceMapPtr physical_device_map); 64 65 status_t GetDefaultRequest( 66 RequestTemplate type, 67 std::unique_ptr<HalCameraMetadata>* default_settings /*out*/); 68 69 std::unique_ptr<HwlPipelineResult> InitializeLogicalResult( 70 uint32_t pipeline_id, uint32_t frame_number); 71 72 status_t InitializeLogicalSettings( 73 std::unique_ptr<HalCameraMetadata> request_settings, 74 std::unique_ptr<std::set<uint32_t>> physical_camera_output_ids, 75 EmulatedSensor::LogicalCameraSettings* logical_settings /*out*/); 76 77 static std::unique_ptr<HalCameraMetadata> AdaptLogicalCharacteristics( 78 std::unique_ptr<HalCameraMetadata> logical_chars, 79 PhysicalDeviceMapPtr physical_devices); 80 81 status_t UpdateRequestForDynamicStreams( 82 HwlPipelineRequest* request, 83 const std::vector<EmulatedPipeline>& pipelines, 84 const DynamicStreamIdMapType& dynamic_stream_id_map_type, 85 bool use_default_physical_camera); 86 87 private: 88 uint32_t logical_camera_id_ = 0; 89 std::unique_ptr<EmulatedRequestState> logical_request_state_; 90 bool is_logical_device_ = false; 91 std::unique_ptr<std::set<uint32_t>> physical_camera_output_ids_; 92 PhysicalDeviceMapPtr physical_device_map_; 93 // Maps a physical device id to its respective request state 94 std::unordered_map<uint32_t, std::unique_ptr<EmulatedRequestState>> 95 physical_request_states_; 96 97 // Describes the mapping between particular zoom ratio boundary value and 98 // physical device id. The vector is sorted by ascending zoom ratios. 99 std::vector<ZoomRatioPhysicalCameraInfo> zoom_ratio_physical_camera_info_; 100 uint32_t current_physical_camera_ = 0; 101 102 static std::vector<ZoomRatioPhysicalCameraInfo> GetZoomRatioPhysicalCameraInfo( 103 const HalCameraMetadata* logical_chars, 104 const PhysicalDeviceMap* physical_devices); 105 static void UpdateActivePhysicalId(HalCameraMetadata* result_metadata, 106 uint32_t device_id); 107 108 EmulatedLogicalRequestState(const EmulatedLogicalRequestState&) = delete; 109 EmulatedLogicalRequestState& operator=(const EmulatedLogicalRequestState&) = 110 delete; 111 }; 112 113 } // namespace android 114 115 #endif // EMULATOR_CAMERA_HAL_LOGICAL_REQUEST_STATE_H 116