Delete generic frame descriptor v1 trait and enum value

Bug: webrtc:11358
Change-Id: I272a45881f8ef9963b502c6d17edc97e7d9fbc8e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/173582
Reviewed-by: Markus Handell <handellm@webrtc.org>
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31089}
This commit is contained in:
Danil Chapovalov 2020-04-14 16:11:59 +02:00 committed by Commit Bot
parent efdff53176
commit ec9fc2208e
12 changed files with 85 additions and 292 deletions

View file

@ -70,7 +70,6 @@ enum RTPExtensionType : int {
kRtpExtensionMid, kRtpExtensionMid,
kRtpExtensionGenericFrameDescriptor00, kRtpExtensionGenericFrameDescriptor00,
kRtpExtensionGenericFrameDescriptor = kRtpExtensionGenericFrameDescriptor00, kRtpExtensionGenericFrameDescriptor = kRtpExtensionGenericFrameDescriptor00,
kRtpExtensionGenericFrameDescriptor01,
kRtpExtensionGenericFrameDescriptor02, kRtpExtensionGenericFrameDescriptor02,
kRtpExtensionColorSpace, kRtpExtensionColorSpace,
kRtpExtensionNumberOfExtensions // Must be the last entity in the enum. kRtpExtensionNumberOfExtensions // Must be the last entity in the enum.

View file

@ -38,15 +38,6 @@ class RtpGenericFrameDescriptor {
bool LastPacketInSubFrame() const { return end_of_subframe_; } bool LastPacketInSubFrame() const { return end_of_subframe_; }
void SetLastPacketInSubFrame(bool last) { end_of_subframe_ = last; } void SetLastPacketInSubFrame(bool last) { end_of_subframe_ = last; }
// Denotes whether the frame is discardable. That is, whether skipping it
// would have no effect on the decodability of subsequent frames.
// An absl::optional is used because version 0 of the extension did not
// support this flag. (The optional aspect is relevant only when parsing.)
// TODO(bugs.webrtc.org/10243): Make this into a plain bool when v00 of
// the extension is deprecated.
absl::optional<bool> Discardable() const { return discardable_; }
void SetDiscardable(bool discardable) { discardable_ = discardable; }
// Properties below undefined if !FirstPacketInSubFrame() // Properties below undefined if !FirstPacketInSubFrame()
// Valid range for temporal layer: [0, 7] // Valid range for temporal layer: [0, 7]
int TemporalLayer() const; int TemporalLayer() const;
@ -74,8 +65,6 @@ class RtpGenericFrameDescriptor {
bool beginning_of_subframe_ = false; bool beginning_of_subframe_ = false;
bool end_of_subframe_ = false; bool end_of_subframe_ = false;
absl::optional<bool> discardable_;
uint16_t frame_id_ = 0; uint16_t frame_id_ = 0;
uint8_t spatial_layers_ = 1; uint8_t spatial_layers_ = 1;
uint8_t temporal_layer_ = 0; uint8_t temporal_layer_ = 0;

View file

@ -20,18 +20,16 @@ constexpr uint8_t kFlagEndOfSubframe = 0x40;
// In version 00, the flags F and L in the first byte correspond to // In version 00, the flags F and L in the first byte correspond to
// kFlagFirstSubframeV00 and kFlagLastSubframeV00. In practice, they were // kFlagFirstSubframeV00 and kFlagLastSubframeV00. In practice, they were
// always set to |true|. In version 01, these flags are deprecated, and we use // always set to |true|.
// one of their bits for the discardability flag.
constexpr uint8_t kFlagFirstSubframeV00 = 0x20; constexpr uint8_t kFlagFirstSubframeV00 = 0x20;
constexpr uint8_t kFlagLastSubframeV00 = 0x10; constexpr uint8_t kFlagLastSubframeV00 = 0x10;
constexpr uint8_t kFlagDiscardableV01 = 0x10;
constexpr uint8_t kFlagDependencies = 0x08; constexpr uint8_t kFlagDependencies = 0x08;
constexpr uint8_t kMaskTemporalLayer = 0x07; constexpr uint8_t kMaskTemporalLayer = 0x07;
constexpr uint8_t kFlagMoreDependencies = 0x01; constexpr uint8_t kFlagMoreDependencies = 0x01;
constexpr uint8_t kFlageXtendedOffset = 0x02; constexpr uint8_t kFlageXtendedOffset = 0x02;
} // namespace
// 0 1 2 3 4 5 6 7 // 0 1 2 3 4 5 6 7
// +-+-+-+-+-+-+-+-+ // +-+-+-+-+-+-+-+-+
// |B|E|F|L|D| T | // |B|E|F|L|D| T |
@ -58,9 +56,10 @@ constexpr uint8_t kFlageXtendedOffset = 0x02;
// +---------------+ // +---------------+
// | ... | // | ... |
// +-+-+-+-+-+-+-+-+ // +-+-+-+-+-+-+-+-+
constexpr RTPExtensionType RtpGenericFrameDescriptorExtension00::kId;
constexpr char RtpGenericFrameDescriptorExtension00::kUri[];
bool RtpGenericFrameDescriptorExtensionParse( bool RtpGenericFrameDescriptorExtension00::Parse(
size_t version,
rtc::ArrayView<const uint8_t> data, rtc::ArrayView<const uint8_t> data,
RtpGenericFrameDescriptor* descriptor) { RtpGenericFrameDescriptor* descriptor) {
if (data.empty()) { if (data.empty()) {
@ -71,10 +70,6 @@ bool RtpGenericFrameDescriptorExtensionParse(
descriptor->SetFirstPacketInSubFrame(begins_subframe); descriptor->SetFirstPacketInSubFrame(begins_subframe);
descriptor->SetLastPacketInSubFrame((data[0] & kFlagEndOfSubframe) != 0); descriptor->SetLastPacketInSubFrame((data[0] & kFlagEndOfSubframe) != 0);
if (version >= 1) {
descriptor->SetDiscardable((data[0] & kFlagDiscardableV01) != 0);
}
// Parse Subframe details provided in 1st packet of subframe. // Parse Subframe details provided in 1st packet of subframe.
if (!begins_subframe) { if (!begins_subframe) {
return data.size() == 1; return data.size() == 1;
@ -115,7 +110,7 @@ bool RtpGenericFrameDescriptorExtensionParse(
return true; return true;
} }
size_t RtpGenericFrameDescriptorExtensionValueSize( size_t RtpGenericFrameDescriptorExtension00::ValueSize(
const RtpGenericFrameDescriptor& descriptor) { const RtpGenericFrameDescriptor& descriptor) {
if (!descriptor.FirstPacketInSubFrame()) if (!descriptor.FirstPacketInSubFrame())
return 1; return 1;
@ -132,23 +127,15 @@ size_t RtpGenericFrameDescriptorExtensionValueSize(
return size; return size;
} }
bool RtpGenericFrameDescriptorExtensionWrite( bool RtpGenericFrameDescriptorExtension00::Write(
size_t version,
rtc::ArrayView<uint8_t> data, rtc::ArrayView<uint8_t> data,
const RtpGenericFrameDescriptor& descriptor) { const RtpGenericFrameDescriptor& descriptor) {
RTC_CHECK_EQ(data.size(), RTC_CHECK_EQ(data.size(), ValueSize(descriptor));
RtpGenericFrameDescriptorExtensionValueSize(descriptor));
uint8_t base_header = uint8_t base_header =
(descriptor.FirstPacketInSubFrame() ? kFlagBeginOfSubframe : 0) | (descriptor.FirstPacketInSubFrame() ? kFlagBeginOfSubframe : 0) |
(descriptor.LastPacketInSubFrame() ? kFlagEndOfSubframe : 0); (descriptor.LastPacketInSubFrame() ? kFlagEndOfSubframe : 0);
if (version == 0) {
base_header |= kFlagFirstSubframeV00; base_header |= kFlagFirstSubframeV00;
base_header |= kFlagLastSubframeV00; base_header |= kFlagLastSubframeV00;
} else if (version >= 1) {
const absl::optional<bool> discardable = descriptor.Discardable();
base_header |= (discardable.value_or(false) ? kFlagDiscardableV01 : 0);
}
if (!descriptor.FirstPacketInSubFrame()) { if (!descriptor.FirstPacketInSubFrame()) {
data[0] = base_header; data[0] = base_header;
@ -184,48 +171,4 @@ bool RtpGenericFrameDescriptorExtensionWrite(
return true; return true;
} }
} // namespace
constexpr RTPExtensionType RtpGenericFrameDescriptorExtension00::kId;
constexpr char RtpGenericFrameDescriptorExtension00::kUri[];
bool RtpGenericFrameDescriptorExtension00::Parse(
rtc::ArrayView<const uint8_t> data,
RtpGenericFrameDescriptor* descriptor) {
return RtpGenericFrameDescriptorExtensionParse(0, data, descriptor);
}
size_t RtpGenericFrameDescriptorExtension00::ValueSize(
const RtpGenericFrameDescriptor& descriptor) {
// No difference between existing versions.
return RtpGenericFrameDescriptorExtensionValueSize(descriptor);
}
bool RtpGenericFrameDescriptorExtension00::Write(
rtc::ArrayView<uint8_t> data,
const RtpGenericFrameDescriptor& descriptor) {
return RtpGenericFrameDescriptorExtensionWrite(0, data, descriptor);
}
constexpr RTPExtensionType RtpGenericFrameDescriptorExtension01::kId;
constexpr char RtpGenericFrameDescriptorExtension01::kUri[];
bool RtpGenericFrameDescriptorExtension01::Parse(
rtc::ArrayView<const uint8_t> data,
RtpGenericFrameDescriptor* descriptor) {
return RtpGenericFrameDescriptorExtensionParse(1, data, descriptor);
}
size_t RtpGenericFrameDescriptorExtension01::ValueSize(
const RtpGenericFrameDescriptor& descriptor) {
// No difference between existing versions.
return RtpGenericFrameDescriptorExtensionValueSize(descriptor);
}
bool RtpGenericFrameDescriptorExtension01::Write(
rtc::ArrayView<uint8_t> data,
const RtpGenericFrameDescriptor& descriptor) {
return RtpGenericFrameDescriptorExtensionWrite(1, data, descriptor);
}
} // namespace webrtc } // namespace webrtc

View file

@ -35,22 +35,6 @@ class RtpGenericFrameDescriptorExtension00 {
const RtpGenericFrameDescriptor& descriptor); const RtpGenericFrameDescriptor& descriptor);
}; };
class RtpGenericFrameDescriptorExtension01 {
public:
using value_type = RtpGenericFrameDescriptor;
static constexpr RTPExtensionType kId = kRtpExtensionGenericFrameDescriptor01;
static constexpr char kUri[] =
"http://www.webrtc.org/experiments/rtp-hdrext/"
"generic-frame-descriptor-01";
static constexpr int kMaxSizeBytes = 16;
static bool Parse(rtc::ArrayView<const uint8_t> data,
RtpGenericFrameDescriptor* descriptor);
static size_t ValueSize(const RtpGenericFrameDescriptor& descriptor);
static bool Write(rtc::ArrayView<uint8_t> data,
const RtpGenericFrameDescriptor& descriptor);
};
} // namespace webrtc } // namespace webrtc
#endif // MODULES_RTP_RTCP_SOURCE_RTP_GENERIC_FRAME_DESCRIPTOR_EXTENSION_H_ #endif // MODULES_RTP_RTCP_SOURCE_RTP_GENERIC_FRAME_DESCRIPTOR_EXTENSION_H_

View file

@ -23,87 +23,27 @@ constexpr uint8_t kDeprecatedFlags = 0x30;
// TODO(danilchap): Add fuzzer to test for various invalid inputs. // TODO(danilchap): Add fuzzer to test for various invalid inputs.
class RtpGenericFrameDescriptorExtensionTest TEST(RtpGenericFrameDescriptorExtensionTest,
: public ::testing::Test,
public ::testing::WithParamInterface<int> {
public:
RtpGenericFrameDescriptorExtensionTest() : version_(GetParam()) {}
bool Parse(rtc::ArrayView<const uint8_t> data,
RtpGenericFrameDescriptor* descriptor) const {
switch (version_) {
case 0:
return RtpGenericFrameDescriptorExtension00::Parse(data, descriptor);
case 1:
return RtpGenericFrameDescriptorExtension01::Parse(data, descriptor);
}
RTC_NOTREACHED();
return false;
}
size_t ValueSize(const RtpGenericFrameDescriptor& descriptor) const {
switch (version_) {
case 0:
return RtpGenericFrameDescriptorExtension00::ValueSize(descriptor);
case 1:
return RtpGenericFrameDescriptorExtension01::ValueSize(descriptor);
}
RTC_NOTREACHED();
return 0;
}
bool Write(rtc::ArrayView<uint8_t> data,
const RtpGenericFrameDescriptor& descriptor) const {
switch (version_) {
case 0:
return RtpGenericFrameDescriptorExtension00::Write(data, descriptor);
case 1:
return RtpGenericFrameDescriptorExtension01::Write(data, descriptor);
}
RTC_NOTREACHED();
return false;
}
protected:
const int version_;
};
INSTANTIATE_TEST_SUITE_P(All,
RtpGenericFrameDescriptorExtensionTest,
::testing::Values(0, 1));
TEST_P(RtpGenericFrameDescriptorExtensionTest,
ParseFirstPacketOfIndependenSubFrame) { ParseFirstPacketOfIndependenSubFrame) {
const int kTemporalLayer = 5; const int kTemporalLayer = 5;
constexpr uint8_t kRaw[] = {0x80 | kTemporalLayer, 0x49, 0x12, 0x34}; constexpr uint8_t kRaw[] = {0x80 | kTemporalLayer, 0x49, 0x12, 0x34};
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
ASSERT_TRUE(Parse(kRaw, &descriptor)); ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
EXPECT_TRUE(descriptor.FirstPacketInSubFrame()); EXPECT_TRUE(descriptor.FirstPacketInSubFrame());
EXPECT_FALSE(descriptor.LastPacketInSubFrame()); EXPECT_FALSE(descriptor.LastPacketInSubFrame());
const absl::optional<bool> discardable = descriptor.Discardable();
if (version_ == 0) {
ASSERT_FALSE(discardable.has_value());
} else {
ASSERT_TRUE(discardable.has_value());
EXPECT_FALSE(discardable.value());
}
EXPECT_THAT(descriptor.FrameDependenciesDiffs(), IsEmpty()); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), IsEmpty());
EXPECT_EQ(descriptor.TemporalLayer(), kTemporalLayer); EXPECT_EQ(descriptor.TemporalLayer(), kTemporalLayer);
EXPECT_EQ(descriptor.SpatialLayersBitmask(), 0x49); EXPECT_EQ(descriptor.SpatialLayersBitmask(), 0x49);
EXPECT_EQ(descriptor.FrameId(), 0x3412); EXPECT_EQ(descriptor.FrameId(), 0x3412);
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, TEST(RtpGenericFrameDescriptorExtensionTest,
WriteFirstPacketOfIndependenSubFrame) { WriteFirstPacketOfIndependenSubFrame) {
const int kTemporalLayer = 5; const int kTemporalLayer = 5;
uint8_t kRaw[] = {0x80 | kTemporalLayer, 0x49, 0x12, 0x34}; uint8_t kRaw[] = {0x80 | kTemporalLayer | kDeprecatedFlags, 0x49, 0x12, 0x34};
if (version_ == 0) {
kRaw[0] |= kDeprecatedFlags;
}
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
descriptor.SetFirstPacketInSubFrame(true); descriptor.SetFirstPacketInSubFrame(true);
@ -111,263 +51,215 @@ TEST_P(RtpGenericFrameDescriptorExtensionTest,
descriptor.SetSpatialLayersBitmask(0x49); descriptor.SetSpatialLayersBitmask(0x49);
descriptor.SetFrameId(0x3412); descriptor.SetFrameId(0x3412);
ASSERT_EQ(ValueSize(descriptor), sizeof(kRaw)); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
sizeof(kRaw));
uint8_t buffer[sizeof(kRaw)]; uint8_t buffer[sizeof(kRaw)];
EXPECT_TRUE(Write(buffer, descriptor)); EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
EXPECT_THAT(buffer, ElementsAreArray(kRaw)); EXPECT_THAT(buffer, ElementsAreArray(kRaw));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, ParseLastPacketOfSubFrame) { TEST(RtpGenericFrameDescriptorExtensionTest, ParseLastPacketOfSubFrame) {
constexpr uint8_t kRaw[] = {0x40}; constexpr uint8_t kRaw[] = {0x40};
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
ASSERT_TRUE(Parse(kRaw, &descriptor)); ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
EXPECT_FALSE(descriptor.FirstPacketInSubFrame()); EXPECT_FALSE(descriptor.FirstPacketInSubFrame());
const absl::optional<bool> discardable = descriptor.Discardable();
if (version_ == 0) {
ASSERT_FALSE(discardable.has_value());
} else {
ASSERT_TRUE(discardable.has_value());
EXPECT_FALSE(discardable.value());
}
EXPECT_TRUE(descriptor.LastPacketInSubFrame()); EXPECT_TRUE(descriptor.LastPacketInSubFrame());
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, WriteLastPacketOfSubFrame) { TEST(RtpGenericFrameDescriptorExtensionTest, WriteLastPacketOfSubFrame) {
uint8_t kRaw[] = {0x40}; uint8_t kRaw[] = {0x40 | kDeprecatedFlags};
if (version_ == 0) {
kRaw[0] |= kDeprecatedFlags;
}
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
descriptor.SetLastPacketInSubFrame(true); descriptor.SetLastPacketInSubFrame(true);
ASSERT_EQ(ValueSize(descriptor), sizeof(kRaw)); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
sizeof(kRaw));
uint8_t buffer[sizeof(kRaw)]; uint8_t buffer[sizeof(kRaw)];
EXPECT_TRUE(Write(buffer, descriptor)); EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
EXPECT_THAT(buffer, ElementsAreArray(kRaw)); EXPECT_THAT(buffer, ElementsAreArray(kRaw));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, ParseDiscardable) { TEST(RtpGenericFrameDescriptorExtensionTest, ParseMinShortFrameDependencies) {
if (version_ == 0) {
return;
}
constexpr uint8_t kRaw[] = {0x10};
RtpGenericFrameDescriptor descriptor;
ASSERT_TRUE(Parse(kRaw, &descriptor));
const absl::optional<bool> discardable = descriptor.Discardable();
ASSERT_TRUE(discardable.has_value());
EXPECT_TRUE(discardable.value());
}
TEST_P(RtpGenericFrameDescriptorExtensionTest, WriteDiscardable) {
if (version_ == 0) {
return;
}
constexpr uint8_t kRaw[] = {0x10};
RtpGenericFrameDescriptor descriptor;
descriptor.SetDiscardable(true);
ASSERT_EQ(ValueSize(descriptor), sizeof(kRaw));
uint8_t buffer[sizeof(kRaw)];
EXPECT_TRUE(Write(buffer, descriptor));
EXPECT_THAT(buffer, ElementsAreArray(kRaw));
}
TEST_P(RtpGenericFrameDescriptorExtensionTest, ParseMinShortFrameDependencies) {
constexpr uint16_t kDiff = 1; constexpr uint16_t kDiff = 1;
constexpr uint8_t kRaw[] = {0x88, 0x01, 0x00, 0x00, 0x04}; constexpr uint8_t kRaw[] = {0x88, 0x01, 0x00, 0x00, 0x04};
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
ASSERT_TRUE(Parse(kRaw, &descriptor)); ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff)); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, WriteMinShortFrameDependencies) { TEST(RtpGenericFrameDescriptorExtensionTest, WriteMinShortFrameDependencies) {
constexpr uint16_t kDiff = 1; constexpr uint16_t kDiff = 1;
uint8_t kRaw[] = {0x88, 0x01, 0x00, 0x00, 0x04}; uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x04};
if (version_ == 0) {
kRaw[0] |= kDeprecatedFlags;
}
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
descriptor.SetFirstPacketInSubFrame(true); descriptor.SetFirstPacketInSubFrame(true);
descriptor.AddFrameDependencyDiff(kDiff); descriptor.AddFrameDependencyDiff(kDiff);
ASSERT_EQ(ValueSize(descriptor), sizeof(kRaw)); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
sizeof(kRaw));
uint8_t buffer[sizeof(kRaw)]; uint8_t buffer[sizeof(kRaw)];
EXPECT_TRUE(Write(buffer, descriptor)); EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
EXPECT_THAT(buffer, ElementsAreArray(kRaw)); EXPECT_THAT(buffer, ElementsAreArray(kRaw));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, ParseMaxShortFrameDependencies) { TEST(RtpGenericFrameDescriptorExtensionTest, ParseMaxShortFrameDependencies) {
constexpr uint16_t kDiff = 0x3f; constexpr uint16_t kDiff = 0x3f;
constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0xfc}; constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0xfc};
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
ASSERT_TRUE(Parse(kRaw, &descriptor)); ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff)); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, WriteMaxShortFrameDependencies) { TEST(RtpGenericFrameDescriptorExtensionTest, WriteMaxShortFrameDependencies) {
constexpr uint16_t kDiff = 0x3f; constexpr uint16_t kDiff = 0x3f;
uint8_t kRaw[] = {0x88, 0x01, 0x00, 0x00, 0xfc}; uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0xfc};
if (version_ == 0) {
kRaw[0] |= kDeprecatedFlags;
}
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
descriptor.SetFirstPacketInSubFrame(true); descriptor.SetFirstPacketInSubFrame(true);
descriptor.AddFrameDependencyDiff(kDiff); descriptor.AddFrameDependencyDiff(kDiff);
ASSERT_EQ(ValueSize(descriptor), sizeof(kRaw)); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
sizeof(kRaw));
uint8_t buffer[sizeof(kRaw)]; uint8_t buffer[sizeof(kRaw)];
EXPECT_TRUE(Write(buffer, descriptor)); EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
EXPECT_THAT(buffer, ElementsAreArray(kRaw)); EXPECT_THAT(buffer, ElementsAreArray(kRaw));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, ParseMinLongFrameDependencies) { TEST(RtpGenericFrameDescriptorExtensionTest, ParseMinLongFrameDependencies) {
constexpr uint16_t kDiff = 0x40; constexpr uint16_t kDiff = 0x40;
constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0x02, 0x01}; constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0x02, 0x01};
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
ASSERT_TRUE(Parse(kRaw, &descriptor)); ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff)); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, WriteMinLongFrameDependencies) { TEST(RtpGenericFrameDescriptorExtensionTest, WriteMinLongFrameDependencies) {
constexpr uint16_t kDiff = 0x40; constexpr uint16_t kDiff = 0x40;
uint8_t kRaw[] = {0x88, 0x01, 0x00, 0x00, 0x02, 0x01}; uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x02, 0x01};
if (version_ == 0) {
kRaw[0] |= kDeprecatedFlags;
}
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
descriptor.SetFirstPacketInSubFrame(true); descriptor.SetFirstPacketInSubFrame(true);
descriptor.AddFrameDependencyDiff(kDiff); descriptor.AddFrameDependencyDiff(kDiff);
ASSERT_EQ(ValueSize(descriptor), sizeof(kRaw)); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
sizeof(kRaw));
uint8_t buffer[sizeof(kRaw)]; uint8_t buffer[sizeof(kRaw)];
EXPECT_TRUE(Write(buffer, descriptor)); EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
EXPECT_THAT(buffer, ElementsAreArray(kRaw)); EXPECT_THAT(buffer, ElementsAreArray(kRaw));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, TEST(RtpGenericFrameDescriptorExtensionTest,
ParseLongFrameDependenciesAsBigEndian) { ParseLongFrameDependenciesAsBigEndian) {
constexpr uint16_t kDiff = 0x7654 >> 2; constexpr uint16_t kDiff = 0x7654 >> 2;
constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0x54 | 0x02, 0x76}; constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0x54 | 0x02, 0x76};
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
ASSERT_TRUE(Parse(kRaw, &descriptor)); ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff)); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, TEST(RtpGenericFrameDescriptorExtensionTest,
WriteLongFrameDependenciesAsBigEndian) { WriteLongFrameDependenciesAsBigEndian) {
constexpr uint16_t kDiff = 0x7654 >> 2; constexpr uint16_t kDiff = 0x7654 >> 2;
uint8_t kRaw[] = {0x88, 0x01, 0x00, 0x00, 0x54 | 0x02, 0x76}; uint8_t kRaw[] = {
if (version_ == 0) { 0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x54 | 0x02, 0x76};
kRaw[0] |= kDeprecatedFlags;
}
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
descriptor.SetFirstPacketInSubFrame(true); descriptor.SetFirstPacketInSubFrame(true);
descriptor.AddFrameDependencyDiff(kDiff); descriptor.AddFrameDependencyDiff(kDiff);
ASSERT_EQ(ValueSize(descriptor), sizeof(kRaw)); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
sizeof(kRaw));
uint8_t buffer[sizeof(kRaw)]; uint8_t buffer[sizeof(kRaw)];
EXPECT_TRUE(Write(buffer, descriptor)); EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
EXPECT_THAT(buffer, ElementsAreArray(kRaw)); EXPECT_THAT(buffer, ElementsAreArray(kRaw));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, ParseMaxLongFrameDependencies) { TEST(RtpGenericFrameDescriptorExtensionTest, ParseMaxLongFrameDependencies) {
constexpr uint16_t kDiff = 0x3fff; constexpr uint16_t kDiff = 0x3fff;
constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0xfe, 0xff}; constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0xfe, 0xff};
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
ASSERT_TRUE(Parse(kRaw, &descriptor)); ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff)); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, WriteMaxLongFrameDependencies) { TEST(RtpGenericFrameDescriptorExtensionTest, WriteMaxLongFrameDependencies) {
constexpr uint16_t kDiff = 0x3fff; constexpr uint16_t kDiff = 0x3fff;
uint8_t kRaw[] = {0x88, 0x01, 0x00, 0x00, 0xfe, 0xff}; uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0xfe, 0xff};
if (version_ == 0) {
kRaw[0] |= kDeprecatedFlags;
}
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
descriptor.SetFirstPacketInSubFrame(true); descriptor.SetFirstPacketInSubFrame(true);
descriptor.AddFrameDependencyDiff(kDiff); descriptor.AddFrameDependencyDiff(kDiff);
ASSERT_EQ(ValueSize(descriptor), sizeof(kRaw)); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
sizeof(kRaw));
uint8_t buffer[sizeof(kRaw)]; uint8_t buffer[sizeof(kRaw)];
EXPECT_TRUE(Write(buffer, descriptor)); EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
EXPECT_THAT(buffer, ElementsAreArray(kRaw)); EXPECT_THAT(buffer, ElementsAreArray(kRaw));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, ParseTwoFrameDependencies) { TEST(RtpGenericFrameDescriptorExtensionTest, ParseTwoFrameDependencies) {
constexpr uint16_t kDiff1 = 9; constexpr uint16_t kDiff1 = 9;
constexpr uint16_t kDiff2 = 15; constexpr uint16_t kDiff2 = 15;
constexpr uint8_t kRaw[] = { constexpr uint8_t kRaw[] = {
0xb8, 0x01, 0x00, 0x00, (kDiff1 << 2) | 0x01, kDiff2 << 2}; 0xb8, 0x01, 0x00, 0x00, (kDiff1 << 2) | 0x01, kDiff2 << 2};
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
ASSERT_TRUE(Parse(kRaw, &descriptor)); ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
ASSERT_TRUE(descriptor.FirstPacketInSubFrame()); ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff1, kDiff2)); EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff1, kDiff2));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, WriteTwoFrameDependencies) { TEST(RtpGenericFrameDescriptorExtensionTest, WriteTwoFrameDependencies) {
constexpr uint16_t kDiff1 = 9; constexpr uint16_t kDiff1 = 9;
constexpr uint16_t kDiff2 = 15; constexpr uint16_t kDiff2 = 15;
uint8_t kRaw[] = {0x88, 0x01, 0x00, 0x00, (kDiff1 << 2) | 0x01, kDiff2 << 2}; uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00,
if (version_ == 0) { (kDiff1 << 2) | 0x01, kDiff2 << 2};
kRaw[0] |= kDeprecatedFlags;
}
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
descriptor.SetFirstPacketInSubFrame(true); descriptor.SetFirstPacketInSubFrame(true);
descriptor.AddFrameDependencyDiff(kDiff1); descriptor.AddFrameDependencyDiff(kDiff1);
descriptor.AddFrameDependencyDiff(kDiff2); descriptor.AddFrameDependencyDiff(kDiff2);
ASSERT_EQ(ValueSize(descriptor), sizeof(kRaw)); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
sizeof(kRaw));
uint8_t buffer[sizeof(kRaw)]; uint8_t buffer[sizeof(kRaw)];
EXPECT_TRUE(Write(buffer, descriptor)); EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
EXPECT_THAT(buffer, ElementsAreArray(kRaw)); EXPECT_THAT(buffer, ElementsAreArray(kRaw));
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, TEST(RtpGenericFrameDescriptorExtensionTest,
ParseResolutionOnIndependentFrame) { ParseResolutionOnIndependentFrame) {
constexpr int kWidth = 0x2468; constexpr int kWidth = 0x2468;
constexpr int kHeight = 0x6543; constexpr int kHeight = 0x6543;
constexpr uint8_t kRaw[] = {0xb0, 0x01, 0x00, 0x00, 0x24, 0x68, 0x65, 0x43}; constexpr uint8_t kRaw[] = {0xb0, 0x01, 0x00, 0x00, 0x24, 0x68, 0x65, 0x43};
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
ASSERT_TRUE(Parse(kRaw, &descriptor)); ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
EXPECT_EQ(descriptor.Width(), kWidth); EXPECT_EQ(descriptor.Width(), kWidth);
EXPECT_EQ(descriptor.Height(), kHeight); EXPECT_EQ(descriptor.Height(), kHeight);
} }
TEST_P(RtpGenericFrameDescriptorExtensionTest, TEST(RtpGenericFrameDescriptorExtensionTest,
WriteResolutionOnIndependentFrame) { WriteResolutionOnIndependentFrame) {
constexpr int kWidth = 0x2468; constexpr int kWidth = 0x2468;
constexpr int kHeight = 0x6543; constexpr int kHeight = 0x6543;
uint8_t kRaw[] = {0x80, 0x01, 0x00, 0x00, 0x24, 0x68, 0x65, 0x43}; uint8_t kRaw[] = {
if (version_ == 0) { 0x80 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x24, 0x68, 0x65, 0x43};
kRaw[0] |= kDeprecatedFlags;
}
RtpGenericFrameDescriptor descriptor; RtpGenericFrameDescriptor descriptor;
descriptor.SetFirstPacketInSubFrame(true); descriptor.SetFirstPacketInSubFrame(true);
descriptor.SetResolution(kWidth, kHeight); descriptor.SetResolution(kWidth, kHeight);
ASSERT_EQ(ValueSize(descriptor), sizeof(kRaw)); ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
sizeof(kRaw));
uint8_t buffer[sizeof(kRaw)]; uint8_t buffer[sizeof(kRaw)];
EXPECT_TRUE(Write(buffer, descriptor)); EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
EXPECT_THAT(buffer, ElementsAreArray(kRaw)); EXPECT_THAT(buffer, ElementsAreArray(kRaw));
} }
} // namespace } // namespace

