/* * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h" #include "test/gmock.h" #include "test/gtest.h" namespace webrtc { namespace { using ::testing::ElementsAre; using ::testing::ElementsAreArray; using ::testing::IsEmpty; constexpr uint8_t kDeprecatedFlags = 0x30; TEST(RtpGenericFrameDescriptorExtensionTest, ParseFirstPacketOfIndependenSubFrame) { const int kTemporalLayer = 5; constexpr uint8_t kRaw[] = {0x80 | kTemporalLayer, 0x49, 0x12, 0x34}; RtpGenericFrameDescriptor descriptor; ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor)); EXPECT_TRUE(descriptor.FirstPacketInSubFrame()); EXPECT_FALSE(descriptor.LastPacketInSubFrame()); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), IsEmpty()); EXPECT_EQ(descriptor.TemporalLayer(), kTemporalLayer); EXPECT_EQ(descriptor.SpatialLayersBitmask(), 0x49); EXPECT_EQ(descriptor.FrameId(), 0x3412); } TEST(RtpGenericFrameDescriptorExtensionTest, WriteFirstPacketOfIndependenSubFrame) { const int kTemporalLayer = 5; uint8_t kRaw[] = {0x80 | kTemporalLayer | kDeprecatedFlags, 0x49, 0x12, 0x34}; RtpGenericFrameDescriptor descriptor; descriptor.SetFirstPacketInSubFrame(true); descriptor.SetTemporalLayer(kTemporalLayer); descriptor.SetSpatialLayersBitmask(0x49); descriptor.SetFrameId(0x3412); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor), sizeof(kRaw)); uint8_t buffer[sizeof(kRaw)]; EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor)); EXPECT_THAT(buffer, ElementsAreArray(kRaw)); } TEST(RtpGenericFrameDescriptorExtensionTest, ParseLastPacketOfSubFrame) { constexpr uint8_t kRaw[] = {0x40}; RtpGenericFrameDescriptor descriptor; ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor)); EXPECT_FALSE(descriptor.FirstPacketInSubFrame()); EXPECT_TRUE(descriptor.LastPacketInSubFrame()); } TEST(RtpGenericFrameDescriptorExtensionTest, WriteLastPacketOfSubFrame) { uint8_t kRaw[] = {0x40 | kDeprecatedFlags}; RtpGenericFrameDescriptor descriptor; descriptor.SetLastPacketInSubFrame(true); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor), sizeof(kRaw)); uint8_t buffer[sizeof(kRaw)]; EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor)); EXPECT_THAT(buffer, ElementsAreArray(kRaw)); } TEST(RtpGenericFrameDescriptorExtensionTest, ParseMinShortFrameDependencies) { constexpr uint16_t kDiff = 1; constexpr uint8_t kRaw[] = {0x88, 0x01, 0x00, 0x00, 0x04}; RtpGenericFrameDescriptor descriptor; ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor)); ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff)); } TEST(RtpGenericFrameDescriptorExtensionTest, WriteMinShortFrameDependencies) { constexpr uint16_t kDiff = 1; uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x04}; RtpGenericFrameDescriptor descriptor; descriptor.SetFirstPacketInSubFrame(true); descriptor.AddFrameDependencyDiff(kDiff); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor), sizeof(kRaw)); uint8_t buffer[sizeof(kRaw)]; EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor)); EXPECT_THAT(buffer, ElementsAreArray(kRaw)); } TEST(RtpGenericFrameDescriptorExtensionTest, ParseMaxShortFrameDependencies) { constexpr uint16_t kDiff = 0x3f; constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0xfc}; RtpGenericFrameDescriptor descriptor; ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor)); ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff)); } TEST(RtpGenericFrameDescriptorExtensionTest, WriteMaxShortFrameDependencies) { constexpr uint16_t kDiff = 0x3f; uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0xfc}; RtpGenericFrameDescriptor descriptor; descriptor.SetFirstPacketInSubFrame(true); descriptor.AddFrameDependencyDiff(kDiff); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor), sizeof(kRaw)); uint8_t buffer[sizeof(kRaw)]; EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor)); EXPECT_THAT(buffer, ElementsAreArray(kRaw)); } TEST(RtpGenericFrameDescriptorExtensionTest, ParseMinLongFrameDependencies) { constexpr uint16_t kDiff = 0x40; constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0x02, 0x01}; RtpGenericFrameDescriptor descriptor; ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor)); ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff)); } TEST(RtpGenericFrameDescriptorExtensionTest, WriteMinLongFrameDependencies) { constexpr uint16_t kDiff = 0x40; uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x02, 0x01}; RtpGenericFrameDescriptor descriptor; descriptor.SetFirstPacketInSubFrame(true); descriptor.AddFrameDependencyDiff(kDiff); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor), sizeof(kRaw)); uint8_t buffer[sizeof(kRaw)]; EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor)); EXPECT_THAT(buffer, ElementsAreArray(kRaw)); } TEST(RtpGenericFrameDescriptorExtensionTest, ParseLongFrameDependenciesAsBigEndian) { constexpr uint16_t kDiff = 0x7654 >> 2; constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0x54 | 0x02, 0x76}; RtpGenericFrameDescriptor descriptor; ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor)); ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff)); } TEST(RtpGenericFrameDescriptorExtensionTest, WriteLongFrameDependenciesAsBigEndian) { constexpr uint16_t kDiff = 0x7654 >> 2; uint8_t kRaw[] = { 0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x54 | 0x02, 0x76}; RtpGenericFrameDescriptor descriptor; descriptor.SetFirstPacketInSubFrame(true); descriptor.AddFrameDependencyDiff(kDiff); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor), sizeof(kRaw)); uint8_t buffer[sizeof(kRaw)]; EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor)); EXPECT_THAT(buffer, ElementsAreArray(kRaw)); } TEST(RtpGenericFrameDescriptorExtensionTest, ParseMaxLongFrameDependencies) { constexpr uint16_t kDiff = 0x3fff; constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0xfe, 0xff}; RtpGenericFrameDescriptor descriptor; ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor)); ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff)); } TEST(RtpGenericFrameDescriptorExtensionTest, WriteMaxLongFrameDependencies) { constexpr uint16_t kDiff = 0x3fff; uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0xfe, 0xff}; RtpGenericFrameDescriptor descriptor; descriptor.SetFirstPacketInSubFrame(true); descriptor.AddFrameDependencyDiff(kDiff); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor), sizeof(kRaw)); uint8_t buffer[sizeof(kRaw)]; EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor)); EXPECT_THAT(buffer, ElementsAreArray(kRaw)); } TEST(RtpGenericFrameDescriptorExtensionTest, ParseTwoFrameDependencies) { constexpr uint16_t kDiff1 = 9; constexpr uint16_t kDiff2 = 15; constexpr uint8_t kRaw[] = { 0xb8, 0x01, 0x00, 0x00, (kDiff1 << 2) | 0x01, kDiff2 << 2}; RtpGenericFrameDescriptor descriptor; ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor)); ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff1, kDiff2)); } TEST(RtpGenericFrameDescriptorExtensionTest, WriteTwoFrameDependencies) { constexpr uint16_t kDiff1 = 9; constexpr uint16_t kDiff2 = 15; uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, (kDiff1 << 2) | 0x01, kDiff2 << 2}; RtpGenericFrameDescriptor descriptor; descriptor.SetFirstPacketInSubFrame(true); descriptor.AddFrameDependencyDiff(kDiff1); descriptor.AddFrameDependencyDiff(kDiff2); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor), sizeof(kRaw)); uint8_t buffer[sizeof(kRaw)]; EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor)); EXPECT_THAT(buffer, ElementsAreArray(kRaw)); } TEST(RtpGenericFrameDescriptorExtensionTest, ParseResolutionOnIndependentFrame) { constexpr int kWidth = 0x2468; constexpr int kHeight = 0x6543; constexpr uint8_t kRaw[] = {0xb0, 0x01, 0x00, 0x00, 0x24, 0x68, 0x65, 0x43}; RtpGenericFrameDescriptor descriptor; ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor)); EXPECT_EQ(descriptor.Width(), kWidth); EXPECT_EQ(descriptor.Height(), kHeight); } TEST(RtpGenericFrameDescriptorExtensionTest, WriteResolutionOnIndependentFrame) { constexpr int kWidth = 0x2468; constexpr int kHeight = 0x6543; uint8_t kRaw[] = { 0x80 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x24, 0x68, 0x65, 0x43}; RtpGenericFrameDescriptor descriptor; descriptor.SetFirstPacketInSubFrame(true); descriptor.SetResolution(kWidth, kHeight); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor), sizeof(kRaw)); uint8_t buffer[sizeof(kRaw)]; EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor)); EXPECT_THAT(buffer, ElementsAreArray(kRaw)); } } // namespace } // namespace webrtc