/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef EMULATOR_CAMERA_HAL_HWL_CAMERA_DEVICE_SESSION_HWL_IMPL_H #define EMULATOR_CAMERA_HAL_HWL_CAMERA_DEVICE_SESSION_HWL_IMPL_H #include #include #include "EmulatedCameraDeviceHWLImpl.h" #include "EmulatedRequestProcessor.h" #include "EmulatedTorchState.h" #include "multicam_coordinator_hwl.h" #include "utils/StreamConfigurationMap.h" namespace android { using google_camera_hal::CameraDeviceHwl; using google_camera_hal::CameraDeviceSessionHwl; using google_camera_hal::CaptureRequest; using google_camera_hal::CaptureResult; using google_camera_hal::Dimension; using google_camera_hal::HalStream; using google_camera_hal::HwlOfflinePipelineRole; using google_camera_hal::HwlPipelineCallback; using google_camera_hal::HwlPipelineRequest; using google_camera_hal::HwlSessionCallback; using google_camera_hal::IMulticamCoordinatorHwl; using google_camera_hal::RequestTemplate; using google_camera_hal::SessionDataKey; using google_camera_hal::Stream; using google_camera_hal::StreamConfiguration; using google_camera_hal::ZoomRatioMapperHwl; class EmulatedCameraZoomRatioMapperHwlImpl : public ZoomRatioMapperHwl { public: EmulatedCameraZoomRatioMapperHwlImpl( const std::unordered_map>& dims); virtual ~EmulatedCameraZoomRatioMapperHwlImpl() = default; // Limit zoom ratio if concurrent mode is on virtual void LimitZoomRatioIfConcurrent(float*) const override{}; // Get the array dimensions to be used for this capture request / result virtual bool GetActiveArrayDimensionToBeUsed( uint32_t camera_id, const HalCameraMetadata* settings, Dimension* active_array_dimension) const override; // Apply zoom ratio to capture request virtual void UpdateCaptureRequest(CaptureRequest*) override{}; // Apply zoom ratio to capture result virtual void UpdateCaptureResult(CaptureResult*) override{}; static std::unique_ptr Create( const std::unordered_map>& dims); private: // camera id -> {max res dimension (array size), default dimension } std::unordered_map> camera_ids_to_dimensions_; }; // Implementation of CameraDeviceSessionHwl interface class EmulatedCameraDeviceSessionHwlImpl : public CameraDeviceSessionHwl { public: static std::unique_ptr Create( uint32_t camera_id, std::unique_ptr static_meta, PhysicalDeviceMapPtr physical_devices, std::shared_ptr torch_state); virtual ~EmulatedCameraDeviceSessionHwlImpl(); // Override functions in CameraDeviceSessionHwl status_t ConstructDefaultRequestSettings( RequestTemplate type, std::unique_ptr* default_settings) override; status_t PrepareConfigureStreams( const StreamConfiguration& /*request_config*/) override { return OK; } // Noop for now status_t ConfigurePipeline(uint32_t physical_camera_id, HwlPipelineCallback hwl_pipeline_callback, const StreamConfiguration& request_config, const StreamConfiguration& overall_config, uint32_t* pipeline_id) override; status_t BuildPipelines() override; status_t PreparePipeline(uint32_t /*pipeline_id*/, uint32_t /*frame_number*/) override { return OK; } // Noop for now status_t GetRequiredIntputStreams(const StreamConfiguration& /*overall_config*/, HwlOfflinePipelineRole /*pipeline_role*/, std::vector* /*streams*/) override { // N/A return INVALID_OPERATION; } status_t GetConfiguredHalStream( uint32_t pipeline_id, std::vector* hal_streams) const override; void DestroyPipelines() override; status_t SubmitRequests(uint32_t frame_number, std::vector& requests) override; status_t Flush() override; uint32_t GetCameraId() const override; std::vector GetPhysicalCameraIds() const override; status_t GetCameraCharacteristics( std::unique_ptr* characteristics) const override; status_t GetPhysicalCameraCharacteristics( uint32_t physical_camera_id, std::unique_ptr* characteristics) const override; status_t SetSessionData(SessionDataKey /*key*/ , void* /*value*/) override { return OK; } // Noop for now status_t GetSessionData(SessionDataKey /*key*/, void** /*value*/) const override { return OK; } // Noop for now void SetSessionCallback( const HwlSessionCallback& hwl_session_callback) override; status_t FilterResultMetadata(HalCameraMetadata* /*metadata*/) const override { return OK; } // Noop for now std::unique_ptr CreateMulticamCoordinatorHwl() override { return nullptr; } status_t IsReconfigurationRequired( const HalCameraMetadata* /*old_session*/, const HalCameraMetadata* /*new_session*/, bool* reconfiguration_required) const override { if (reconfiguration_required == nullptr) { return BAD_VALUE; } *reconfiguration_required = true; return OK; } std::unique_ptr GetZoomRatioMapperHwl() override { return std::move(zoom_ratio_mapper_hwl_impl_); } // End override functions in CameraDeviceSessionHwl private: status_t Initialize(uint32_t camera_id, std::unique_ptr static_meta); status_t InitializeRequestProcessor(); status_t CheckOutputFormatsForInput( const HwlPipelineRequest& request, const std::unordered_map& streams, const std::unique_ptr& stream_configuration_map, android_pixel_format_t input_format); EmulatedCameraDeviceSessionHwlImpl( PhysicalDeviceMapPtr physical_devices, std::shared_ptr torch_state) : torch_state_(torch_state), physical_device_map_(std::move(physical_devices)) { } uint8_t max_pipeline_depth_ = 0; // Protects the API entry points mutable std::mutex api_mutex_; uint32_t camera_id_ = 0; bool error_state_ = false; bool pipelines_built_ = false; bool has_raw_stream_ = false; std::unique_ptr static_metadata_; std::vector pipelines_; std::unique_ptr request_processor_; std::unique_ptr stream_configuration_map_; PhysicalStreamConfigurationMap physical_stream_configuration_map_; PhysicalStreamConfigurationMap physical_stream_configuration_map_max_resolution_; std::unique_ptr stream_configuration_map_max_resolution_; SensorCharacteristics sensor_chars_; std::shared_ptr torch_state_; PhysicalDeviceMapPtr physical_device_map_; LogicalCharacteristics logical_chars_; HwlSessionCallback session_callback_; DynamicStreamIdMapType dynamic_stream_id_map_; std::unique_ptr zoom_ratio_mapper_hwl_impl_; }; } // namespace android #endif