Home | History | Annotate | Download | only in dynamic_depth
      1 
      2 #include "dynamic_depth/camera.h"
      3 
      4 #include "android-base/logging.h"
      5 #include "dynamic_depth/const.h"
      6 
      7 using ::dynamic_depth::xmpmeta::xml::Deserializer;
      8 using ::dynamic_depth::xmpmeta::xml::Serializer;
      9 
     10 namespace dynamic_depth {
     11 namespace {
     12 
     13 const char kNamespaceHref[] = "http://ns.google.com/photos/dd/1.0/camera/";
     14 
     15 constexpr const char* kTrait = "Trait";
     16 constexpr const char* kTraitPhysical = "Physical";
     17 constexpr const char* kTraitPhysicalLower = "physical";
     18 constexpr const char* kTraitLogical = "Logical";
     19 constexpr const char* kTraitLogicalLower = "logical";
     20 
     21 constexpr const char* kImageJpegMime = "image/jpeg";
     22 
     23 string TraitToString(CameraTrait trait) {
     24   switch (trait) {
     25     case PHYSICAL:
     26       return kTraitPhysical;
     27     case LOGICAL:
     28       return kTraitLogical;
     29     case NONE:  // Fallthrough.
     30     default:
     31       return "";
     32   }
     33 }
     34 
     35 CameraTrait StringToTrait(const string& trait_name) {
     36   string trait_lower = trait_name;
     37   std::transform(trait_lower.begin(), trait_lower.end(), trait_lower.begin(),
     38                  ::tolower);
     39   if (kTraitPhysicalLower == trait_lower) {
     40     return CameraTrait::PHYSICAL;
     41   }
     42 
     43   if (kTraitLogicalLower == trait_lower) {
     44     return CameraTrait::LOGICAL;
     45   }
     46 
     47   return CameraTrait::NONE;
     48 }
     49 
     50 std::unique_ptr<Camera> ParseFields(const Deserializer& deserializer) {
     51   string trait_str;
     52   deserializer.ParseString(DynamicDepthConst::Camera(), kTrait, &trait_str);
     53   CameraTrait trait = StringToTrait(trait_str);
     54 
     55   std::unique_ptr<Image> image = Image::FromDeserializer(deserializer);
     56   if (image == nullptr) {
     57     LOG(ERROR) << "An image must be present in a Camera, but none was found";
     58     return nullptr;
     59   }
     60 
     61   std::unique_ptr<LightEstimate> light_estimate =
     62       LightEstimate::FromDeserializer(deserializer);
     63 
     64   std::unique_ptr<Pose> pose =
     65       Pose::FromDeserializer(deserializer, DynamicDepthConst::Camera());
     66 
     67   std::unique_ptr<DepthMap> depth_map =
     68       DepthMap::FromDeserializer(deserializer);
     69 
     70   std::unique_ptr<ImagingModel> imaging_model =
     71       ImagingModel::FromDeserializer(deserializer);
     72 
     73   std::unique_ptr<PointCloud> point_cloud =
     74       PointCloud::FromDeserializer(deserializer);
     75 
     76   std::unique_ptr<VendorInfo> vendor_info =
     77       VendorInfo::FromDeserializer(deserializer, DynamicDepthConst::Camera());
     78 
     79   std::unique_ptr<AppInfo> app_info =
     80       AppInfo::FromDeserializer(deserializer, DynamicDepthConst::Camera());
     81 
     82   std::unique_ptr<CameraParams> params(new CameraParams(std::move(image)));
     83   params->depth_map = std::move(depth_map);
     84   params->light_estimate = std::move(light_estimate);
     85   params->pose = std::move(pose);
     86   params->imaging_model = std::move(imaging_model);
     87   params->point_cloud = std::move(point_cloud);
     88   params->vendor_info = std::move(vendor_info);
     89   params->app_info = std::move(app_info);
     90   params->trait = trait;
     91   return Camera::FromData(std::move(params));
     92 }
     93 
     94 }  // namespace
     95 
     96 // Private constructor.
     97 Camera::Camera(std::unique_ptr<CameraParams> params) {
     98   params_ = std::move(params);
     99 }
    100 
    101 // Public methods.
    102 void Camera::GetNamespaces(
    103     std::unordered_map<string, string>* ns_name_href_map) {
    104   if (ns_name_href_map == nullptr) {
    105     LOG(ERROR) << "Namespace list is null";
    106     return;
    107   }
    108   ns_name_href_map->emplace(DynamicDepthConst::Camera(), kNamespaceHref);
    109   if (params_->image) {
    110     params_->image->GetNamespaces(ns_name_href_map);
    111   }
    112   if (params_->light_estimate) {
    113     params_->light_estimate->GetNamespaces(ns_name_href_map);
    114   }
    115   if (params_->pose) {
    116     params_->pose->GetNamespaces(ns_name_href_map);
    117   }
    118   if (params_->depth_map) {
    119     params_->depth_map->GetNamespaces(ns_name_href_map);
    120   }
    121   if (params_->imaging_model) {
    122     params_->imaging_model->GetNamespaces(ns_name_href_map);
    123   }
    124   if (params_->point_cloud) {
    125     params_->point_cloud->GetNamespaces(ns_name_href_map);
    126   }
    127   if (params_->vendor_info) {
    128     params_->vendor_info->GetNamespaces(ns_name_href_map);
    129   }
    130   if (params_->app_info) {
    131     params_->app_info->GetNamespaces(ns_name_href_map);
    132   }
    133 }
    134 
    135 std::unique_ptr<Camera> Camera::FromDataForCamera0(
    136     std::unique_ptr<CameraParams> params,
    137     std::vector<std::unique_ptr<Item>>* items) {
    138   if (params->image == nullptr) {
    139     params->image = Image::FromDataForPrimaryImage(kImageJpegMime, items);
    140   }
    141   return std::unique_ptr<Camera>(new Camera(std::move(params)));  // NOLINT
    142 }
    143 
    144 std::unique_ptr<Camera> Camera::FromData(std::unique_ptr<CameraParams> params) {
    145   if (params->image == nullptr) {
    146     LOG(ERROR) << "Camera must have an image eleemnt";
    147     return nullptr;
    148   }
    149 
    150   return std::unique_ptr<Camera>(new Camera(std::move(params)));  // NOLINT
    151 }
    152 
    153 std::unique_ptr<Camera> Camera::FromDeserializer(
    154     const Deserializer& parent_deserializer) {
    155   std::unique_ptr<Deserializer> deserializer =
    156       parent_deserializer.CreateDeserializer(
    157           DynamicDepthConst::Namespace(DynamicDepthConst::Camera()),
    158           DynamicDepthConst::Camera());
    159   if (deserializer == nullptr) {
    160     return nullptr;
    161   }
    162 
    163   return ParseFields(*deserializer);
    164 }
    165 
    166 const Image* Camera::GetImage() const { return params_->image.get(); }
    167 
    168 const LightEstimate* Camera::GetLightEstimate() const {
    169   return params_->light_estimate.get();
    170 }
    171 
    172 const Pose* Camera::GetPose() const { return params_->pose.get(); }
    173 
    174 const DepthMap* Camera::GetDepthMap() const { return params_->depth_map.get(); }
    175 
    176 const ImagingModel* Camera::GetImagingModel() const {
    177   return params_->imaging_model.get();
    178 }
    179 
    180 const PointCloud* Camera::GetPointCloud() const {
    181   return params_->point_cloud.get();
    182 }
    183 
    184 const VendorInfo* Camera::GetVendorInfo() const {
    185   return params_->vendor_info.get();
    186 }
    187 
    188 const AppInfo* Camera::GetAppInfo() const { return params_->app_info.get(); }
    189 
    190 CameraTrait Camera::GetTrait() const { return params_->trait; }
    191 
    192 bool Camera::Serialize(Serializer* serializer) const {
    193   if (serializer == nullptr) {
    194     LOG(ERROR) << "Serializer is null";
    195     return false;
    196   }
    197 
    198   if (params_->trait != CameraTrait::NONE) {
    199     string trait_name = TraitToString(params_->trait);
    200     serializer->WriteProperty(DynamicDepthConst::Camera(), kTrait, trait_name);
    201   }
    202 
    203   // Error checking has already been done at instantiation time.
    204   if (params_->image != nullptr) {
    205     std::unique_ptr<Serializer> image_serializer = serializer->CreateSerializer(
    206         DynamicDepthConst::Namespace(DynamicDepthConst::Image()),
    207         DynamicDepthConst::Image());
    208     if (!params_->image->Serialize(image_serializer.get())) {
    209       LOG(WARNING) << "Could not serialize Image";
    210     }
    211   }
    212 
    213   if (params_->depth_map != nullptr) {
    214     std::unique_ptr<Serializer> depth_map_serializer =
    215         serializer->CreateSerializer(DynamicDepthConst::Camera(),
    216                                      DynamicDepthConst::DepthMap());
    217     if (!params_->depth_map->Serialize(depth_map_serializer.get())) {
    218       LOG(WARNING) << "Could not serializer Depth Map";
    219     }
    220   }
    221 
    222   if (params_->light_estimate != nullptr) {
    223     std::unique_ptr<Serializer> light_estimate_serializer =
    224         serializer->CreateSerializer(
    225             DynamicDepthConst::Namespace(DynamicDepthConst::LightEstimate()),
    226             DynamicDepthConst::LightEstimate());
    227     if (!params_->light_estimate->Serialize(light_estimate_serializer.get())) {
    228       LOG(WARNING) << "Could not serialize LightEstimate";
    229     }
    230   }
    231 
    232   if (params_->pose != nullptr) {
    233     std::unique_ptr<Serializer> pose_serializer = serializer->CreateSerializer(
    234         DynamicDepthConst::Camera(), DynamicDepthConst::Pose());
    235     if (!params_->pose->Serialize(pose_serializer.get())) {
    236       LOG(WARNING) << "Could not serialize Pose";
    237     }
    238   }
    239 
    240   if (params_->imaging_model != nullptr) {
    241     std::unique_ptr<Serializer> imaging_model_serializer =
    242         serializer->CreateSerializer(
    243             DynamicDepthConst::Namespace(DynamicDepthConst::ImagingModel()),
    244             DynamicDepthConst::ImagingModel());
    245     if (!params_->imaging_model->Serialize(imaging_model_serializer.get())) {
    246       LOG(WARNING) << "Could not serialize ImagingModel";
    247     }
    248   }
    249 
    250   if (params_->point_cloud != nullptr) {
    251     std::unique_ptr<Serializer> point_cloud_serializer =
    252         serializer->CreateSerializer(DynamicDepthConst::Camera(),
    253                                      DynamicDepthConst::PointCloud());
    254     if (!params_->point_cloud->Serialize(point_cloud_serializer.get())) {
    255       LOG(WARNING) << "Could not serialize PointCloud";
    256     }
    257   }
    258 
    259   if (params_->vendor_info != nullptr) {
    260     std::unique_ptr<Serializer> vendor_info_serializer =
    261         serializer->CreateSerializer(DynamicDepthConst::Camera(),
    262                                      DynamicDepthConst::VendorInfo());
    263     if (!params_->vendor_info->Serialize(vendor_info_serializer.get())) {
    264       LOG(WARNING) << "Could not serialize VendorInfo";
    265     }
    266   }
    267 
    268   if (params_->app_info != nullptr) {
    269     std::unique_ptr<Serializer> app_info_serializer =
    270         serializer->CreateSerializer(DynamicDepthConst::Camera(),
    271                                      DynamicDepthConst::AppInfo());
    272     if (!params_->app_info->Serialize(app_info_serializer.get())) {
    273       LOG(WARNING) << "Could not serialize AppInfo";
    274     }
    275   }
    276 
    277   return true;
    278 }
    279 
    280 }  // namespace dynamic_depth
    281