View file

@ -46,7 +46,6 @@ constexpr ExtensionInfo kExtensions[] = {
CreateExtensionInfo<RepairedRtpStreamId>(), CreateExtensionInfo<RepairedRtpStreamId>(),
CreateExtensionInfo<RtpMid>(), CreateExtensionInfo<RtpMid>(),
CreateExtensionInfo<RtpGenericFrameDescriptorExtension00>(), CreateExtensionInfo<RtpGenericFrameDescriptorExtension00>(),
CreateExtensionInfo<RtpGenericFrameDescriptorExtension01>(),
CreateExtensionInfo<RtpDependencyDescriptorExtension>(), CreateExtensionInfo<RtpDependencyDescriptorExtension>(),
CreateExtensionInfo<ColorSpaceExtension>(), CreateExtensionInfo<ColorSpaceExtension>(),
CreateExtensionInfo<InbandComfortNoiseExtension>(), CreateExtensionInfo<InbandComfortNoiseExtension>(),

View file

@ -190,7 +190,6 @@ void RtpPacket::ZeroMutableExtensions() {
case RTPExtensionType::kRtpExtensionColorSpace: case RTPExtensionType::kRtpExtensionColorSpace:
case RTPExtensionType::kRtpExtensionFrameMarking: case RTPExtensionType::kRtpExtensionFrameMarking:
case RTPExtensionType::kRtpExtensionGenericFrameDescriptor00: case RTPExtensionType::kRtpExtensionGenericFrameDescriptor00:
case RTPExtensionType::kRtpExtensionGenericFrameDescriptor01:
case RTPExtensionType::kRtpExtensionGenericFrameDescriptor02: case RTPExtensionType::kRtpExtensionGenericFrameDescriptor02:
case RTPExtensionType::kRtpExtensionMid: case RTPExtensionType::kRtpExtensionMid:
case RTPExtensionType::kRtpExtensionNumberOfExtensions: case RTPExtensionType::kRtpExtensionNumberOfExtensions:

View file

@ -82,8 +82,6 @@ constexpr RtpExtensionSize kVideoExtensionSizes[] = {
CreateMaxExtensionSize<RtpMid>(), CreateMaxExtensionSize<RtpMid>(),
{RtpGenericFrameDescriptorExtension00::kId, {RtpGenericFrameDescriptorExtension00::kId,
RtpGenericFrameDescriptorExtension00::kMaxSizeBytes}, RtpGenericFrameDescriptorExtension00::kMaxSizeBytes},
{RtpGenericFrameDescriptorExtension01::kId,
RtpGenericFrameDescriptorExtension01::kMaxSizeBytes},
}; };
bool HasBweExtension(const RtpHeaderExtensionMap& extensions_map) { bool HasBweExtension(const RtpHeaderExtensionMap& extensions_map) {

View file

@ -47,8 +47,7 @@ namespace {
enum : int { // The first valid value is 1. enum : int { // The first valid value is 1.
kAbsoluteSendTimeExtensionId = 1, kAbsoluteSendTimeExtensionId = 1,
kAudioLevelExtensionId, kAudioLevelExtensionId,
kGenericDescriptorId00, kGenericDescriptorId,
kGenericDescriptorId01,
kMidExtensionId, kMidExtensionId,
kRepairedRidExtensionId, kRepairedRidExtensionId,
kRidExtensionId, kRidExtensionId,
@ -109,9 +108,7 @@ class LoopbackTransportTest : public webrtc::Transport {
kVideoTimingExtensionId); kVideoTimingExtensionId);
receivers_extensions_.Register<RtpMid>(kMidExtensionId); receivers_extensions_.Register<RtpMid>(kMidExtensionId);
receivers_extensions_.Register<RtpGenericFrameDescriptorExtension00>( receivers_extensions_.Register<RtpGenericFrameDescriptorExtension00>(
kGenericDescriptorId00); kGenericDescriptorId);
receivers_extensions_.Register<RtpGenericFrameDescriptorExtension01>(
kGenericDescriptorId01);
receivers_extensions_.Register<RtpStreamId>(kRidExtensionId); receivers_extensions_.Register<RtpStreamId>(kRidExtensionId);
receivers_extensions_.Register<RepairedRtpStreamId>( receivers_extensions_.Register<RepairedRtpStreamId>(
kRepairedRidExtensionId); kRepairedRidExtensionId);

View file

@ -358,12 +358,11 @@ void RTPSenderVideo::AddRtpHeaderExtensions(
descriptor.attached_structure.release(); descriptor.attached_structure.release();
} }
// Do not use v0/v1 generic frame descriptor when v2 is stored. // Do not use generic frame descriptor when dependency descriptor is stored.
if (!extension_is_set) { if (!extension_is_set) {
RtpGenericFrameDescriptor generic_descriptor; RtpGenericFrameDescriptor generic_descriptor;
generic_descriptor.SetFirstPacketInSubFrame(first_packet); generic_descriptor.SetFirstPacketInSubFrame(first_packet);
generic_descriptor.SetLastPacketInSubFrame(last_packet); generic_descriptor.SetLastPacketInSubFrame(last_packet);
generic_descriptor.SetDiscardable(video_header.generic->discardable);
if (first_packet) { if (first_packet) {
generic_descriptor.SetFrameId( generic_descriptor.SetFrameId(

View file

@ -534,7 +534,6 @@ void RtpHeaderParser::ParseOneByteExtensionHeader(
break; break;
} }
case kRtpExtensionGenericFrameDescriptor00: case kRtpExtensionGenericFrameDescriptor00:
case kRtpExtensionGenericFrameDescriptor01:
case kRtpExtensionGenericFrameDescriptor02: case kRtpExtensionGenericFrameDescriptor02:
RTC_LOG(WARNING) RTC_LOG(WARNING)
<< "RtpGenericFrameDescriptor unsupported by rtp header parser."; << "RtpGenericFrameDescriptor unsupported by rtp header parser.";

View file

@ -136,11 +136,6 @@ void FuzzOneInput(const uint8_t* data, size_t size) {
packet.GetExtension<RtpGenericFrameDescriptorExtension00>(&descriptor); packet.GetExtension<RtpGenericFrameDescriptorExtension00>(&descriptor);
break; break;
} }
case kRtpExtensionGenericFrameDescriptor01: {
RtpGenericFrameDescriptor descriptor;
packet.GetExtension<RtpGenericFrameDescriptorExtension01>(&descriptor);
break;
}
case kRtpExtensionColorSpace: { case kRtpExtensionColorSpace: {
ColorSpace color_space; ColorSpace color_space;
packet.GetExtension<ColorSpaceExtension>(&color_space); packet.GetExtension<ColorSpaceExtension>(&color_space);