Loading services/camera/libcameraservice/Android.mk +2 −1 Original line number Diff line number Diff line Loading @@ -77,7 +77,8 @@ LOCAL_SHARED_LIBRARIES:= \ android.hardware.camera.common@1.0 \ android.hardware.camera.provider@2.4 \ android.hardware.camera.device@1.0 \ android.hardware.camera.device@3.2 android.hardware.camera.device@3.2 \ android.hardware.camera.device@3.3 LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libbinder libcamera_client libfmq Loading services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -324,7 +324,7 @@ status_t StreamingProcessor::recordingStreamNeedsUpdate( streamInfo.width != (uint32_t)params.videoWidth || streamInfo.height != (uint32_t)params.videoHeight || !streamInfo.matchFormat((uint32_t)params.videoFormat) || streamInfo.dataSpace != params.videoDataSpace) { !streamInfo.matchDataSpace(params.videoDataSpace)) { *needsUpdate = true; return res; } Loading Loading @@ -356,7 +356,7 @@ status_t StreamingProcessor::updateRecordingStream(const Parameters ¶ms) { if (streamInfo.width != (uint32_t)params.videoWidth || streamInfo.height != (uint32_t)params.videoHeight || !streamInfo.matchFormat((uint32_t)params.videoFormat) || streamInfo.dataSpace != params.videoDataSpace) { !streamInfo.matchDataSpace(params.videoDataSpace)) { // TODO: Should wait to be sure previous recording has finished res = device->deleteStream(mRecordingStreamId); Loading services/camera/libcameraservice/common/CameraDeviceBase.h +21 −2 Original line number Diff line number Diff line Loading @@ -145,23 +145,42 @@ class CameraDeviceBase : public virtual RefBase { struct StreamInfo { uint32_t width; uint32_t height; uint32_t format; bool formatOverridden; uint32_t originalFormat; android_dataspace dataSpace; bool dataSpaceOverridden; android_dataspace originalDataSpace; StreamInfo() : width(0), height(0), format(0), formatOverridden(false), originalFormat(0), dataSpace(HAL_DATASPACE_UNKNOWN) {} dataSpace(HAL_DATASPACE_UNKNOWN), dataSpaceOverridden(false), originalDataSpace(HAL_DATASPACE_UNKNOWN) {} /** * Check whether the format matches the current or the original one in case * it got overridden. */ bool matchFormat(uint32_t clientFormat) { bool matchFormat(uint32_t clientFormat) const { if ((formatOverridden && (originalFormat == clientFormat)) || (format == clientFormat)) { return true; } return false; } /** * Check whether the dataspace matches the current or the original one in case * it got overridden. */ bool matchDataSpace(android_dataspace clientDataSpace) const { if ((dataSpaceOverridden && (originalDataSpace == clientDataSpace)) || (dataSpace == clientDataSpace)) { return true; } return false; } }; /** Loading services/camera/libcameraservice/device3/Camera3Device.cpp +76 −17 Original line number Diff line number Diff line Loading @@ -154,6 +154,15 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager) { resultQueueRet.description().c_str()); return DEAD_OBJECT; } IF_ALOGV() { session->interfaceChain([]( ::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) { ALOGV("Session interface chain:"); for (auto iface : interfaceChain) { ALOGV(" %s", iface.c_str()); } }); } mInterface = new HalInterface(session, queue); std::string providerType; Loading Loading @@ -460,6 +469,11 @@ int Camera3Device::mapToFrameworkFormat( return static_cast<uint32_t>(pixelFormat); } android_dataspace Camera3Device::mapToFrameworkDataspace( DataspaceFlags dataSpace) { return static_cast<android_dataspace>(dataSpace); } uint64_t Camera3Device::mapConsumerToFrameworkUsage( BufferUsageFlags usage) { return usage; Loading Loading @@ -1382,6 +1396,8 @@ status_t Camera3Device::getStreamInfo(int id, StreamInfo *streamInfo) { streamInfo->dataSpace = mOutputStreams[idx]->getDataSpace(); streamInfo->formatOverridden = mOutputStreams[idx]->isFormatOverridden(); streamInfo->originalFormat = mOutputStreams[idx]->getOriginalFormat(); streamInfo->dataSpaceOverridden = mOutputStreams[idx]->isDataSpaceOverridden(); streamInfo->originalDataSpace = mOutputStreams[idx]->getOriginalDataSpace(); return OK; } Loading Loading @@ -3196,11 +3212,24 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat // Invoke configureStreams HalStreamConfiguration finalConfiguration; device::V3_3::HalStreamConfiguration finalConfiguration; common::V1_0::Status status; auto err = mHidlSession->configureStreams(requestedConfiguration, // See if we have v3.3 HAL sp<device::V3_3::ICameraDeviceSession> hidlSession_3_3; auto castResult = device::V3_3::ICameraDeviceSession::castFrom(mHidlSession); if (castResult.isOk()) { hidlSession_3_3 = castResult; } else { ALOGE("%s: Transaction error when casting ICameraDeviceSession: %s", __FUNCTION__, castResult.description().c_str()); } if (hidlSession_3_3 != nullptr) { // We do; use v3.3 for the call ALOGV("%s: v3.3 device found", __FUNCTION__); auto err = hidlSession_3_3->configureStreams_3_3(requestedConfiguration, [&status, &finalConfiguration] (common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) { (common::V1_0::Status s, const device::V3_3::HalStreamConfiguration& halConfiguration) { finalConfiguration = halConfiguration; status = s; }); Loading @@ -3208,6 +3237,27 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str()); return DEAD_OBJECT; } } else { // We don't; use v3.2 call and construct a v3.3 HalStreamConfiguration ALOGV("%s: v3.2 device found", __FUNCTION__); HalStreamConfiguration finalConfiguration_3_2; auto err = mHidlSession->configureStreams(requestedConfiguration, [&status, &finalConfiguration_3_2] (common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) { finalConfiguration_3_2 = halConfiguration; status = s; }); if (!err.isOk()) { ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str()); return DEAD_OBJECT; } finalConfiguration.streams.resize(finalConfiguration_3_2.streams.size()); for (size_t i = 0; i < finalConfiguration_3_2.streams.size(); i++) { finalConfiguration.streams[i].v3_2 = finalConfiguration_3_2.streams[i]; finalConfiguration.streams[i].overrideDataSpace = requestedConfiguration.streams[i].dataSpace; } } if (status != common::V1_0::Status::OK ) { return CameraProviderManager::mapToStatusT(status); Loading @@ -3223,7 +3273,7 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat size_t realIdx = i; bool found = false; for (size_t idx = 0; idx < finalConfiguration.streams.size(); idx++) { if (finalConfiguration.streams[realIdx].id == streamId) { if (finalConfiguration.streams[realIdx].v3_2.id == streamId) { found = true; break; } Loading @@ -3234,42 +3284,51 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat __FUNCTION__, streamId); return INVALID_OPERATION; } HalStream &src = finalConfiguration.streams[realIdx]; device::V3_3::HalStream &src = finalConfiguration.streams[realIdx]; Camera3Stream* dstStream = Camera3Stream::cast(dst); dstStream->setFormatOverride(false); int overrideFormat = mapToFrameworkFormat(src.overrideFormat); dstStream->setDataSpaceOverride(false); int overrideFormat = mapToFrameworkFormat(src.v3_2.overrideFormat); android_dataspace overrideDataSpace = mapToFrameworkDataspace(src.overrideDataSpace); if (dst->format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { if (dst->format != overrideFormat) { ALOGE("%s: Stream %d: Format override not allowed for format 0x%x", __FUNCTION__, streamId, dst->format); } if (dst->data_space != overrideDataSpace) { ALOGE("%s: Stream %d: DataSpace override not allowed for format 0x%x", __FUNCTION__, streamId, dst->format); } } else { dstStream->setFormatOverride((dst->format != overrideFormat) ? true : false); dstStream->setOriginalFormat(dst->format); dstStream->setDataSpaceOverride((dst->data_space != overrideDataSpace) ? true : false); // Override allowed with IMPLEMENTATION_DEFINED dst->format = overrideFormat; dst->data_space = overrideDataSpace; } if (dst->stream_type == CAMERA3_STREAM_INPUT) { if (src.producerUsage != 0) { if (src.v3_2.producerUsage != 0) { ALOGE("%s: Stream %d: INPUT streams must have 0 for producer usage", __FUNCTION__, streamId); return INVALID_OPERATION; } Camera3Stream::cast(dst)->setUsage( mapConsumerToFrameworkUsage(src.consumerUsage)); dstStream->setUsage( mapConsumerToFrameworkUsage(src.v3_2.consumerUsage)); } else { // OUTPUT if (src.consumerUsage != 0) { if (src.v3_2.consumerUsage != 0) { ALOGE("%s: Stream %d: OUTPUT streams must have 0 for consumer usage", __FUNCTION__, streamId); return INVALID_OPERATION; } Camera3Stream::cast(dst)->setUsage( mapProducerToFrameworkUsage(src.producerUsage)); dstStream->setUsage( mapProducerToFrameworkUsage(src.v3_2.producerUsage)); } dst->max_buffers = src.maxBuffers; dst->max_buffers = src.v3_2.maxBuffers; } return res; Loading services/camera/libcameraservice/device3/Camera3Device.h +3 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <android/hardware/camera/device/3.2/ICameraDevice.h> #include <android/hardware/camera/device/3.2/ICameraDeviceSession.h> #include <android/hardware/camera/device/3.3/ICameraDeviceSession.h> #include <android/hardware/camera/device/3.2/ICameraDeviceCallback.h> #include <fmq/MessageQueue.h> #include <hardware/camera3.h> Loading Loading @@ -595,6 +596,8 @@ class Camera3Device : /*out*/ hardware::camera::device::V3_2::StreamConfigurationMode *mode); static camera3_buffer_status_t mapHidlBufferStatus(hardware::camera::device::V3_2::BufferStatus status); static int mapToFrameworkFormat(hardware::graphics::common::V1_0::PixelFormat pixelFormat); static android_dataspace mapToFrameworkDataspace( hardware::camera::device::V3_2::DataspaceFlags); static uint64_t mapConsumerToFrameworkUsage( hardware::camera::device::V3_2::BufferUsageFlags usage); static uint64_t mapProducerToFrameworkUsage( Loading Loading
services/camera/libcameraservice/Android.mk +2 −1 Original line number Diff line number Diff line Loading @@ -77,7 +77,8 @@ LOCAL_SHARED_LIBRARIES:= \ android.hardware.camera.common@1.0 \ android.hardware.camera.provider@2.4 \ android.hardware.camera.device@1.0 \ android.hardware.camera.device@3.2 android.hardware.camera.device@3.2 \ android.hardware.camera.device@3.3 LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libbinder libcamera_client libfmq Loading
services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -324,7 +324,7 @@ status_t StreamingProcessor::recordingStreamNeedsUpdate( streamInfo.width != (uint32_t)params.videoWidth || streamInfo.height != (uint32_t)params.videoHeight || !streamInfo.matchFormat((uint32_t)params.videoFormat) || streamInfo.dataSpace != params.videoDataSpace) { !streamInfo.matchDataSpace(params.videoDataSpace)) { *needsUpdate = true; return res; } Loading Loading @@ -356,7 +356,7 @@ status_t StreamingProcessor::updateRecordingStream(const Parameters ¶ms) { if (streamInfo.width != (uint32_t)params.videoWidth || streamInfo.height != (uint32_t)params.videoHeight || !streamInfo.matchFormat((uint32_t)params.videoFormat) || streamInfo.dataSpace != params.videoDataSpace) { !streamInfo.matchDataSpace(params.videoDataSpace)) { // TODO: Should wait to be sure previous recording has finished res = device->deleteStream(mRecordingStreamId); Loading
services/camera/libcameraservice/common/CameraDeviceBase.h +21 −2 Original line number Diff line number Diff line Loading @@ -145,23 +145,42 @@ class CameraDeviceBase : public virtual RefBase { struct StreamInfo { uint32_t width; uint32_t height; uint32_t format; bool formatOverridden; uint32_t originalFormat; android_dataspace dataSpace; bool dataSpaceOverridden; android_dataspace originalDataSpace; StreamInfo() : width(0), height(0), format(0), formatOverridden(false), originalFormat(0), dataSpace(HAL_DATASPACE_UNKNOWN) {} dataSpace(HAL_DATASPACE_UNKNOWN), dataSpaceOverridden(false), originalDataSpace(HAL_DATASPACE_UNKNOWN) {} /** * Check whether the format matches the current or the original one in case * it got overridden. */ bool matchFormat(uint32_t clientFormat) { bool matchFormat(uint32_t clientFormat) const { if ((formatOverridden && (originalFormat == clientFormat)) || (format == clientFormat)) { return true; } return false; } /** * Check whether the dataspace matches the current or the original one in case * it got overridden. */ bool matchDataSpace(android_dataspace clientDataSpace) const { if ((dataSpaceOverridden && (originalDataSpace == clientDataSpace)) || (dataSpace == clientDataSpace)) { return true; } return false; } }; /** Loading
services/camera/libcameraservice/device3/Camera3Device.cpp +76 −17 Original line number Diff line number Diff line Loading @@ -154,6 +154,15 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager) { resultQueueRet.description().c_str()); return DEAD_OBJECT; } IF_ALOGV() { session->interfaceChain([]( ::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) { ALOGV("Session interface chain:"); for (auto iface : interfaceChain) { ALOGV(" %s", iface.c_str()); } }); } mInterface = new HalInterface(session, queue); std::string providerType; Loading Loading @@ -460,6 +469,11 @@ int Camera3Device::mapToFrameworkFormat( return static_cast<uint32_t>(pixelFormat); } android_dataspace Camera3Device::mapToFrameworkDataspace( DataspaceFlags dataSpace) { return static_cast<android_dataspace>(dataSpace); } uint64_t Camera3Device::mapConsumerToFrameworkUsage( BufferUsageFlags usage) { return usage; Loading Loading @@ -1382,6 +1396,8 @@ status_t Camera3Device::getStreamInfo(int id, StreamInfo *streamInfo) { streamInfo->dataSpace = mOutputStreams[idx]->getDataSpace(); streamInfo->formatOverridden = mOutputStreams[idx]->isFormatOverridden(); streamInfo->originalFormat = mOutputStreams[idx]->getOriginalFormat(); streamInfo->dataSpaceOverridden = mOutputStreams[idx]->isDataSpaceOverridden(); streamInfo->originalDataSpace = mOutputStreams[idx]->getOriginalDataSpace(); return OK; } Loading Loading @@ -3196,11 +3212,24 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat // Invoke configureStreams HalStreamConfiguration finalConfiguration; device::V3_3::HalStreamConfiguration finalConfiguration; common::V1_0::Status status; auto err = mHidlSession->configureStreams(requestedConfiguration, // See if we have v3.3 HAL sp<device::V3_3::ICameraDeviceSession> hidlSession_3_3; auto castResult = device::V3_3::ICameraDeviceSession::castFrom(mHidlSession); if (castResult.isOk()) { hidlSession_3_3 = castResult; } else { ALOGE("%s: Transaction error when casting ICameraDeviceSession: %s", __FUNCTION__, castResult.description().c_str()); } if (hidlSession_3_3 != nullptr) { // We do; use v3.3 for the call ALOGV("%s: v3.3 device found", __FUNCTION__); auto err = hidlSession_3_3->configureStreams_3_3(requestedConfiguration, [&status, &finalConfiguration] (common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) { (common::V1_0::Status s, const device::V3_3::HalStreamConfiguration& halConfiguration) { finalConfiguration = halConfiguration; status = s; }); Loading @@ -3208,6 +3237,27 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str()); return DEAD_OBJECT; } } else { // We don't; use v3.2 call and construct a v3.3 HalStreamConfiguration ALOGV("%s: v3.2 device found", __FUNCTION__); HalStreamConfiguration finalConfiguration_3_2; auto err = mHidlSession->configureStreams(requestedConfiguration, [&status, &finalConfiguration_3_2] (common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) { finalConfiguration_3_2 = halConfiguration; status = s; }); if (!err.isOk()) { ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str()); return DEAD_OBJECT; } finalConfiguration.streams.resize(finalConfiguration_3_2.streams.size()); for (size_t i = 0; i < finalConfiguration_3_2.streams.size(); i++) { finalConfiguration.streams[i].v3_2 = finalConfiguration_3_2.streams[i]; finalConfiguration.streams[i].overrideDataSpace = requestedConfiguration.streams[i].dataSpace; } } if (status != common::V1_0::Status::OK ) { return CameraProviderManager::mapToStatusT(status); Loading @@ -3223,7 +3273,7 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat size_t realIdx = i; bool found = false; for (size_t idx = 0; idx < finalConfiguration.streams.size(); idx++) { if (finalConfiguration.streams[realIdx].id == streamId) { if (finalConfiguration.streams[realIdx].v3_2.id == streamId) { found = true; break; } Loading @@ -3234,42 +3284,51 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat __FUNCTION__, streamId); return INVALID_OPERATION; } HalStream &src = finalConfiguration.streams[realIdx]; device::V3_3::HalStream &src = finalConfiguration.streams[realIdx]; Camera3Stream* dstStream = Camera3Stream::cast(dst); dstStream->setFormatOverride(false); int overrideFormat = mapToFrameworkFormat(src.overrideFormat); dstStream->setDataSpaceOverride(false); int overrideFormat = mapToFrameworkFormat(src.v3_2.overrideFormat); android_dataspace overrideDataSpace = mapToFrameworkDataspace(src.overrideDataSpace); if (dst->format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { if (dst->format != overrideFormat) { ALOGE("%s: Stream %d: Format override not allowed for format 0x%x", __FUNCTION__, streamId, dst->format); } if (dst->data_space != overrideDataSpace) { ALOGE("%s: Stream %d: DataSpace override not allowed for format 0x%x", __FUNCTION__, streamId, dst->format); } } else { dstStream->setFormatOverride((dst->format != overrideFormat) ? true : false); dstStream->setOriginalFormat(dst->format); dstStream->setDataSpaceOverride((dst->data_space != overrideDataSpace) ? true : false); // Override allowed with IMPLEMENTATION_DEFINED dst->format = overrideFormat; dst->data_space = overrideDataSpace; } if (dst->stream_type == CAMERA3_STREAM_INPUT) { if (src.producerUsage != 0) { if (src.v3_2.producerUsage != 0) { ALOGE("%s: Stream %d: INPUT streams must have 0 for producer usage", __FUNCTION__, streamId); return INVALID_OPERATION; } Camera3Stream::cast(dst)->setUsage( mapConsumerToFrameworkUsage(src.consumerUsage)); dstStream->setUsage( mapConsumerToFrameworkUsage(src.v3_2.consumerUsage)); } else { // OUTPUT if (src.consumerUsage != 0) { if (src.v3_2.consumerUsage != 0) { ALOGE("%s: Stream %d: OUTPUT streams must have 0 for consumer usage", __FUNCTION__, streamId); return INVALID_OPERATION; } Camera3Stream::cast(dst)->setUsage( mapProducerToFrameworkUsage(src.producerUsage)); dstStream->setUsage( mapProducerToFrameworkUsage(src.v3_2.producerUsage)); } dst->max_buffers = src.maxBuffers; dst->max_buffers = src.v3_2.maxBuffers; } return res; Loading
services/camera/libcameraservice/device3/Camera3Device.h +3 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <android/hardware/camera/device/3.2/ICameraDevice.h> #include <android/hardware/camera/device/3.2/ICameraDeviceSession.h> #include <android/hardware/camera/device/3.3/ICameraDeviceSession.h> #include <android/hardware/camera/device/3.2/ICameraDeviceCallback.h> #include <fmq/MessageQueue.h> #include <hardware/camera3.h> Loading Loading @@ -595,6 +596,8 @@ class Camera3Device : /*out*/ hardware::camera::device::V3_2::StreamConfigurationMode *mode); static camera3_buffer_status_t mapHidlBufferStatus(hardware::camera::device::V3_2::BufferStatus status); static int mapToFrameworkFormat(hardware::graphics::common::V1_0::PixelFormat pixelFormat); static android_dataspace mapToFrameworkDataspace( hardware::camera::device::V3_2::DataspaceFlags); static uint64_t mapConsumerToFrameworkUsage( hardware::camera::device::V3_2::BufferUsageFlags usage); static uint64_t mapProducerToFrameworkUsage( Loading