multilayer_metadata_test.cc (11317B)
1 /* 2 * Copyright (c) 2024, Alliance for Open Media. All rights reserved. 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #include <cmath> 13 14 #include "gtest/gtest.h" 15 16 #include "examples/multilayer_metadata.h" 17 #include "test/video_source.h" 18 19 namespace libaom_examples { 20 namespace { 21 22 TEST(MultilayerMetadataTest, ParseAlpha) { 23 const std::string metadata = R"( 24 25 use_case: 1 # global alpha 26 layers: 27 - layer_type: 5 # alpha 28 luma_plane_only_flag: 1 29 layer_metadata_scope: 2 # global 30 alpha: 31 alpha_use_idc: 1 # premultiplied 32 alpha_bit_depth: 8 33 alpha_transparent_value: 0 34 alpha_opaque_value: 4 35 36 - layer_type: 1 # texture 37 luma_plane_only_flag: 0 38 layer_metadata_scope: 2 # global 39 layer_color_description: 40 color_range: 1 41 color_primaries: 1 42 transfer_characteristics: 13 43 matrix_coefficients: 6 44 45 )"; 46 libaom_test::TempOutFile tmp_file(/*text_mode=*/true); 47 fprintf(tmp_file.file(), "%s", metadata.c_str()); 48 fflush(tmp_file.file()); 49 50 MultilayerMetadata multilayer; 51 EXPECT_TRUE(parse_multilayer_file(tmp_file.file_name().c_str(), &multilayer)); 52 53 EXPECT_EQ(multilayer.use_case, 1); 54 ASSERT_EQ(multilayer.layers.size(), 2); 55 EXPECT_EQ(multilayer.layers[0].layer_type, 5); 56 EXPECT_EQ(multilayer.layers[0].luma_plane_only_flag, 1); 57 EXPECT_EQ(multilayer.layers[0].layer_metadata_scope, 2); 58 EXPECT_EQ(multilayer.layers[0].alpha.alpha_use_idc, 1); 59 EXPECT_EQ(multilayer.layers[0].alpha.alpha_bit_depth, 8); 60 EXPECT_EQ(multilayer.layers[0].alpha.alpha_transparent_value, 0); 61 EXPECT_EQ(multilayer.layers[0].alpha.alpha_opaque_value, 4); 62 EXPECT_EQ(multilayer.layers[1].layer_type, 1); 63 EXPECT_EQ(multilayer.layers[1].luma_plane_only_flag, 0); 64 EXPECT_EQ(multilayer.layers[1].layer_metadata_scope, 2); 65 EXPECT_TRUE(multilayer.layers[1].layer_color_description.second); 66 EXPECT_EQ(multilayer.layers[1].layer_color_description.first.color_range, 1); 67 EXPECT_EQ(multilayer.layers[1].layer_color_description.first.color_primaries, 68 1); 69 EXPECT_EQ(multilayer.layers[1] 70 .layer_color_description.first.transfer_characteristics, 71 13); 72 EXPECT_EQ( 73 multilayer.layers[1].layer_color_description.first.matrix_coefficients, 74 6); 75 } 76 77 TEST(MultilayerMetadataTest, ParseDepth) { 78 const std::string metadata = R"( 79 use_case: 2 # global depth 80 layers: 81 - layer_type: 6 # depth 82 luma_plane_only_flag: 1 83 layer_metadata_scope: 2 # global 84 depth: 85 z_near: 1.456 86 z_far: 9.786 87 depth_representation_type: 2 88 89 - layer_type: 1 # texture 90 luma_plane_only_flag: 0 91 layer_metadata_scope: 2 # global 92 layer_color_description: 93 color_range: 1 94 color_primaries: 1 95 transfer_characteristics: 13 96 matrix_coefficients: 6 97 98 )"; 99 libaom_test::TempOutFile tmp_file(/*text_mode=*/true); 100 fprintf(tmp_file.file(), "%s", metadata.c_str()); 101 fflush(tmp_file.file()); 102 103 MultilayerMetadata multilayer; 104 EXPECT_TRUE(parse_multilayer_file(tmp_file.file_name().c_str(), &multilayer)); 105 EXPECT_EQ(multilayer.use_case, 2); 106 ASSERT_EQ(multilayer.layers.size(), 2); 107 EXPECT_EQ(multilayer.layers[0].layer_type, 6); 108 EXPECT_EQ(multilayer.layers[0].luma_plane_only_flag, 1); 109 EXPECT_EQ(multilayer.layers[0].layer_metadata_scope, 2); 110 EXPECT_TRUE(multilayer.layers[0].depth.z_near.second); 111 EXPECT_NEAR(depth_representation_element_to_double( 112 multilayer.layers[0].depth.z_near.first), 113 1.456, 0.00001); 114 EXPECT_TRUE(multilayer.layers[0].depth.z_far.second); 115 EXPECT_NEAR(depth_representation_element_to_double( 116 multilayer.layers[0].depth.z_far.first), 117 9.786, 0.00001); 118 EXPECT_EQ(multilayer.layers[0].depth.depth_representation_type, 2); 119 EXPECT_EQ(multilayer.layers[1].layer_type, 1); 120 EXPECT_EQ(multilayer.layers[1].luma_plane_only_flag, 0); 121 EXPECT_EQ(multilayer.layers[1].layer_metadata_scope, 2); 122 EXPECT_TRUE(multilayer.layers[1].layer_color_description.second); 123 EXPECT_EQ(multilayer.layers[1].layer_color_description.first.color_range, 1); 124 EXPECT_EQ(multilayer.layers[1].layer_color_description.first.color_primaries, 125 1); 126 EXPECT_EQ(multilayer.layers[1] 127 .layer_color_description.first.transfer_characteristics, 128 13); 129 EXPECT_EQ( 130 multilayer.layers[1].layer_color_description.first.matrix_coefficients, 131 6); 132 } 133 134 TEST(MultilayerMetadataTest, ParseLocalDepth) { 135 const std::string metadata = R"( 136 use_case: 4 # depth 137 layers: 138 - layer_type: 6 # depth 139 luma_plane_only_flag: 1 140 layer_metadata_scope: 3 # mixed 141 depth: 142 z_near: 1.456 143 z_far: 9.786 144 depth_representation_type: 2 145 local_metadata: 146 - frame_idx: 4 147 depth: 148 z_near: 2.78933 149 z_far: 20.663 150 depth_representation_type: 0 151 - frame_idx: 100 152 depth: 153 z_near: 0 154 z_far: 24 155 depth_representation_type: 0 156 157 - layer_type: 1 # texture 158 luma_plane_only_flag: 0 159 layer_metadata_scope: 3 # mixed 160 layer_color_description: 161 color_range: 1 162 color_primaries: 1 163 transfer_characteristics: 13 164 matrix_coefficients: 6 165 )"; 166 libaom_test::TempOutFile tmp_file(/*text_mode=*/true); 167 fprintf(tmp_file.file(), "%s", metadata.c_str()); 168 fflush(tmp_file.file()); 169 170 MultilayerMetadata multilayer; 171 EXPECT_TRUE(parse_multilayer_file(tmp_file.file_name().c_str(), &multilayer)); 172 EXPECT_EQ(multilayer.use_case, 4); 173 ASSERT_EQ(multilayer.layers.size(), 2); 174 EXPECT_EQ(multilayer.layers[0].layer_type, 6); 175 EXPECT_EQ(multilayer.layers[0].luma_plane_only_flag, 1); 176 EXPECT_EQ(multilayer.layers[0].layer_metadata_scope, 3); 177 EXPECT_TRUE(multilayer.layers[0].depth.z_near.second); 178 EXPECT_NEAR(depth_representation_element_to_double( 179 multilayer.layers[0].depth.z_near.first), 180 1.456, 0.00001); 181 EXPECT_TRUE(multilayer.layers[0].depth.z_far.second); 182 EXPECT_NEAR(depth_representation_element_to_double( 183 multilayer.layers[0].depth.z_far.first), 184 9.786, 0.00001); 185 EXPECT_EQ(multilayer.layers[0].depth.depth_representation_type, 2); 186 ASSERT_EQ(multilayer.layers[0].local_metadata.size(), 2); 187 EXPECT_EQ(multilayer.layers[0].local_metadata[0].frame_idx, 4); 188 EXPECT_TRUE(multilayer.layers[0].local_metadata[0].depth.z_near.second); 189 EXPECT_NEAR(depth_representation_element_to_double( 190 multilayer.layers[0].local_metadata[0].depth.z_near.first), 191 2.78933, 0.00001); 192 EXPECT_TRUE(multilayer.layers[0].local_metadata[0].depth.z_far.second); 193 EXPECT_NEAR(depth_representation_element_to_double( 194 multilayer.layers[0].local_metadata[0].depth.z_far.first), 195 20.663, 0.00001); 196 EXPECT_EQ( 197 multilayer.layers[0].local_metadata[0].depth.depth_representation_type, 198 0); 199 EXPECT_EQ(multilayer.layers[0].local_metadata[1].frame_idx, 100); 200 EXPECT_TRUE(multilayer.layers[0].local_metadata[1].depth.z_near.second); 201 EXPECT_NEAR(depth_representation_element_to_double( 202 multilayer.layers[0].local_metadata[1].depth.z_near.first), 203 0, 0.00001); 204 EXPECT_TRUE(multilayer.layers[0].local_metadata[1].depth.z_far.second); 205 EXPECT_NEAR(depth_representation_element_to_double( 206 multilayer.layers[0].local_metadata[1].depth.z_far.first), 207 24, 0.00001); 208 EXPECT_EQ( 209 multilayer.layers[0].local_metadata[1].depth.depth_representation_type, 210 0); 211 EXPECT_EQ(multilayer.layers[1].layer_type, 1); 212 EXPECT_EQ(multilayer.layers[1].luma_plane_only_flag, 0); 213 EXPECT_EQ(multilayer.layers[1].layer_metadata_scope, 3); 214 EXPECT_TRUE(multilayer.layers[1].layer_color_description.second); 215 EXPECT_EQ(multilayer.layers[1].layer_color_description.first.color_range, 1); 216 EXPECT_EQ(multilayer.layers[1].layer_color_description.first.color_primaries, 217 1); 218 EXPECT_EQ(multilayer.layers[1] 219 .layer_color_description.first.transfer_characteristics, 220 13); 221 EXPECT_EQ( 222 multilayer.layers[1].layer_color_description.first.matrix_coefficients, 223 6); 224 EXPECT_EQ(multilayer.layers[1].local_metadata.size(), 0); 225 } 226 227 TEST(MultilayerMetadataTest, ParseInvalid) { 228 const std::string metadata = R"( 229 230 use_case: 3 # alpha 231 layers: 232 - layer_type: 5 # alpha 233 luma_plane_only_flag: 1 234 layer_metadata_scope: 3 # mixed 235 236 - layer_type: 1 # texture 237 luma_plane_only_flag: 0 238 layer_metadata_scope: 3 # mixed 239 240 - layer_type: 6 # depth => bad layer type 241 luma_plane_only_flag: 1 242 layer_metadata_scope: 3 # mixed 243 )"; 244 libaom_test::TempOutFile tmp_file(/*text_mode=*/true); 245 fprintf(tmp_file.file(), "%s", metadata.c_str()); 246 fflush(tmp_file.file()); 247 248 MultilayerMetadata multilayer; 249 // Invalid: has a depth layer even though use_case is alpha 250 EXPECT_FALSE( 251 parse_multilayer_file(tmp_file.file_name().c_str(), &multilayer)); 252 } 253 254 TEST(MultilayerMetadataTest, ParseBadIndent) { 255 const std::string metadata = R"( 256 257 use_case: 1 # global alpha 258 layers: 259 - layer_type: 5 # alpha 260 luma_plane_only_flag: 1 261 layer_metadata_scope: 2 # global 262 263 - layer_type: 1 # texture 264 luma_plane_only_flag: 0 265 layer_metadata_scope: 2 # global 266 )"; 267 libaom_test::TempOutFile tmp_file(/*text_mode=*/true); 268 fprintf(tmp_file.file(), "%s", metadata.c_str()); 269 fflush(tmp_file.file()); 270 271 MultilayerMetadata multilayer; 272 // Invalid indentation. 273 EXPECT_FALSE( 274 parse_multilayer_file(tmp_file.file_name().c_str(), &multilayer)); 275 } 276 277 TEST(MultilayerMetadataTest, ParseUnknownField) { 278 const std::string metadata = R"( 279 280 use_case: 1 # global alpha 281 layers: 282 - layer_type: 5 # alpha 283 luma_plane_only_flag: 1 284 layer_metadata_scope: 2 # global 285 foobar: 42 286 287 - layer_type: 1 # texture 288 luma_plane_only_flag: 0 289 layer_metadata_scope: 2 # global 290 )"; 291 libaom_test::TempOutFile tmp_file(/*text_mode=*/true); 292 fprintf(tmp_file.file(), "%s", metadata.c_str()); 293 fflush(tmp_file.file()); 294 295 MultilayerMetadata multilayer; 296 // Unkonwn field 'foobar'. 297 EXPECT_FALSE( 298 parse_multilayer_file(tmp_file.file_name().c_str(), &multilayer)); 299 } 300 301 void TestConversion(double v) { 302 DepthRepresentationElement e; 303 ASSERT_TRUE(double_to_depth_representation_element(v, &e)) << v; 304 EXPECT_NEAR(depth_representation_element_to_double(e), v, 0.000000001); 305 } 306 307 TEST(MultilayerMetadataTest, DoubleConversion) { 308 TestConversion(0.0); 309 TestConversion(1.789456e-5); 310 TestConversion(-1.789456e-5); 311 TestConversion(42); 312 TestConversion(6.7894564456); 313 TestConversion(6.7894564456e10); 314 TestConversion(-6.7894564456e10); 315 316 DepthRepresentationElement e; 317 // Too small. 318 ASSERT_FALSE(double_to_depth_representation_element(1e-10, &e)); 319 // Too big. 320 ASSERT_FALSE(double_to_depth_representation_element(1e+30, &e)); 321 } 322 323 } // namespace 324 } // namespace libaom_examples