Loading services/camera/virtualcamera/VirtualCameraDevice.cc +38 −12 Original line number Diff line number Diff line Loading @@ -124,9 +124,9 @@ bool isSupportedOutputFormat(const PixelFormat pixelFormat) { kOutputFormats.end(); } std::vector<MetadataBuilder::FpsRange> fpsRangesForInputConfig( std::vector<FpsRange> fpsRangesForInputConfig( const std::vector<SupportedStreamConfiguration>& configs) { std::set<MetadataBuilder::FpsRange> availableRanges; std::set<FpsRange> availableRanges; for (const SupportedStreamConfiguration& config : configs) { availableRanges.insert({.minFps = kMinFps, .maxFps = config.maxFps}); Loading @@ -141,8 +141,7 @@ std::vector<MetadataBuilder::FpsRange> fpsRangesForInputConfig( availableRanges.insert({.minFps = 30, .maxFps = 30}); } return std::vector<MetadataBuilder::FpsRange>(availableRanges.begin(), availableRanges.end()); return std::vector<FpsRange>(availableRanges.begin(), availableRanges.end()); } std::optional<Resolution> getMaxResolution( Loading Loading @@ -301,14 +300,41 @@ std::optional<CameraMetadata> initCameraCharacteristics( ANDROID_JPEG_THUMBNAIL_QUALITY, ANDROID_NOISE_REDUCTION_MODE, ANDROID_STATISTICS_FACE_DETECT_MODE}) .setAvailableResultKeys( {ANDROID_COLOR_CORRECTION_ABERRATION_MODE, ANDROID_CONTROL_AE_MODE, ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, ANDROID_CONTROL_AF_MODE, ANDROID_CONTROL_AWB_MODE, ANDROID_CONTROL_EFFECT_MODE, ANDROID_CONTROL_MODE, ANDROID_FLASH_MODE, ANDROID_FLASH_STATE, ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, ANDROID_JPEG_QUALITY, ANDROID_JPEG_THUMBNAIL_QUALITY, ANDROID_LENS_FOCAL_LENGTH, ANDROID_SENSOR_TIMESTAMP, ANDROID_NOISE_REDUCTION_MODE}) .setAvailableResultKeys({ ANDROID_COLOR_CORRECTION_ABERRATION_MODE, ANDROID_CONTROL_AE_ANTIBANDING_MODE, ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, ANDROID_CONTROL_AE_LOCK, ANDROID_CONTROL_AE_MODE, ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, ANDROID_CONTROL_AE_STATE, ANDROID_CONTROL_AE_TARGET_FPS_RANGE, ANDROID_CONTROL_AF_MODE, ANDROID_CONTROL_AF_STATE, ANDROID_CONTROL_AF_TRIGGER, ANDROID_CONTROL_AWB_LOCK, ANDROID_CONTROL_AWB_MODE, ANDROID_CONTROL_AWB_STATE, ANDROID_CONTROL_CAPTURE_INTENT, ANDROID_CONTROL_EFFECT_MODE, ANDROID_CONTROL_MODE, ANDROID_CONTROL_SCENE_MODE, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, ANDROID_STATISTICS_FACE_DETECT_MODE, ANDROID_FLASH_MODE, ANDROID_FLASH_STATE, ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, ANDROID_JPEG_QUALITY, ANDROID_JPEG_THUMBNAIL_QUALITY, ANDROID_LENS_FOCAL_LENGTH, ANDROID_LENS_OPTICAL_STABILIZATION_MODE, ANDROID_NOISE_REDUCTION_MODE, ANDROID_REQUEST_PIPELINE_DEPTH, ANDROID_SENSOR_TIMESTAMP, ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, ANDROID_STATISTICS_SCENE_FLICKER, }) .setAvailableCapabilities( {ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE}); Loading services/camera/virtualcamera/VirtualCameraDevice.h +4 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include "aidl/android/companion/virtualcamera/SupportedStreamConfiguration.h" #include "aidl/android/companion/virtualcamera/VirtualCameraConfiguration.h" #include "aidl/android/hardware/camera/device/BnCameraDevice.h" #include "system/camera_metadata.h" #include "util/Util.h" namespace android { Loading Loading @@ -121,6 +122,9 @@ class VirtualCameraDevice // Default JPEG compression quality. static constexpr uint8_t kDefaultJpegQuality = 80; static constexpr camera_metadata_enum_android_control_capture_intent_t kDefaultCaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; private: std::shared_ptr<VirtualCameraDevice> sharedFromThis(); Loading services/camera/virtualcamera/VirtualCameraRenderThread.cc +34 −2 Original line number Diff line number Diff line Loading @@ -92,30 +92,62 @@ CameraMetadata createCaptureResultMetadata( const std::chrono::nanoseconds timestamp, const RequestSettings& requestSettings, const Resolution reportedSensorSize) { std::unique_ptr<CameraMetadata> metadata = // All of the keys used in the response needs to be referenced in // availableResultKeys in CameraCharacteristics (see initCameraCharacteristics // in VirtualCameraDevice.cc). MetadataBuilder builder = MetadataBuilder() .setAberrationCorrectionMode( ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF) .setControlAeAvailableAntibandingModes( {ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF}) .setControlAeAntibandingMode(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF) .setControlAeExposureCompensation(0) .setControlAeLockAvailable(false) .setControlAeLock(ANDROID_CONTROL_AE_LOCK_OFF) .setControlAeMode(ANDROID_CONTROL_AE_MODE_ON) .setControlAePrecaptureTrigger( ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE) .setControlAeState(ANDROID_CONTROL_AE_STATE_INACTIVE) .setControlAfMode(ANDROID_CONTROL_AF_MODE_OFF) .setControlAfTrigger(ANDROID_CONTROL_AF_TRIGGER_IDLE) .setControlAfState(ANDROID_CONTROL_AF_STATE_INACTIVE) .setControlAwbMode(ANDROID_CONTROL_AWB_MODE_AUTO) .setControlAwbLock(ANDROID_CONTROL_AWB_LOCK_OFF) .setControlAwbState(ANDROID_CONTROL_AWB_STATE_INACTIVE) .setControlCaptureIntent(requestSettings.captureIntent) .setControlEffectMode(ANDROID_CONTROL_EFFECT_MODE_OFF) .setControlMode(ANDROID_CONTROL_MODE_AUTO) .setControlSceneMode(ANDROID_CONTROL_SCENE_MODE_DISABLED) .setControlVideoStabilizationMode( ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF) .setCropRegion(0, 0, reportedSensorSize.width, reportedSensorSize.height) .setFaceDetectMode(ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) .setFlashState(ANDROID_FLASH_STATE_UNAVAILABLE) .setFlashMode(ANDROID_FLASH_MODE_OFF) .setFocalLength(VirtualCameraDevice::kFocalLength) .setJpegQuality(requestSettings.jpegQuality) .setJpegThumbnailSize(requestSettings.thumbnailResolution.width, requestSettings.thumbnailResolution.height) .setJpegThumbnailQuality(requestSettings.thumbnailJpegQuality) .setLensOpticalStabilizationMode( ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF) .setNoiseReductionMode(ANDROID_NOISE_REDUCTION_MODE_OFF) .setPipelineDepth(kPipelineDepth) .setSensorTimestamp(timestamp) .build(); .setStatisticsHotPixelMapMode( ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF) .setStatisticsLensShadingMapMode( ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF) .setStatisticsSceneFlicker(ANDROID_STATISTICS_SCENE_FLICKER_NONE); if (requestSettings.fpsRange.has_value()) { builder.setControlAeTargetFpsRange(requestSettings.fpsRange.value()); } std::unique_ptr<CameraMetadata> metadata = builder.build(); if (metadata == nullptr) { ALOGE("%s: Failed to build capture result metadata", __func__); return CameraMetadata(); Loading services/camera/virtualcamera/VirtualCameraRenderThread.h +4 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ #include "util/EglFramebuffer.h" #include "util/EglProgram.h" #include "util/EglSurfaceTexture.h" #include "util/MetadataUtil.h" #include "util/Util.h" namespace android { Loading @@ -58,6 +59,9 @@ struct RequestSettings { int jpegQuality = VirtualCameraDevice::kDefaultJpegQuality; Resolution thumbnailResolution = Resolution(0, 0); int thumbnailJpegQuality = VirtualCameraDevice::kDefaultJpegQuality; std::optional<FpsRange> fpsRange = {}; camera_metadata_enum_android_control_capture_intent_t captureIntent = VirtualCameraDevice::kDefaultCaptureIntent; }; // Represents single capture request to fill set of buffers. Loading services/camera/virtualcamera/VirtualCameraSession.cc +5 −2 Original line number Diff line number Diff line Loading @@ -148,7 +148,7 @@ CameraMetadata createDefaultRequestSettings( .setControlMode(ANDROID_CONTROL_MODE_AUTO) .setControlAeMode(ANDROID_CONTROL_AE_MODE_ON) .setControlAeExposureCompensation(0) .setControlAeTargetFpsRange(maxFps, maxFps) .setControlAeTargetFpsRange(FpsRange{maxFps, maxFps}) .setControlAeAntibandingMode(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO) .setControlAePrecaptureTrigger( ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE) Loading Loading @@ -260,7 +260,10 @@ RequestSettings createSettingsFromMetadata(const CameraMetadata& metadata) { .thumbnailResolution = getJpegThumbnailSize(metadata).value_or(Resolution(0, 0)), .thumbnailJpegQuality = getJpegThumbnailQuality(metadata).value_or( VirtualCameraDevice::kDefaultJpegQuality)}; VirtualCameraDevice::kDefaultJpegQuality), .fpsRange = getFpsRange(metadata), .captureIntent = getCaptureIntent(metadata).value_or( ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW)}; } } // namespace Loading Loading
services/camera/virtualcamera/VirtualCameraDevice.cc +38 −12 Original line number Diff line number Diff line Loading @@ -124,9 +124,9 @@ bool isSupportedOutputFormat(const PixelFormat pixelFormat) { kOutputFormats.end(); } std::vector<MetadataBuilder::FpsRange> fpsRangesForInputConfig( std::vector<FpsRange> fpsRangesForInputConfig( const std::vector<SupportedStreamConfiguration>& configs) { std::set<MetadataBuilder::FpsRange> availableRanges; std::set<FpsRange> availableRanges; for (const SupportedStreamConfiguration& config : configs) { availableRanges.insert({.minFps = kMinFps, .maxFps = config.maxFps}); Loading @@ -141,8 +141,7 @@ std::vector<MetadataBuilder::FpsRange> fpsRangesForInputConfig( availableRanges.insert({.minFps = 30, .maxFps = 30}); } return std::vector<MetadataBuilder::FpsRange>(availableRanges.begin(), availableRanges.end()); return std::vector<FpsRange>(availableRanges.begin(), availableRanges.end()); } std::optional<Resolution> getMaxResolution( Loading Loading @@ -301,14 +300,41 @@ std::optional<CameraMetadata> initCameraCharacteristics( ANDROID_JPEG_THUMBNAIL_QUALITY, ANDROID_NOISE_REDUCTION_MODE, ANDROID_STATISTICS_FACE_DETECT_MODE}) .setAvailableResultKeys( {ANDROID_COLOR_CORRECTION_ABERRATION_MODE, ANDROID_CONTROL_AE_MODE, ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, ANDROID_CONTROL_AF_MODE, ANDROID_CONTROL_AWB_MODE, ANDROID_CONTROL_EFFECT_MODE, ANDROID_CONTROL_MODE, ANDROID_FLASH_MODE, ANDROID_FLASH_STATE, ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, ANDROID_JPEG_QUALITY, ANDROID_JPEG_THUMBNAIL_QUALITY, ANDROID_LENS_FOCAL_LENGTH, ANDROID_SENSOR_TIMESTAMP, ANDROID_NOISE_REDUCTION_MODE}) .setAvailableResultKeys({ ANDROID_COLOR_CORRECTION_ABERRATION_MODE, ANDROID_CONTROL_AE_ANTIBANDING_MODE, ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, ANDROID_CONTROL_AE_LOCK, ANDROID_CONTROL_AE_MODE, ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, ANDROID_CONTROL_AE_STATE, ANDROID_CONTROL_AE_TARGET_FPS_RANGE, ANDROID_CONTROL_AF_MODE, ANDROID_CONTROL_AF_STATE, ANDROID_CONTROL_AF_TRIGGER, ANDROID_CONTROL_AWB_LOCK, ANDROID_CONTROL_AWB_MODE, ANDROID_CONTROL_AWB_STATE, ANDROID_CONTROL_CAPTURE_INTENT, ANDROID_CONTROL_EFFECT_MODE, ANDROID_CONTROL_MODE, ANDROID_CONTROL_SCENE_MODE, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, ANDROID_STATISTICS_FACE_DETECT_MODE, ANDROID_FLASH_MODE, ANDROID_FLASH_STATE, ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, ANDROID_JPEG_QUALITY, ANDROID_JPEG_THUMBNAIL_QUALITY, ANDROID_LENS_FOCAL_LENGTH, ANDROID_LENS_OPTICAL_STABILIZATION_MODE, ANDROID_NOISE_REDUCTION_MODE, ANDROID_REQUEST_PIPELINE_DEPTH, ANDROID_SENSOR_TIMESTAMP, ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, ANDROID_STATISTICS_SCENE_FLICKER, }) .setAvailableCapabilities( {ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE}); Loading
services/camera/virtualcamera/VirtualCameraDevice.h +4 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include "aidl/android/companion/virtualcamera/SupportedStreamConfiguration.h" #include "aidl/android/companion/virtualcamera/VirtualCameraConfiguration.h" #include "aidl/android/hardware/camera/device/BnCameraDevice.h" #include "system/camera_metadata.h" #include "util/Util.h" namespace android { Loading Loading @@ -121,6 +122,9 @@ class VirtualCameraDevice // Default JPEG compression quality. static constexpr uint8_t kDefaultJpegQuality = 80; static constexpr camera_metadata_enum_android_control_capture_intent_t kDefaultCaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; private: std::shared_ptr<VirtualCameraDevice> sharedFromThis(); Loading
services/camera/virtualcamera/VirtualCameraRenderThread.cc +34 −2 Original line number Diff line number Diff line Loading @@ -92,30 +92,62 @@ CameraMetadata createCaptureResultMetadata( const std::chrono::nanoseconds timestamp, const RequestSettings& requestSettings, const Resolution reportedSensorSize) { std::unique_ptr<CameraMetadata> metadata = // All of the keys used in the response needs to be referenced in // availableResultKeys in CameraCharacteristics (see initCameraCharacteristics // in VirtualCameraDevice.cc). MetadataBuilder builder = MetadataBuilder() .setAberrationCorrectionMode( ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF) .setControlAeAvailableAntibandingModes( {ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF}) .setControlAeAntibandingMode(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF) .setControlAeExposureCompensation(0) .setControlAeLockAvailable(false) .setControlAeLock(ANDROID_CONTROL_AE_LOCK_OFF) .setControlAeMode(ANDROID_CONTROL_AE_MODE_ON) .setControlAePrecaptureTrigger( ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE) .setControlAeState(ANDROID_CONTROL_AE_STATE_INACTIVE) .setControlAfMode(ANDROID_CONTROL_AF_MODE_OFF) .setControlAfTrigger(ANDROID_CONTROL_AF_TRIGGER_IDLE) .setControlAfState(ANDROID_CONTROL_AF_STATE_INACTIVE) .setControlAwbMode(ANDROID_CONTROL_AWB_MODE_AUTO) .setControlAwbLock(ANDROID_CONTROL_AWB_LOCK_OFF) .setControlAwbState(ANDROID_CONTROL_AWB_STATE_INACTIVE) .setControlCaptureIntent(requestSettings.captureIntent) .setControlEffectMode(ANDROID_CONTROL_EFFECT_MODE_OFF) .setControlMode(ANDROID_CONTROL_MODE_AUTO) .setControlSceneMode(ANDROID_CONTROL_SCENE_MODE_DISABLED) .setControlVideoStabilizationMode( ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF) .setCropRegion(0, 0, reportedSensorSize.width, reportedSensorSize.height) .setFaceDetectMode(ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) .setFlashState(ANDROID_FLASH_STATE_UNAVAILABLE) .setFlashMode(ANDROID_FLASH_MODE_OFF) .setFocalLength(VirtualCameraDevice::kFocalLength) .setJpegQuality(requestSettings.jpegQuality) .setJpegThumbnailSize(requestSettings.thumbnailResolution.width, requestSettings.thumbnailResolution.height) .setJpegThumbnailQuality(requestSettings.thumbnailJpegQuality) .setLensOpticalStabilizationMode( ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF) .setNoiseReductionMode(ANDROID_NOISE_REDUCTION_MODE_OFF) .setPipelineDepth(kPipelineDepth) .setSensorTimestamp(timestamp) .build(); .setStatisticsHotPixelMapMode( ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF) .setStatisticsLensShadingMapMode( ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF) .setStatisticsSceneFlicker(ANDROID_STATISTICS_SCENE_FLICKER_NONE); if (requestSettings.fpsRange.has_value()) { builder.setControlAeTargetFpsRange(requestSettings.fpsRange.value()); } std::unique_ptr<CameraMetadata> metadata = builder.build(); if (metadata == nullptr) { ALOGE("%s: Failed to build capture result metadata", __func__); return CameraMetadata(); Loading
services/camera/virtualcamera/VirtualCameraRenderThread.h +4 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ #include "util/EglFramebuffer.h" #include "util/EglProgram.h" #include "util/EglSurfaceTexture.h" #include "util/MetadataUtil.h" #include "util/Util.h" namespace android { Loading @@ -58,6 +59,9 @@ struct RequestSettings { int jpegQuality = VirtualCameraDevice::kDefaultJpegQuality; Resolution thumbnailResolution = Resolution(0, 0); int thumbnailJpegQuality = VirtualCameraDevice::kDefaultJpegQuality; std::optional<FpsRange> fpsRange = {}; camera_metadata_enum_android_control_capture_intent_t captureIntent = VirtualCameraDevice::kDefaultCaptureIntent; }; // Represents single capture request to fill set of buffers. Loading
services/camera/virtualcamera/VirtualCameraSession.cc +5 −2 Original line number Diff line number Diff line Loading @@ -148,7 +148,7 @@ CameraMetadata createDefaultRequestSettings( .setControlMode(ANDROID_CONTROL_MODE_AUTO) .setControlAeMode(ANDROID_CONTROL_AE_MODE_ON) .setControlAeExposureCompensation(0) .setControlAeTargetFpsRange(maxFps, maxFps) .setControlAeTargetFpsRange(FpsRange{maxFps, maxFps}) .setControlAeAntibandingMode(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO) .setControlAePrecaptureTrigger( ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE) Loading Loading @@ -260,7 +260,10 @@ RequestSettings createSettingsFromMetadata(const CameraMetadata& metadata) { .thumbnailResolution = getJpegThumbnailSize(metadata).value_or(Resolution(0, 0)), .thumbnailJpegQuality = getJpegThumbnailQuality(metadata).value_or( VirtualCameraDevice::kDefaultJpegQuality)}; VirtualCameraDevice::kDefaultJpegQuality), .fpsRange = getFpsRange(metadata), .captureIntent = getCaptureIntent(metadata).value_or( ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW)}; } } // namespace Loading