Loading services/camera/libcameraservice/api2/CameraDeviceClient.cpp +10 −5 Original line number Diff line number Diff line Loading @@ -661,7 +661,8 @@ binder::Status CameraDeviceClient::createStream( } sp<Surface> surface; res = createSurfaceFromGbp(streamInfo, isStreamInfoValid, surface, bufferProducer); res = createSurfaceFromGbp(streamInfo, isStreamInfoValid, surface, bufferProducer, physicalCameraId); if (!res.isOk()) return res; Loading Loading @@ -889,6 +890,8 @@ binder::Status CameraDeviceClient::updateOutputConfiguration(int streamId, const std::vector<sp<IGraphicBufferProducer> >& bufferProducers = outputConfiguration.getGraphicBufferProducers(); String8 physicalCameraId(outputConfiguration.getPhysicalCameraId()); auto producerCount = bufferProducers.size(); if (producerCount == 0) { ALOGE("%s: bufferProducers must not be empty", __FUNCTION__); Loading Loading @@ -942,7 +945,7 @@ binder::Status CameraDeviceClient::updateOutputConfiguration(int streamId, OutputStreamInfo outInfo; sp<Surface> surface; res = createSurfaceFromGbp(outInfo, /*isStreamInfoValid*/ false, surface, newOutputsMap.valueAt(i)); newOutputsMap.valueAt(i), physicalCameraId); if (!res.isOk()) return res; Loading Loading @@ -1021,7 +1024,8 @@ bool CameraDeviceClient::isPublicFormat(int32_t format) binder::Status CameraDeviceClient::createSurfaceFromGbp( OutputStreamInfo& streamInfo, bool isStreamInfoValid, sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp) { sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp, const String8& physicalId) { // bufferProducer must be non-null if (gbp == nullptr) { Loading Loading @@ -1098,7 +1102,7 @@ binder::Status CameraDeviceClient::createSurfaceFromGbp( // Round dimensions to the nearest dimensions available for this format if (flexibleConsumer && isPublicFormat(format) && !CameraDeviceClient::roundBufferDimensionNearest(width, height, format, dataSpace, mDevice->info(), /*out*/&width, /*out*/&height)) { format, dataSpace, mDevice->info(physicalId), /*out*/&width, /*out*/&height)) { String8 msg = String8::format("Camera %s: No supported stream configurations with " "format %#x defined, failed to create output stream", mCameraIdStr.string(), format); Loading Loading @@ -1468,6 +1472,7 @@ binder::Status CameraDeviceClient::finalizeOutputConfigurations(int32_t streamId const std::vector<sp<IGraphicBufferProducer> >& bufferProducers = outputConfiguration.getGraphicBufferProducers(); String8 physicalId(outputConfiguration.getPhysicalCameraId()); if (bufferProducers.size() == 0) { ALOGE("%s: bufferProducers must not be empty", __FUNCTION__); Loading Loading @@ -1521,7 +1526,7 @@ binder::Status CameraDeviceClient::finalizeOutputConfigurations(int32_t streamId sp<Surface> surface; res = createSurfaceFromGbp(mStreamInfoMap[streamId], true /*isStreamInfoValid*/, surface, bufferProducer); surface, bufferProducer, physicalId); if (!res.isOk()) return res; Loading services/camera/libcameraservice/api2/CameraDeviceClient.h +2 −1 Original line number Diff line number Diff line Loading @@ -258,7 +258,8 @@ private: // Create a Surface from an IGraphicBufferProducer. Returns error if // IGraphicBufferProducer's property doesn't match with streamInfo binder::Status createSurfaceFromGbp(OutputStreamInfo& streamInfo, bool isStreamInfoValid, sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp); sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp, const String8& physicalCameraId); // Utility method to insert the surface into SurfaceMap Loading services/camera/libcameraservice/common/CameraDeviceBase.h +4 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,10 @@ class CameraDeviceBase : public virtual RefBase { * The device's static characteristics metadata buffer */ virtual const CameraMetadata& info() const = 0; /** * The physical camera device's static characteristics metadata buffer */ virtual const CameraMetadata& info(const String8& physicalId) const = 0; struct PhysicalCameraSettings { std::string cameraId; Loading services/camera/libcameraservice/device3/Camera3Device.cpp +32 −3 Original line number Diff line number Diff line Loading @@ -121,11 +121,25 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const Stri res = manager->getCameraCharacteristics(mId.string(), &mDeviceInfo); if (res != OK) { SET_ERR_L("Could not retrive camera characteristics: %s (%d)", strerror(-res), res); SET_ERR_L("Could not retrieve camera characteristics: %s (%d)", strerror(-res), res); session->close(); return res; } std::vector<std::string> physicalCameraIds; bool isLogical = CameraProviderManager::isLogicalCamera(mDeviceInfo, &physicalCameraIds); if (isLogical) { for (auto& physicalId : physicalCameraIds) { res = manager->getCameraCharacteristics(physicalId, &mPhysicalDeviceInfoMap[physicalId]); if (res != OK) { SET_ERR_L("Could not retrieve camera %s characteristics: %s (%d)", physicalId.c_str(), strerror(-res), res); session->close(); return res; } } } std::shared_ptr<RequestMetadataQueue> queue; auto requestQueueRet = session->getCaptureRequestMetadataQueue( [&queue](const auto& descriptor) { Loading Loading @@ -719,7 +733,7 @@ status_t Camera3Device::dump(int fd, const Vector<String16> &args) { return OK; } const CameraMetadata& Camera3Device::info() const { const CameraMetadata& Camera3Device::info(const String8& physicalId) const { ALOGVV("%s: E", __FUNCTION__); if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED || mStatus == STATUS_ERROR)) { Loading @@ -727,7 +741,22 @@ const CameraMetadata& Camera3Device::info() const { mStatus == STATUS_ERROR ? "when in error state" : "before init"); } if (physicalId.isEmpty()) { return mDeviceInfo; } else { std::string id(physicalId.c_str()); if (mPhysicalDeviceInfoMap.find(id) != mPhysicalDeviceInfoMap.end()) { return mPhysicalDeviceInfoMap.at(id); } else { ALOGE("%s: Invalid physical camera id %s", __FUNCTION__, physicalId.c_str()); return mDeviceInfo; } } } const CameraMetadata& Camera3Device::info() const { String8 emptyId; return info(emptyId); } status_t Camera3Device::checkStatusOkToCaptureLocked() { Loading services/camera/libcameraservice/device3/Camera3Device.h +2 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,7 @@ class Camera3Device : status_t disconnect() override; status_t dump(int fd, const Vector<String16> &args) override; const CameraMetadata& info() const override; const CameraMetadata& info(const String8& physicalId) const override; // Capture and setStreamingRequest will configure streams if currently in // idle state Loading Loading @@ -379,6 +380,7 @@ class Camera3Device : sp<HalInterface> mInterface; CameraMetadata mDeviceInfo; std::unordered_map<std::string, CameraMetadata> mPhysicalDeviceInfoMap; CameraMetadata mRequestTemplateCache[CAMERA3_TEMPLATE_COUNT]; Loading Loading
services/camera/libcameraservice/api2/CameraDeviceClient.cpp +10 −5 Original line number Diff line number Diff line Loading @@ -661,7 +661,8 @@ binder::Status CameraDeviceClient::createStream( } sp<Surface> surface; res = createSurfaceFromGbp(streamInfo, isStreamInfoValid, surface, bufferProducer); res = createSurfaceFromGbp(streamInfo, isStreamInfoValid, surface, bufferProducer, physicalCameraId); if (!res.isOk()) return res; Loading Loading @@ -889,6 +890,8 @@ binder::Status CameraDeviceClient::updateOutputConfiguration(int streamId, const std::vector<sp<IGraphicBufferProducer> >& bufferProducers = outputConfiguration.getGraphicBufferProducers(); String8 physicalCameraId(outputConfiguration.getPhysicalCameraId()); auto producerCount = bufferProducers.size(); if (producerCount == 0) { ALOGE("%s: bufferProducers must not be empty", __FUNCTION__); Loading Loading @@ -942,7 +945,7 @@ binder::Status CameraDeviceClient::updateOutputConfiguration(int streamId, OutputStreamInfo outInfo; sp<Surface> surface; res = createSurfaceFromGbp(outInfo, /*isStreamInfoValid*/ false, surface, newOutputsMap.valueAt(i)); newOutputsMap.valueAt(i), physicalCameraId); if (!res.isOk()) return res; Loading Loading @@ -1021,7 +1024,8 @@ bool CameraDeviceClient::isPublicFormat(int32_t format) binder::Status CameraDeviceClient::createSurfaceFromGbp( OutputStreamInfo& streamInfo, bool isStreamInfoValid, sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp) { sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp, const String8& physicalId) { // bufferProducer must be non-null if (gbp == nullptr) { Loading Loading @@ -1098,7 +1102,7 @@ binder::Status CameraDeviceClient::createSurfaceFromGbp( // Round dimensions to the nearest dimensions available for this format if (flexibleConsumer && isPublicFormat(format) && !CameraDeviceClient::roundBufferDimensionNearest(width, height, format, dataSpace, mDevice->info(), /*out*/&width, /*out*/&height)) { format, dataSpace, mDevice->info(physicalId), /*out*/&width, /*out*/&height)) { String8 msg = String8::format("Camera %s: No supported stream configurations with " "format %#x defined, failed to create output stream", mCameraIdStr.string(), format); Loading Loading @@ -1468,6 +1472,7 @@ binder::Status CameraDeviceClient::finalizeOutputConfigurations(int32_t streamId const std::vector<sp<IGraphicBufferProducer> >& bufferProducers = outputConfiguration.getGraphicBufferProducers(); String8 physicalId(outputConfiguration.getPhysicalCameraId()); if (bufferProducers.size() == 0) { ALOGE("%s: bufferProducers must not be empty", __FUNCTION__); Loading Loading @@ -1521,7 +1526,7 @@ binder::Status CameraDeviceClient::finalizeOutputConfigurations(int32_t streamId sp<Surface> surface; res = createSurfaceFromGbp(mStreamInfoMap[streamId], true /*isStreamInfoValid*/, surface, bufferProducer); surface, bufferProducer, physicalId); if (!res.isOk()) return res; Loading
services/camera/libcameraservice/api2/CameraDeviceClient.h +2 −1 Original line number Diff line number Diff line Loading @@ -258,7 +258,8 @@ private: // Create a Surface from an IGraphicBufferProducer. Returns error if // IGraphicBufferProducer's property doesn't match with streamInfo binder::Status createSurfaceFromGbp(OutputStreamInfo& streamInfo, bool isStreamInfoValid, sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp); sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp, const String8& physicalCameraId); // Utility method to insert the surface into SurfaceMap Loading
services/camera/libcameraservice/common/CameraDeviceBase.h +4 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,10 @@ class CameraDeviceBase : public virtual RefBase { * The device's static characteristics metadata buffer */ virtual const CameraMetadata& info() const = 0; /** * The physical camera device's static characteristics metadata buffer */ virtual const CameraMetadata& info(const String8& physicalId) const = 0; struct PhysicalCameraSettings { std::string cameraId; Loading
services/camera/libcameraservice/device3/Camera3Device.cpp +32 −3 Original line number Diff line number Diff line Loading @@ -121,11 +121,25 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const Stri res = manager->getCameraCharacteristics(mId.string(), &mDeviceInfo); if (res != OK) { SET_ERR_L("Could not retrive camera characteristics: %s (%d)", strerror(-res), res); SET_ERR_L("Could not retrieve camera characteristics: %s (%d)", strerror(-res), res); session->close(); return res; } std::vector<std::string> physicalCameraIds; bool isLogical = CameraProviderManager::isLogicalCamera(mDeviceInfo, &physicalCameraIds); if (isLogical) { for (auto& physicalId : physicalCameraIds) { res = manager->getCameraCharacteristics(physicalId, &mPhysicalDeviceInfoMap[physicalId]); if (res != OK) { SET_ERR_L("Could not retrieve camera %s characteristics: %s (%d)", physicalId.c_str(), strerror(-res), res); session->close(); return res; } } } std::shared_ptr<RequestMetadataQueue> queue; auto requestQueueRet = session->getCaptureRequestMetadataQueue( [&queue](const auto& descriptor) { Loading Loading @@ -719,7 +733,7 @@ status_t Camera3Device::dump(int fd, const Vector<String16> &args) { return OK; } const CameraMetadata& Camera3Device::info() const { const CameraMetadata& Camera3Device::info(const String8& physicalId) const { ALOGVV("%s: E", __FUNCTION__); if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED || mStatus == STATUS_ERROR)) { Loading @@ -727,7 +741,22 @@ const CameraMetadata& Camera3Device::info() const { mStatus == STATUS_ERROR ? "when in error state" : "before init"); } if (physicalId.isEmpty()) { return mDeviceInfo; } else { std::string id(physicalId.c_str()); if (mPhysicalDeviceInfoMap.find(id) != mPhysicalDeviceInfoMap.end()) { return mPhysicalDeviceInfoMap.at(id); } else { ALOGE("%s: Invalid physical camera id %s", __FUNCTION__, physicalId.c_str()); return mDeviceInfo; } } } const CameraMetadata& Camera3Device::info() const { String8 emptyId; return info(emptyId); } status_t Camera3Device::checkStatusOkToCaptureLocked() { Loading
services/camera/libcameraservice/device3/Camera3Device.h +2 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,7 @@ class Camera3Device : status_t disconnect() override; status_t dump(int fd, const Vector<String16> &args) override; const CameraMetadata& info() const override; const CameraMetadata& info(const String8& physicalId) const override; // Capture and setStreamingRequest will configure streams if currently in // idle state Loading Loading @@ -379,6 +380,7 @@ class Camera3Device : sp<HalInterface> mInterface; CameraMetadata mDeviceInfo; std::unordered_map<std::string, CameraMetadata> mPhysicalDeviceInfoMap; CameraMetadata mRequestTemplateCache[CAMERA3_TEMPLATE_COUNT]; Loading