diff options
author | Emilian Peev <epeev@google.com> | 2019-01-09 14:56:17 +0000 |
---|---|---|
committer | Emilian Peev <epeev@google.com> | 2019-01-15 10:18:57 +0000 |
commit | cf24597915ce4f06730cd9236f3bfdd07cb87311 (patch) | |
tree | 470df331ada7130cf3a9a7d11fdf22cca857bf94 | |
parent | 104751a668f508abc922cd8d353de64a4c4c9ba1 (diff) | |
download | dynamic_depth-cf24597915ce4f06730cd9236f3bfdd07cb87311.tar.gz |
Add Android dynamic depth buffer validation sequence
Bug: 109735087
Test: Camera CTS
Change-Id: I4745aadab8ac512ed8dff38a65c40ca9db53e4c4
-rw-r--r-- | README.android | 9 | ||||
-rw-r--r-- | internal/dynamic_depth/dynamic_depth.cc | 91 |
2 files changed, 100 insertions, 0 deletions
diff --git a/README.android b/README.android new file mode 100644 index 0000000..7a8f454 --- /dev/null +++ b/README.android @@ -0,0 +1,9 @@ +Library Name: Dynamic Depth +License: Apache 2 +Description: A C++ implementation of the Dynamic Depth extension. It contains all necessary +utilities for reading and writing Depth and AR photos. + +Local patches +------------- +- Android depth photo validation sequence "ValidateAndroidDynamicDepthBuffer()". + diff --git a/internal/dynamic_depth/dynamic_depth.cc b/internal/dynamic_depth/dynamic_depth.cc index 2294289..fa3983e 100644 --- a/internal/dynamic_depth/dynamic_depth.cc +++ b/internal/dynamic_depth/dynamic_depth.cc @@ -8,6 +8,7 @@ #include "dynamic_depth/item.h" #include "image_io/gcontainer/gcontainer.h" #include "xmpmeta/xmp_data.h" +#include "xmpmeta/xmp_parser.h" #include "xmpmeta/xmp_writer.h" namespace dynamic_depth { @@ -128,4 +129,94 @@ bool GetItemPayload(const string& input_image_filename, return success; } +extern "C" int32_t ValidateAndroidDynamicDepthBuffer(const char* buffer, size_t buffer_length) { + XmpData xmp_data; + const string image_data(buffer, buffer_length); + ReadXmpFromMemory(image_data, /*XmpSkipExtended*/ false, &xmp_data); + + // Check device presence + std::unique_ptr<Device> device = Device::FromXmp(xmp_data); + if (device == nullptr) { + LOG(ERROR) << "Dynamic depth device element not present!"; + return -1; + } + + // Check profiles + const Profiles* profiles = device->GetProfiles(); + if (profiles == nullptr) { + LOG(ERROR) << "No Profile found in the dynamic depth metadata"; + return -1; + } + + const std::vector<const Profile*> profile_list = profiles->GetProfiles(); + // Stop at the first depth photo profile found. + bool depth_photo_profile_found = false; + int camera_index = 0; + for (auto profile : profile_list) { + depth_photo_profile_found = !profile->GetType().compare("DepthPhoto"); + if (depth_photo_profile_found) { + // Use the first one if available. + auto indices = profile->GetCameraIndices(); + if (!indices.empty()) { + camera_index = indices[0]; + } else { + camera_index = -1; + } + break; + } + } + + if (!depth_photo_profile_found || camera_index < 0) { + LOG(ERROR) << "No dynamic depth profile found"; + return -1; + } + + auto cameras = device->GetCameras(); + if (cameras == nullptr || camera_index > cameras->GetCameras().size() || + cameras->GetCameras()[camera_index] == nullptr) { + LOG(ERROR) << "No camera or depth photo data found"; + return -1; + } + + auto camera = cameras->GetCameras()[camera_index]; + auto depth_map = camera->GetDepthMap(); + if (depth_map == nullptr) { + LOG(ERROR) << "No depth map found"; + return -1; + } + + auto depth_uri = depth_map->GetDepthUri(); + if (depth_uri.empty()) { + LOG(ERROR) << "Invalid depth map URI"; + return -1; + } + + auto depth_units = depth_map->GetUnits(); + if (depth_units != dynamic_depth::DepthUnits::kMeters) { + LOG(ERROR) << "Unexpected depth map units"; + return -1; + } + + auto depth_format = depth_map->GetFormat(); + if (depth_format != dynamic_depth::DepthFormat::kRangeInverse) { + LOG(ERROR) << "Unexpected depth map format"; + return -1; + } + + auto near = depth_map->GetNear(); + auto far = depth_map->GetFar(); + if ((near < 0.f) || (far < 0.f) || (near > far) || (near == far)) { + LOG(ERROR) << "Unexpected depth map near and far values"; + return -1; + } + + auto confidence_uri = depth_map->GetConfidenceUri(); + if (confidence_uri.empty()) { + LOG(ERROR) << "No confidence URI"; + return -1; + } + + return 0; +} + } // namespace dynamic_depth |