tor-browser

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

rtp_video_header_unittest.cc (13595B)


      1 /*
      2 *  Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 
     11 #include "modules/rtp_rtcp/source/rtp_video_header.h"
     12 
     13 #include <cstdint>
     14 #include <optional>
     15 
     16 #include "absl/container/inlined_vector.h"
     17 #include "api/transport/rtp/dependency_descriptor.h"
     18 #include "api/video/video_codec_type.h"
     19 #include "api/video/video_content_type.h"
     20 #include "api/video/video_frame_metadata.h"
     21 #include "api/video/video_frame_type.h"
     22 #include "api/video/video_rotation.h"
     23 #include "modules/video_coding/codecs/h264/include/h264_globals.h"
     24 #include "modules/video_coding/codecs/vp8/include/vp8_globals.h"
     25 #include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
     26 #include "test/gmock.h"
     27 #include "test/gtest.h"
     28 
     29 namespace webrtc {
     30 namespace {
     31 
     32 using ::testing::ElementsAre;
     33 using ::testing::IsEmpty;
     34 
     35 TEST(RTPVideoHeaderTest, FrameType_GetAsMetadata) {
     36  RTPVideoHeader video_header;
     37  video_header.frame_type = VideoFrameType::kVideoFrameKey;
     38  VideoFrameMetadata metadata = video_header.GetAsMetadata();
     39  EXPECT_EQ(metadata.GetFrameType(), VideoFrameType::kVideoFrameKey);
     40 }
     41 
     42 TEST(RTPVideoHeaderTest, FrameType_FromMetadata) {
     43  VideoFrameMetadata metadata;
     44  metadata.SetFrameType(VideoFrameType::kVideoFrameKey);
     45  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
     46  EXPECT_EQ(video_header.frame_type, VideoFrameType::kVideoFrameKey);
     47 }
     48 
     49 TEST(RTPVideoHeaderTest, Width_GetAsMetadata) {
     50  RTPVideoHeader video_header;
     51  video_header.width = 1280u;
     52  VideoFrameMetadata metadata = video_header.GetAsMetadata();
     53  EXPECT_EQ(metadata.GetWidth(), 1280u);
     54 }
     55 
     56 TEST(RTPVideoHeaderTest, Width_FromMetadata) {
     57  VideoFrameMetadata metadata;
     58  metadata.SetWidth(1280u);
     59  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
     60  EXPECT_EQ(video_header.width, 1280u);
     61 }
     62 
     63 TEST(RTPVideoHeaderTest, Height_GetAsMetadata) {
     64  RTPVideoHeader video_header;
     65  video_header.height = 720u;
     66  VideoFrameMetadata metadata = video_header.GetAsMetadata();
     67  EXPECT_EQ(metadata.GetHeight(), 720u);
     68 }
     69 
     70 TEST(RTPVideoHeaderTest, Height_FromMetadata) {
     71  VideoFrameMetadata metadata;
     72  metadata.SetHeight(720u);
     73  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
     74  EXPECT_EQ(video_header.height, 720u);
     75 }
     76 
     77 TEST(RTPVideoHeaderTest, Rotation_GetAsMetadata) {
     78  RTPVideoHeader video_header;
     79  video_header.rotation = VideoRotation::kVideoRotation_90;
     80  VideoFrameMetadata metadata = video_header.GetAsMetadata();
     81  EXPECT_EQ(metadata.GetRotation(), VideoRotation::kVideoRotation_90);
     82 }
     83 
     84 TEST(RTPVideoHeaderTest, Rotation_FromMetadata) {
     85  VideoFrameMetadata metadata;
     86  metadata.SetRotation(VideoRotation::kVideoRotation_90);
     87  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
     88  EXPECT_EQ(video_header.rotation, VideoRotation::kVideoRotation_90);
     89 }
     90 
     91 TEST(RTPVideoHeaderTest, ContentType_GetAsMetadata) {
     92  RTPVideoHeader video_header;
     93  video_header.content_type = VideoContentType::SCREENSHARE;
     94  VideoFrameMetadata metadata = video_header.GetAsMetadata();
     95  EXPECT_EQ(metadata.GetContentType(), VideoContentType::SCREENSHARE);
     96 }
     97 
     98 TEST(RTPVideoHeaderTest, ContentType_FromMetadata) {
     99  VideoFrameMetadata metadata;
    100  metadata.SetContentType(VideoContentType::SCREENSHARE);
    101  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    102  EXPECT_EQ(video_header.content_type, VideoContentType::SCREENSHARE);
    103 }
    104 
    105 TEST(RTPVideoHeaderTest, FrameId_GetAsMetadata) {
    106  RTPVideoHeader video_header;
    107  RTPVideoHeader::GenericDescriptorInfo& generic =
    108      video_header.generic.emplace();
    109  generic.frame_id = 10;
    110  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    111  EXPECT_EQ(metadata.GetFrameId().value(), 10);
    112 }
    113 
    114 TEST(RTPVideoHeaderTest, FrameId_GetAsMetadataWhenGenericIsMissing) {
    115  RTPVideoHeader video_header;
    116  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    117  ASSERT_FALSE(video_header.generic);
    118  EXPECT_FALSE(metadata.GetFrameId().has_value());
    119 }
    120 
    121 TEST(RTPVideoHeaderTest, FrameId_FromMetadata) {
    122  VideoFrameMetadata metadata;
    123  metadata.SetFrameId(10);
    124  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    125  EXPECT_TRUE(video_header.generic.has_value());
    126  EXPECT_EQ(video_header.generic->frame_id, 10);
    127 }
    128 
    129 TEST(RTPVideoHeaderTest, FrameId_FromMetadataWhenFrameIdIsMissing) {
    130  VideoFrameMetadata metadata;
    131  metadata.SetFrameId(std::nullopt);
    132  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    133  EXPECT_FALSE(video_header.generic.has_value());
    134 }
    135 
    136 TEST(RTPVideoHeaderTest, SpatialIndex_GetAsMetadata) {
    137  RTPVideoHeader video_header;
    138  RTPVideoHeader::GenericDescriptorInfo& generic =
    139      video_header.generic.emplace();
    140  generic.spatial_index = 2;
    141  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    142  EXPECT_EQ(metadata.GetSpatialIndex(), 2);
    143 }
    144 
    145 TEST(RTPVideoHeaderTest, SpatialIndex_GetAsMetadataWhenGenericIsMissing) {
    146  RTPVideoHeader video_header;
    147  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    148  ASSERT_FALSE(video_header.generic);
    149  EXPECT_EQ(metadata.GetSpatialIndex(), 0);
    150 }
    151 
    152 TEST(RTPVideoHeaderTest, SpatialIndex_FromMetadata) {
    153  VideoFrameMetadata metadata;
    154  metadata.SetFrameId(123);  // Must have a frame ID for related properties.
    155  metadata.SetSpatialIndex(2);
    156  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    157  EXPECT_TRUE(video_header.generic.has_value());
    158  EXPECT_EQ(video_header.generic->spatial_index, 2);
    159 }
    160 
    161 TEST(RTPVideoHeaderTest, TemporalIndex_GetAsMetadata) {
    162  RTPVideoHeader video_header;
    163  RTPVideoHeader::GenericDescriptorInfo& generic =
    164      video_header.generic.emplace();
    165  generic.temporal_index = 3;
    166  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    167  EXPECT_EQ(metadata.GetTemporalIndex(), 3);
    168 }
    169 
    170 TEST(RTPVideoHeaderTest, TemporalIndex_GetAsMetadataWhenGenericIsMissing) {
    171  RTPVideoHeader video_header;
    172  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    173  ASSERT_FALSE(video_header.generic);
    174  EXPECT_EQ(metadata.GetTemporalIndex(), 0);
    175 }
    176 
    177 TEST(RTPVideoHeaderTest, TemporalIndex_FromMetadata) {
    178  VideoFrameMetadata metadata;
    179  metadata.SetFrameId(123);  // Must have a frame ID for related properties.
    180  metadata.SetTemporalIndex(3);
    181  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    182  EXPECT_TRUE(video_header.generic.has_value());
    183  EXPECT_EQ(video_header.generic->temporal_index, 3);
    184 }
    185 
    186 TEST(RTPVideoHeaderTest, FrameDependencies_GetAsMetadata) {
    187  RTPVideoHeader video_header;
    188  RTPVideoHeader::GenericDescriptorInfo& generic =
    189      video_header.generic.emplace();
    190  generic.dependencies = {5, 6, 7};
    191  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    192  EXPECT_THAT(metadata.GetFrameDependencies(), ElementsAre(5, 6, 7));
    193 }
    194 
    195 TEST(RTPVideoHeaderTest, FrameDependency_GetAsMetadataWhenGenericIsMissing) {
    196  RTPVideoHeader video_header;
    197  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    198  ASSERT_FALSE(video_header.generic);
    199  EXPECT_THAT(metadata.GetFrameDependencies(), IsEmpty());
    200 }
    201 
    202 TEST(RTPVideoHeaderTest, FrameDependencies_FromMetadata) {
    203  VideoFrameMetadata metadata;
    204  absl::InlinedVector<int64_t, 5> dependencies = {5, 6, 7};
    205  metadata.SetFrameId(123);  // Must have a frame ID for related properties.
    206  metadata.SetFrameDependencies(dependencies);
    207  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    208  EXPECT_TRUE(video_header.generic.has_value());
    209  EXPECT_THAT(video_header.generic->dependencies, ElementsAre(5, 6, 7));
    210 }
    211 
    212 TEST(RTPVideoHeaderTest, DecodeTargetIndications_GetAsMetadata) {
    213  RTPVideoHeader video_header;
    214  RTPVideoHeader::GenericDescriptorInfo& generic =
    215      video_header.generic.emplace();
    216  generic.decode_target_indications = {DecodeTargetIndication::kSwitch};
    217  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    218  EXPECT_THAT(metadata.GetDecodeTargetIndications(),
    219              ElementsAre(DecodeTargetIndication::kSwitch));
    220 }
    221 
    222 TEST(RTPVideoHeaderTest,
    223     DecodeTargetIndications_GetAsMetadataWhenGenericIsMissing) {
    224  RTPVideoHeader video_header;
    225  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    226  ASSERT_FALSE(video_header.generic);
    227  EXPECT_THAT(metadata.GetDecodeTargetIndications(), IsEmpty());
    228 }
    229 
    230 TEST(RTPVideoHeaderTest, DecodeTargetIndications_FromMetadata) {
    231  VideoFrameMetadata metadata;
    232  absl::InlinedVector<DecodeTargetIndication, 10> decode_target_indications = {
    233      DecodeTargetIndication::kSwitch};
    234  metadata.SetFrameId(123);  // Must have a frame ID for related properties.
    235  metadata.SetDecodeTargetIndications(decode_target_indications);
    236  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    237  EXPECT_TRUE(video_header.generic.has_value());
    238  EXPECT_THAT(video_header.generic->decode_target_indications,
    239              ElementsAre(DecodeTargetIndication::kSwitch));
    240 }
    241 
    242 TEST(RTPVideoHeaderTest, IsLastFrameInPicture_GetAsMetadata) {
    243  RTPVideoHeader video_header;
    244  video_header.is_last_frame_in_picture = false;
    245  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    246  EXPECT_FALSE(metadata.GetIsLastFrameInPicture());
    247 }
    248 
    249 TEST(RTPVideoHeaderTest, IsLastFrameInPicture_FromMetadata) {
    250  VideoFrameMetadata metadata;
    251  metadata.SetIsLastFrameInPicture(false);
    252  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    253  EXPECT_FALSE(video_header.is_last_frame_in_picture);
    254 }
    255 
    256 TEST(RTPVideoHeaderTest, SimulcastIdx_GetAsMetadata) {
    257  RTPVideoHeader video_header;
    258  video_header.simulcastIdx = 123;
    259  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    260  EXPECT_EQ(metadata.GetSimulcastIdx(), 123);
    261 }
    262 
    263 TEST(RTPVideoHeaderTest, SimulcastIdx_FromMetadata) {
    264  VideoFrameMetadata metadata;
    265  metadata.SetSimulcastIdx(123);
    266  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    267  EXPECT_EQ(video_header.simulcastIdx, 123);
    268 }
    269 
    270 TEST(RTPVideoHeaderTest, Codec_GetAsMetadata) {
    271  RTPVideoHeader video_header;
    272  video_header.codec = VideoCodecType::kVideoCodecVP9;
    273  video_header.video_type_header = RTPVideoHeaderVP9();
    274  VideoFrameMetadata metadata = video_header.GetAsMetadata();
    275  EXPECT_EQ(metadata.GetCodec(), VideoCodecType::kVideoCodecVP9);
    276 }
    277 
    278 TEST(RTPVideoHeaderTest, Codec_FromMetadata) {
    279  VideoFrameMetadata metadata;
    280  metadata.SetCodec(VideoCodecType::kVideoCodecVP9);
    281  metadata.SetRTPVideoHeaderCodecSpecifics(RTPVideoHeaderVP9());
    282  RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    283  EXPECT_EQ(video_header.codec, VideoCodecType::kVideoCodecVP9);
    284 }
    285 
    286 TEST(RTPVideoHeaderTest, RTPVideoHeaderCodecSpecifics_GetAsMetadata) {
    287  RTPVideoHeader video_header;
    288  {
    289    video_header.codec = VideoCodecType::kVideoCodecVP8;
    290    RTPVideoHeaderVP8 vp8_specifics;
    291    vp8_specifics.InitRTPVideoHeaderVP8();
    292    vp8_specifics.pictureId = 42;
    293    video_header.video_type_header = vp8_specifics;
    294    VideoFrameMetadata metadata = video_header.GetAsMetadata();
    295    EXPECT_EQ(
    296        std::get<RTPVideoHeaderVP8>(metadata.GetRTPVideoHeaderCodecSpecifics())
    297            .pictureId,
    298        vp8_specifics.pictureId);
    299  }
    300  {
    301    video_header.codec = VideoCodecType::kVideoCodecVP9;
    302    RTPVideoHeaderVP9 vp9_specifics;
    303    vp9_specifics.InitRTPVideoHeaderVP9();
    304    vp9_specifics.max_picture_id = 42;
    305    video_header.video_type_header = vp9_specifics;
    306    VideoFrameMetadata metadata = video_header.GetAsMetadata();
    307    EXPECT_EQ(
    308        std::get<RTPVideoHeaderVP9>(metadata.GetRTPVideoHeaderCodecSpecifics())
    309            .max_picture_id,
    310        vp9_specifics.max_picture_id);
    311  }
    312  {
    313    video_header.codec = VideoCodecType::kVideoCodecH264;
    314    RTPVideoHeaderH264 h264_specifics;
    315    h264_specifics.nalu_type = 42;
    316    video_header.video_type_header = h264_specifics;
    317    VideoFrameMetadata metadata = video_header.GetAsMetadata();
    318    EXPECT_EQ(
    319        std::get<RTPVideoHeaderH264>(metadata.GetRTPVideoHeaderCodecSpecifics())
    320            .nalu_type,
    321        h264_specifics.nalu_type);
    322  }
    323 }
    324 
    325 TEST(RTPVideoHeaderTest, RTPVideoHeaderCodecSpecifics_FromMetadata) {
    326  VideoFrameMetadata metadata;
    327  {
    328    metadata.SetCodec(VideoCodecType::kVideoCodecVP8);
    329    RTPVideoHeaderVP8 vp8_specifics;
    330    vp8_specifics.InitRTPVideoHeaderVP8();
    331    vp8_specifics.pictureId = 42;
    332    metadata.SetRTPVideoHeaderCodecSpecifics(vp8_specifics);
    333    RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    334    EXPECT_EQ(
    335        std::get<RTPVideoHeaderVP8>(video_header.video_type_header).pictureId,
    336        42);
    337  }
    338  {
    339    metadata.SetCodec(VideoCodecType::kVideoCodecVP9);
    340    RTPVideoHeaderVP9 vp9_specifics;
    341    vp9_specifics.InitRTPVideoHeaderVP9();
    342    vp9_specifics.max_picture_id = 42;
    343    metadata.SetRTPVideoHeaderCodecSpecifics(vp9_specifics);
    344    RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    345    EXPECT_EQ(std::get<RTPVideoHeaderVP9>(video_header.video_type_header)
    346                  .max_picture_id,
    347              42);
    348  }
    349  {
    350    metadata.SetCodec(VideoCodecType::kVideoCodecH264);
    351    RTPVideoHeaderH264 h264_specifics;
    352    h264_specifics.nalu_type = 42;
    353    metadata.SetRTPVideoHeaderCodecSpecifics(h264_specifics);
    354    RTPVideoHeader video_header = RTPVideoHeader::FromMetadata(metadata);
    355    EXPECT_EQ(
    356        std::get<RTPVideoHeaderH264>(video_header.video_type_header).nalu_type,
    357        42);
    358  }
    359 }
    360 
    361 }  // namespace
    362 }  // namespace webrtc