summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilian Peev <epeev@google.com>2019-01-09 14:56:17 +0000
committerEmilian Peev <epeev@google.com>2019-01-15 10:18:57 +0000
commitcf24597915ce4f06730cd9236f3bfdd07cb87311 (patch)
tree470df331ada7130cf3a9a7d11fdf22cca857bf94
parent104751a668f508abc922cd8d353de64a4c4c9ba1 (diff)
downloaddynamic_depth-cf24597915ce4f06730cd9236f3bfdd07cb87311.tar.gz
Add Android dynamic depth buffer validation sequence
Bug: 109735087 Test: Camera CTS Change-Id: I4745aadab8ac512ed8dff38a65c40ca9db53e4c4
-rw-r--r--README.android9
-rw-r--r--internal/dynamic_depth/dynamic_depth.cc91
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