|
| 1 | +/* |
| 2 | + * Copyright 2019 Intel(r) Corporation |
| 3 | + * |
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | + * you may not use this file except in compliance with the License. |
| 6 | + * You may obtain a copy of the License at |
| 7 | + * |
| 8 | + * http ://www.apache.org/licenses/LICENSE-2.0 |
| 9 | + * |
| 10 | + * Unless required by applicable law or agreed to in writing, software |
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | + * See the License for the specific language governing permissions and |
| 14 | + * limitations under the License. |
| 15 | + * |
| 16 | + */ |
| 17 | +/* |
| 18 | + * This demo shows how to use metadata descriptions |
| 19 | + * to store data structures such as jpeg coordinates with associative time. |
| 20 | + */ |
| 21 | + |
| 22 | +#include <algorithm> |
| 23 | +#include <iostream> |
| 24 | +#include <fstream> |
| 25 | +#include <cstdio> |
| 26 | +#include <cassert> |
| 27 | + |
| 28 | +#include "umf/umf.hpp" |
| 29 | + |
| 30 | + |
| 31 | +using namespace umf; |
| 32 | +using namespace std; |
| 33 | + |
| 34 | +string workingPath; |
| 35 | + |
| 36 | +#define VIDEO_FILE (workingPath + "BlueSquare.avi") |
| 37 | + |
| 38 | +void copyFile(const string& srcName, const char *dstName) |
| 39 | +{ |
| 40 | + ifstream src(srcName, ios::binary); |
| 41 | + ofstream dst(dstName, ios::binary); |
| 42 | + if (src && dst) |
| 43 | + dst << src.rdbuf(); |
| 44 | + else |
| 45 | + UMF_EXCEPTION(IncorrectParamException, "Error copying '" + srcName + "' to '" + dstName + "'"); |
| 46 | + //src.close(); |
| 47 | + //dst.close(); |
| 48 | +} |
| 49 | + |
| 50 | +int main(int argc, char *argv[]) |
| 51 | +{ |
| 52 | + string appPath = argv[0]; |
| 53 | +#ifdef WIN32 |
| 54 | + char delim = '\\'; |
| 55 | +#else |
| 56 | + char delim = '/'; |
| 57 | +#endif |
| 58 | + size_t pos = appPath.find_last_of(delim); |
| 59 | + |
| 60 | + if (pos != string::npos) |
| 61 | + { |
| 62 | + workingPath = appPath.substr(0, pos + 1); |
| 63 | + } |
| 64 | + |
| 65 | + // Copy test video file to another location. |
| 66 | + copyFile(VIDEO_FILE, "global_test.avi"); |
| 67 | + |
| 68 | + cout << "UMF sample: write of JPEG 360 metadata" << endl << endl; |
| 69 | + |
| 70 | + const string FILE_NAME = "global_test.avi"; |
| 71 | + const string META_SOURCE_NAME = "test-id"; |
| 72 | + const string jpeg_SCHEMA_NAME = "JPEG360Metadata"; |
| 73 | + |
| 74 | + // Image metadata setup |
| 75 | + const string jpeg_DESC = "JPEG360ImageMetadata"; |
| 76 | + const string jpeg_IMAGE_VERSION_FIELD = "JPEG360version"; |
| 77 | + const string jpeg_IMAGE_MEDIA_TYPE_FIELD = "MediaType"; |
| 78 | + const string jpeg_IMAGE_PROJECTION_TYPE_FIELD = "ProjectionType"; |
| 79 | + const string jpeg_IMAGE_PHI_MIN_FIELD = "PhiMin"; |
| 80 | + const string jpeg_IMAGE_PHI_MAX_FIELD = "PhiMax"; |
| 81 | + const string jpeg_IMAGE_THETA_MAX_FIELD = "ThetaMax"; |
| 82 | + const string jpeg_IMAGE_THETA_MIN_FIELD = "ThetaMin"; |
| 83 | + const string jpeg_IMAGE_PHI_GRAVITY_FIELD = "PhiGravity"; |
| 84 | + const string jpeg_IMAGE_THETA_GRAVITY_FIELD = "ThetaGravity"; |
| 85 | + const string jpeg_IMAGE_COMPASS_PHI_FIELD = "CompassPhi"; |
| 86 | + const string jpeg_IMAGE_BOX_REFERENCE_FIELD = "BoxReference"; |
| 87 | + |
| 88 | + const int jpeg_METADATA_IMAGE_VERSION_ITEM1 = 1; |
| 89 | + const string jpeg_METADATA_IMAGE_MEDIA_TYPE_ITEM1 = "image/jpeg"; |
| 90 | + const string jpeg_METADATA_IMAGE_PROJECTION_TYPE_ITEM1 = "Equirectangular"; |
| 91 | + const double jpeg_METADATA_IMAGE_PHI_MIN_ITEM1 = -180.0; |
| 92 | + const double jpeg_METADATA_IMAGE_PHI_MAX_ITEM1 = 180.0; |
| 93 | + const double jpeg_METADATA_IMAGE_THETA_MAX_ITEM1 = 90.0; |
| 94 | + const double jpeg_METADATA_IMAGE_THETA_MIN_ITEM1 = -90.0; |
| 95 | + const double jpeg_METADATA_IMAGE_PHI_GRAVITY_ITEM1 = 0.0; |
| 96 | + const double jpeg_METADATA_IMAGE_THETA_GRAVITY_ITEM1 = -90.0; |
| 97 | + const double jpeg_IMAGE_COMPASS_PHI_ITEM1 = 0.0; |
| 98 | + const string jpeg_METADATA_IMAGE_BOX_REFERENCE_ITEM1 = "Legacy"; |
| 99 | + |
| 100 | + // Viewport metadata setup |
| 101 | + const string jpeg_DESC2 = "JPEG360ViewportMetadata"; |
| 102 | + const string jpeg_VIEWPORT_NUMBER_FIELD = "JPEG360ViewportNumber"; |
| 103 | + const string jpeg_VIEWPORT_PHI_FIELD = "ViewportPhi"; |
| 104 | + const string jpeg_VIEWPORT_THETA_FIELD = "ViewportTheta"; |
| 105 | + const string jpeg_VIEWPORT_PHI_FOV_FIELD = "ViewportPhiFOV"; |
| 106 | + const string jpeg_VIEWPORT_THETA_FOV_FIELD = "ViewportThetaFOV"; |
| 107 | + const string jpeg_VIEWPORT_ROLL_FIELD = "ViewportRoll"; |
| 108 | + |
| 109 | + |
| 110 | + const int jpeg_METADATA_VIEWPORT_NUMBER_ITEM1 = 0; |
| 111 | + const int jpeg_METADATA_VIEWPORT_NUMBER_ITEM2 = 1; |
| 112 | + const double jpeg_METADATA_VIEWPORT_PHI_ITEM1 = 0.0; |
| 113 | + const double jpeg_METADATA_VIEWPORT_PHI_ITEM2 = 90.0; |
| 114 | + const double jpeg_METADATA_VIEWPORT_THETA_ITEM1 = 0.0; |
| 115 | + const double jpeg_METADATA_VIEWPORT_THETA_ITEM2 = 0.0; |
| 116 | + const double jpeg_METADATA_VIEWPORT_PHI_FOV_ITEM1 = 90.0; |
| 117 | + const double jpeg_METADATA_VIEWPORT_PHI_FOV_ITEM2 = 45.0; |
| 118 | + const double jpeg_METADATA_VIEWPORT_THETA_FOV_ITEM1 = 45.0; |
| 119 | + const double jpeg_METADATA_VIEWPORT_THETA_FOV_ITEM2 = 45.0; |
| 120 | + const double jpeg_METADATA_VIEWPORT_ROLL_ITEM1 = 0.0; |
| 121 | + const double jpeg_METADATA_VIEWPORT_ROLL_ITEM2 = 0.0; |
| 122 | + |
| 123 | + cout << "Adding metadata..." << endl; |
| 124 | + cout << "Opening file name '" << FILE_NAME << "'" << endl; |
| 125 | + |
| 126 | + // Open metadata stream |
| 127 | + MetadataStream mdStream; |
| 128 | + if (!mdStream.open(FILE_NAME, MetadataStream::Update)) |
| 129 | + { |
| 130 | + cerr << "Can't open file " << FILE_NAME << endl; |
| 131 | + exit(1); |
| 132 | + } |
| 133 | + |
| 134 | + // Create a jpeg metadata field descriptions |
| 135 | + vector<FieldDesc> fieldDesc; |
| 136 | + vector<FieldDesc> fieldDesc2; |
| 137 | + |
| 138 | + // Field descriptors for Image |
| 139 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_VERSION_FIELD, umf::Variant::type_integer)); |
| 140 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_MEDIA_TYPE_FIELD, umf::Variant::type_string)); |
| 141 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_PROJECTION_TYPE_FIELD, umf::Variant::type_string)); |
| 142 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_PHI_MIN_FIELD, umf::Variant::type_real)); |
| 143 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_PHI_MAX_FIELD, umf::Variant::type_real)); |
| 144 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_THETA_MAX_FIELD, umf::Variant::type_real)); |
| 145 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_THETA_MIN_FIELD, umf::Variant::type_real)); |
| 146 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_PHI_GRAVITY_FIELD, umf::Variant::type_real)); |
| 147 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_THETA_GRAVITY_FIELD, umf::Variant::type_real)); |
| 148 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_COMPASS_PHI_FIELD, umf::Variant::type_real)); |
| 149 | + fieldDesc.push_back(FieldDesc(jpeg_IMAGE_BOX_REFERENCE_FIELD, umf::Variant::type_string)); |
| 150 | + |
| 151 | + // Field descriptors for Viewport |
| 152 | + fieldDesc2.push_back(FieldDesc(jpeg_VIEWPORT_NUMBER_FIELD, umf::Variant::type_integer)); |
| 153 | + fieldDesc2.push_back(FieldDesc(jpeg_VIEWPORT_PHI_FIELD, umf::Variant::type_real)); |
| 154 | + fieldDesc2.push_back(FieldDesc(jpeg_VIEWPORT_THETA_FIELD, umf::Variant::type_real)); |
| 155 | + fieldDesc2.push_back(FieldDesc(jpeg_VIEWPORT_PHI_FOV_FIELD, umf::Variant::type_real)); |
| 156 | + fieldDesc2.push_back(FieldDesc(jpeg_VIEWPORT_THETA_FOV_FIELD, umf::Variant::type_real)); |
| 157 | + fieldDesc2.push_back(FieldDesc(jpeg_VIEWPORT_ROLL_FIELD, umf::Variant::type_real)); |
| 158 | + |
| 159 | + // Create jpeg metadata description |
| 160 | + shared_ptr<MetadataDesc> jpegDesc(new MetadataDesc(jpeg_DESC, fieldDesc)); |
| 161 | + shared_ptr<MetadataDesc> jpegDesc2(new MetadataDesc(jpeg_DESC2, fieldDesc2)); |
| 162 | + |
| 163 | + // Create jpeg metadata schema |
| 164 | + shared_ptr<MetadataSchema> jpegSchema(new MetadataSchema(jpeg_SCHEMA_NAME)); |
| 165 | + |
| 166 | + // Add description to the schema |
| 167 | + jpegSchema->add(jpegDesc); |
| 168 | + jpegSchema->add(jpegDesc2); |
| 169 | + |
| 170 | + // Add schema to metadata stream |
| 171 | + mdStream.addSchema(jpegSchema); |
| 172 | + |
| 173 | + shared_ptr<Metadata> jpegMetadata; |
| 174 | + shared_ptr<Metadata> jpegMetadata2; |
| 175 | + |
| 176 | + // Create first metadata items for both sets |
| 177 | + jpegMetadata = shared_ptr<Metadata>(new Metadata(jpegDesc)); |
| 178 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_VERSION_FIELD, jpeg_METADATA_IMAGE_VERSION_ITEM1)); |
| 179 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_MEDIA_TYPE_FIELD, jpeg_METADATA_IMAGE_MEDIA_TYPE_ITEM1)); |
| 180 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_PROJECTION_TYPE_FIELD, jpeg_METADATA_IMAGE_PROJECTION_TYPE_ITEM1)); |
| 181 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_PHI_MIN_FIELD, jpeg_METADATA_IMAGE_PHI_MIN_ITEM1)); |
| 182 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_PHI_MAX_FIELD, jpeg_METADATA_IMAGE_PHI_MAX_ITEM1)); |
| 183 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_THETA_MAX_FIELD, jpeg_METADATA_IMAGE_THETA_MAX_ITEM1)); |
| 184 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_THETA_MIN_FIELD, jpeg_METADATA_IMAGE_THETA_MIN_ITEM1)); |
| 185 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_PHI_GRAVITY_FIELD, jpeg_METADATA_IMAGE_PHI_GRAVITY_ITEM1)); |
| 186 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_THETA_GRAVITY_FIELD, jpeg_METADATA_IMAGE_THETA_GRAVITY_ITEM1)); |
| 187 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_COMPASS_PHI_FIELD, jpeg_IMAGE_COMPASS_PHI_ITEM1)); |
| 188 | + jpegMetadata->push_back(FieldValue(jpeg_IMAGE_BOX_REFERENCE_FIELD, jpeg_METADATA_IMAGE_BOX_REFERENCE_ITEM1)); |
| 189 | + |
| 190 | + mdStream.add(jpegMetadata); |
| 191 | + |
| 192 | + jpegMetadata2 = shared_ptr<Metadata>(new Metadata(jpegDesc2)); |
| 193 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_NUMBER_FIELD, jpeg_METADATA_VIEWPORT_NUMBER_ITEM1)); |
| 194 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_PHI_FIELD, jpeg_METADATA_VIEWPORT_PHI_ITEM1)); |
| 195 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_THETA_FIELD, jpeg_METADATA_VIEWPORT_THETA_ITEM1)); |
| 196 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_PHI_FOV_FIELD, jpeg_METADATA_VIEWPORT_PHI_FOV_ITEM1)); |
| 197 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_THETA_FOV_FIELD, jpeg_METADATA_VIEWPORT_THETA_FOV_ITEM1)); |
| 198 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_ROLL_FIELD, jpeg_METADATA_VIEWPORT_ROLL_ITEM1)); |
| 199 | + |
| 200 | + mdStream.add(jpegMetadata2); |
| 201 | + |
| 202 | + jpegMetadata2 = shared_ptr<Metadata>(new Metadata(jpegDesc2)); |
| 203 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_NUMBER_FIELD, jpeg_METADATA_VIEWPORT_NUMBER_ITEM2)); |
| 204 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_PHI_FIELD, jpeg_METADATA_VIEWPORT_PHI_ITEM2)); |
| 205 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_THETA_FIELD, jpeg_METADATA_VIEWPORT_THETA_ITEM2)); |
| 206 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_PHI_FOV_FIELD, jpeg_METADATA_VIEWPORT_PHI_FOV_ITEM2)); |
| 207 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_THETA_FOV_FIELD, jpeg_METADATA_VIEWPORT_THETA_FOV_ITEM2)); |
| 208 | + jpegMetadata2->push_back(FieldValue(jpeg_VIEWPORT_ROLL_FIELD, jpeg_METADATA_VIEWPORT_ROLL_ITEM2)); |
| 209 | + |
| 210 | + mdStream.add(jpegMetadata2); |
| 211 | + |
| 212 | + cout << "Save metadata" << endl << endl; |
| 213 | + |
| 214 | + // Save metadata to video file and close metadata stream |
| 215 | + mdStream.save(); |
| 216 | + mdStream.close(); |
| 217 | + |
| 218 | + return 0; |
| 219 | +} |
0 commit comments