summaryrefslogtreecommitdiff
path: root/internal/dynamic_depth/depth_jpeg.cc
diff options
context:
space:
mode:
Diffstat (limited to 'internal/dynamic_depth/depth_jpeg.cc')
-rw-r--r--internal/dynamic_depth/depth_jpeg.cc110
1 files changed, 110 insertions, 0 deletions
diff --git a/internal/dynamic_depth/depth_jpeg.cc b/internal/dynamic_depth/depth_jpeg.cc
new file mode 100644
index 0000000..ec5ab89
--- /dev/null
+++ b/internal/dynamic_depth/depth_jpeg.cc
@@ -0,0 +1,110 @@
+#include "dynamic_depth/depth_jpeg.h"
+
+#include <fstream>
+#include <sstream>
+
+#include "android-base/logging.h"
+#include "dynamic_depth/container.h"
+#include "dynamic_depth/device.h"
+#include "dynamic_depth/dynamic_depth.h"
+#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"
+
+using ::dynamic_depth::xmpmeta::XmpData;
+
+namespace dynamic_depth {
+
+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