Check (correctly) if packet is a padding packet based on payload size rather than the (incorrect) parsed payload size.
Bug: webrtc:12579
Change-Id: I5f2aff3b0bac8eeb31ac8066aef62b825815a601
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/235207
Commit-Queue: Philip Eliasson <philipel@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35214}
diff --git a/api/video/rtp_video_frame_assembler.cc b/api/video/rtp_video_frame_assembler.cc
index 8f3d04c..2629040 100644
--- a/api/video/rtp_video_frame_assembler.cc
+++ b/api/video/rtp_video_frame_assembler.cc
@@ -92,6 +92,11 @@
RtpVideoFrameAssembler::FrameVector RtpVideoFrameAssembler::Impl::InsertPacket(
const RtpPacketReceived& rtp_packet) {
+ if (rtp_packet.payload_size() == 0) {
+ ClearOldData(rtp_packet.SequenceNumber());
+ return UpdateWithPadding(rtp_packet.SequenceNumber());
+ }
+
absl::optional<VideoRtpDepacketizer::ParsedRtpPayload> parsed_payload =
depacketizer_->Parse(rtp_packet.PayloadBuffer());
@@ -99,11 +104,6 @@
return {};
}
- if (parsed_payload->video_payload.size() == 0) {
- ClearOldData(rtp_packet.SequenceNumber());
- return UpdateWithPadding(rtp_packet.SequenceNumber());
- }
-
if (rtp_packet.HasExtension<RtpDependencyDescriptorExtension>()) {
if (!ParseDependenciesDescriptorExtension(rtp_packet,
parsed_payload->video_header)) {
diff --git a/api/video/rtp_video_frame_assembler_unittests.cc b/api/video/rtp_video_frame_assembler_unittests.cc
index 916a83c..fd70f72 100644
--- a/api/video/rtp_video_frame_assembler_unittests.cc
+++ b/api/video/rtp_video_frame_assembler_unittests.cc
@@ -105,6 +105,13 @@
RtpPacketToSend packet_to_send_;
};
+RtpPacketReceived PaddingPacket(uint16_t seq_num) {
+ RtpPacketReceived padding_packet;
+ padding_packet.SetSequenceNumber(seq_num);
+ padding_packet.SetPadding(224);
+ return padding_packet;
+}
+
void AppendFrames(RtpVideoFrameAssembler::FrameVector from,
RtpVideoFrameAssembler::FrameVector& to) {
to.insert(to.end(), std::make_move_iterator(from.begin()),
@@ -389,26 +396,13 @@
frames);
ASSERT_THAT(frames, SizeIs(1));
-
EXPECT_THAT(frames[0]->Id(), Eq(123));
EXPECT_THAT(Payload(frames[0]), ElementsAreArray(kPayload));
EXPECT_THAT(References(frames[0]), IsEmpty());
- // Padding packets have no bitstream data. An easy way to generate one is to
- // build a normal packet and then simply remove the bitstream portion of the
- // payload.
- RtpPacketReceived padding_packet = PacketBuilder(PayloadFormat::kGeneric)
- .WithPayload(kPayload)
- .WithVideoHeader(video_header)
- .WithSeqNum(124)
- .Build();
- // The payload descriptor is one byte, keep it.
- padding_packet.SetPayloadSize(1);
-
- AppendFrames(assembler.InsertPacket(padding_packet), frames);
+ AppendFrames(assembler.InsertPacket(PaddingPacket(/*seq_num=*/124)), frames);
ASSERT_THAT(frames, SizeIs(2));
-
EXPECT_THAT(frames[1]->Id(), Eq(125));
EXPECT_THAT(Payload(frames[1]), ElementsAreArray(kPayload));
EXPECT_THAT(References(frames[1]), UnorderedElementsAre(123));
@@ -464,17 +458,8 @@
.Build()),
SizeIs(1));
- // Padding packets have no bitstream data. An easy way to generate one is to
- // build a normal packet and then simply remove the bitstream portion of the
- // payload.
- RtpPacketReceived padding_packet = PacketBuilder(PayloadFormat::kGeneric)
- .WithPayload(kPayload)
- .WithVideoHeader(video_header)
- .WithSeqNum(2000)
- .Build();
- // The payload descriptor is one byte, keep it.
- padding_packet.SetPayloadSize(1);
- EXPECT_THAT(assembler.InsertPacket(padding_packet), SizeIs(0));
+ EXPECT_THAT(assembler.InsertPacket(PaddingPacket(/*seq_num=*/2000)),
+ SizeIs(0));
EXPECT_THAT(assembler.InsertPacket(PacketBuilder(PayloadFormat::kGeneric)
.WithPayload(kPayload)