tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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