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