Skip to content
This repository was archived by the owner on Jan 7, 2023. It is now read-only.

Commit 3b83077

Browse files
committed
Adding new sample for JPEG 360 metadata
1 parent a5285eb commit 3b83077

File tree

4 files changed

+254
-1
lines changed

4 files changed

+254
-1
lines changed

modules/CMakeLists.txt

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ macro(append_target_property _target _property _value)
1616
endmacro()
1717

1818
if(WIN32)
19-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")
2019
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251")
2120
add_definitions(-DUNICODE)
2221
add_definitions(-DLIBXML_STATIC)

samples/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ add_subdirectory(checksum-utility)
77
add_subdirectory(metadata-read-write)
88
add_subdirectory(metadata-statistics)
99
add_subdirectory(metadata-manipulation)
10+
add_subdirectory(metadata-write-jpeg-360)
1011
add_subdirectory(std-schema)
1112
add_subdirectory(metadata-schema)
1213
add_subdirectory(compression)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
set(PROJ_NAME metadata-write-jpeg-360)
2+
project(${PROJ_NAME})
3+
cmake_minimum_required(VERSION 2.8)
4+
5+
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}")
6+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
7+
8+
find_package(VMF)
9+
10+
include_directories(${UMF_INCLUDE_DIR})
11+
link_directories(${UMF_LIB_DIR})
12+
13+
set(VIDEO_PATH "${UMF_DATA_DIR}/BlueSquare.avi")
14+
set(OUTPUT_PATH "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}")
15+
16+
file(GLOB SRC "*.cpp")
17+
add_executable(${PROJ_NAME} ${SRC})
18+
target_link_libraries(${PROJ_NAME} ${UMF_LIBS})
19+
set_target_properties(${PROJ_NAME} PROPERTIES FOLDER "samples")
20+
21+
file(TO_NATIVE_PATH "${VIDEO_PATH}" VIDEO_PATH)
22+
file(TO_NATIVE_PATH "${OUTPUT_PATH}" OUTPUT_PATH)
23+
24+
if(WIN32)
25+
ADD_CUSTOM_COMMAND(TARGET ${PROJ_NAME}
26+
POST_BUILD
27+
COMMAND copy "${VIDEO_PATH}" "${OUTPUT_PATH}"
28+
)
29+
else()
30+
ADD_CUSTOM_COMMAND(TARGET ${PROJ_NAME}
31+
POST_BUILD
32+
COMMAND cp "${VIDEO_PATH}" "${OUTPUT_PATH}"
33+
)
34+
endif()
+219
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
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

Comments
 (0)