Fix is_first_packet_in_frame flag for h26x_packet_buffer_unittests.

Update unit tests to follow video_rtp_depacketizer_h264's behavior of
setting is_first_packet_in_frame. This flag might be used to determine
if a frame can be assembled.

Bug: webrtc:384391181
Change-Id: I6750c20056e426e12c1d4e21eea4c641def7cfbd
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/373168
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43669}
This commit is contained in:
Jianjun Zhu 2025-01-03 21:30:22 +08:00 committed by WebRTC LUCI CQ
parent 80344a0a5c
commit a23fbc694f

View File

@ -75,6 +75,7 @@ class H264Packet {
H264Packet& Aud();
H264Packet& Marker();
H264Packet& AsFirstFragment();
H264Packet& AsFirstPacket();
H264Packet& Time(uint32_t rtp_timestamp);
H264Packet& SeqNum(int64_t rtp_seq_num);
@ -95,6 +96,7 @@ class H264Packet {
H264PacketizationTypes type_;
RTPVideoHeader video_header_;
bool first_fragment_ = false;
bool first_packet_ = false;
bool marker_bit_ = false;
uint32_t rtp_timestamp_ = 0;
int64_t rtp_seq_num_ = 0;
@ -169,6 +171,11 @@ H264Packet& H264Packet::AsFirstFragment() {
return *this;
}
H264Packet& H264Packet::AsFirstPacket() {
first_packet_ = true;
return *this;
}
H264Packet& H264Packet::Time(uint32_t rtp_timestamp) {
rtp_timestamp_ = rtp_timestamp;
return *this;
@ -211,6 +218,7 @@ std::unique_ptr<H26xPacketBuffer::Packet> H264Packet::Build() {
res->timestamp = rtp_timestamp_;
res->sequence_number = rtp_seq_num_;
res->video_header.codec = kVideoCodecH264;
res->video_header.is_first_packet_in_frame = first_packet_;
return res;
}
@ -262,6 +270,7 @@ class H265Packet {
H265Packet& Aud();
H265Packet& Marker();
H265Packet& AsFirstFragment();
H265Packet& AsFirstPacket();
H265Packet& Time(uint32_t rtp_timestamp);
H265Packet& SeqNum(int64_t rtp_seq_num);
@ -272,6 +281,7 @@ class H265Packet {
RTPVideoHeader video_header_;
bool first_fragment_ = false;
bool first_packet_ = false;
bool marker_bit_ = false;
uint32_t rtp_timestamp_ = 0;
uint16_t rtp_seq_num_ = 0;
@ -332,6 +342,7 @@ std::unique_ptr<H26xPacketBuffer::Packet> H265Packet::Build() {
res->sequence_number = rtp_seq_num_;
res->video_header.codec = kVideoCodecH265;
res->video_payload = rtc::CopyOnWriteBuffer();
res->video_header.is_first_packet_in_frame = first_packet_;
for (const auto& payload : nalu_payloads_) {
res->video_payload.AppendData(payload);
}
@ -344,6 +355,11 @@ H265Packet& H265Packet::AsFirstFragment() {
return *this;
}
H265Packet& H265Packet::AsFirstPacket() {
first_packet_ = true;
return *this;
}
H265Packet& H265Packet::Time(uint32_t rtp_timestamp) {
rtp_timestamp_ = rtp_timestamp;
return *this;
@ -373,11 +389,13 @@ TEST(H26xPacketBufferTest, IdrOnlyKeyframeWithSprop) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/true);
packet_buffer.SetSpropParameterSets(kExampleSpropString);
auto packets =
packet_buffer
.InsertPacket(
H264Packet(kH264SingleNalu).Idr({1, 2, 3}, 0).Marker().Build())
.packets;
auto packets = packet_buffer
.InsertPacket(H264Packet(kH264SingleNalu)
.Idr({1, 2, 3}, 0)
.AsFirstPacket()
.Marker()
.Build())
.packets;
EXPECT_THAT(packets, SizeIs(1));
EXPECT_THAT(PacketPayload(packets[0]),
ElementsAreArray(FlatVector({StartCode(),
@ -393,11 +411,13 @@ TEST(H26xPacketBufferTest, IdrOnlyKeyframeWithoutSprop) {
// Cannot fix biststream by prepending SPS and PPS because no sprop string is
// available. Request a key frame.
EXPECT_TRUE(
packet_buffer
.InsertPacket(
H264Packet(kH264SingleNalu).Idr({9, 9, 9}, 0).Marker().Build())
.buffer_cleared);
EXPECT_TRUE(packet_buffer
.InsertPacket(H264Packet(kH264SingleNalu)
.Idr({9, 9, 9}, 0)
.AsFirstPacket()
.Marker()
.Build())
.buffer_cleared);
}
TEST(H26xPacketBufferTest, IdrOnlyKeyframeWithSpropAndUnknownPpsId) {
@ -406,29 +426,37 @@ TEST(H26xPacketBufferTest, IdrOnlyKeyframeWithSpropAndUnknownPpsId) {
// Cannot fix biststream because sprop string doesn't contain a PPS with given
// ID. Request a key frame.
EXPECT_TRUE(
packet_buffer
.InsertPacket(
H264Packet(kH264SingleNalu).Idr({9, 9, 9}, 1).Marker().Build())
.buffer_cleared);
EXPECT_TRUE(packet_buffer
.InsertPacket(H264Packet(kH264SingleNalu)
.Idr({9, 9, 9}, 1)
.AsFirstPacket()
.Marker()
.Build())
.buffer_cleared);
}
TEST(H26xPacketBufferTest, IdrOnlyKeyframeInTheMiddle) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/true);
packet_buffer.SetSpropParameterSets(kExampleSpropString);
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Sps({1, 2, 3}, 1).SeqNum(0).Time(0).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Sps({1, 2, 3}, 1)
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Pps({4, 5, 6}, 1, 1)
.SeqNum(1)
.Time(0)
.AsFirstPacket()
.Build()));
EXPECT_THAT(packet_buffer
.InsertPacket(H264Packet(kH264SingleNalu)
.Idr({7, 8, 9}, 1)
.SeqNum(2)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -439,6 +467,7 @@ TEST(H26xPacketBufferTest, IdrOnlyKeyframeInTheMiddle) {
.Slice()
.SeqNum(3)
.Time(1)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -449,6 +478,7 @@ TEST(H26xPacketBufferTest, IdrOnlyKeyframeInTheMiddle) {
.Idr({10, 11, 12}, 0)
.SeqNum(4)
.Time(2)
.AsFirstPacket()
.Marker()
.Build())
.packets;
@ -465,11 +495,14 @@ TEST(H26xPacketBufferTest, IdrOnlyKeyframeInTheMiddle) {
TEST(H26xPacketBufferTest, IdrIsNotKeyframe) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
EXPECT_THAT(
packet_buffer
.InsertPacket(H264Packet(kH264SingleNalu).Idr().Marker().Build())
.packets,
IsEmpty());
EXPECT_THAT(packet_buffer
.InsertPacket(H264Packet(kH264SingleNalu)
.Idr()
.AsFirstPacket()
.Marker()
.Build())
.packets,
IsEmpty());
}
TEST(H26xPacketBufferTest, IdrIsKeyframeFuaRequiresFirstFragmet) {
@ -477,11 +510,15 @@ TEST(H26xPacketBufferTest, IdrIsKeyframeFuaRequiresFirstFragmet) {
packet_buffer.SetSpropParameterSets(kExampleSpropString);
// Not marked as the first fragment
EXPECT_THAT(
packet_buffer
.InsertPacket(H264Packet(kH264FuA).Idr().SeqNum(0).Time(0).Build())
.packets,
IsEmpty());
EXPECT_THAT(packet_buffer
.InsertPacket(H264Packet(kH264FuA)
.Idr()
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Build())
.packets,
IsEmpty());
EXPECT_THAT(
packet_buffer
@ -497,6 +534,7 @@ TEST(H26xPacketBufferTest, IdrIsKeyframeFuaRequiresFirstFragmet) {
.SeqNum(2)
.Time(1)
.AsFirstFragment()
.AsFirstPacket()
.Build())
.packets,
IsEmpty());
@ -512,8 +550,12 @@ TEST(H26xPacketBufferTest, IdrIsKeyframeFuaRequiresFirstFragmet) {
TEST(H26xPacketBufferTest, SpsPpsIdrIsKeyframeSingleNalus) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Sps().SeqNum(0).Time(0).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Sps()
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Build()));
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Pps().SeqNum(1).Time(0).Build()));
EXPECT_THAT(packet_buffer
@ -521,6 +563,7 @@ TEST(H26xPacketBufferTest, SpsPpsIdrIsKeyframeSingleNalus) {
.Idr()
.SeqNum(2)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -534,18 +577,24 @@ TEST(H26xPacketBufferTest, SpsPpsIdrIsKeyframeIgnoresSprop) {
// ignored. Use in band parameter sets.
packet_buffer.SetSpropParameterSets(kExampleSpropString);
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Sps({1, 2, 3}, 0).SeqNum(0).Time(0).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Sps({1, 2, 3}, 0)
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Pps({4, 5, 6}, 0, 0)
.SeqNum(1)
.Time(0)
.AsFirstPacket()
.Build()));
auto packets = packet_buffer
.InsertPacket(H264Packet(kH264SingleNalu)
.Idr({7, 8, 9}, 0)
.SeqNum(2)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets;
@ -561,13 +610,18 @@ TEST(H26xPacketBufferTest, SpsPpsIdrIsKeyframeIgnoresSprop) {
TEST(H26xPacketBufferTest, PpsIdrIsNotKeyframeSingleNalus) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Pps().SeqNum(0).Time(0).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Pps()
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Build()));
EXPECT_THAT(packet_buffer
.InsertPacket(H264Packet(kH264SingleNalu)
.Idr()
.SeqNum(1)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -577,13 +631,18 @@ TEST(H26xPacketBufferTest, PpsIdrIsNotKeyframeSingleNalus) {
TEST(H26xPacketBufferTest, SpsIdrIsNotKeyframeSingleNalus) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Sps().SeqNum(0).Time(0).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Sps()
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Build()));
EXPECT_THAT(packet_buffer
.InsertPacket(H264Packet(kH264SingleNalu)
.Idr()
.SeqNum(1)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -600,6 +659,7 @@ TEST(H26xPacketBufferTest, SpsPpsIdrIsKeyframeStapA) {
.Idr()
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -615,6 +675,7 @@ TEST(H26xPacketBufferTest, PpsIdrIsNotKeyframeStapA) {
.Idr()
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -630,6 +691,7 @@ TEST(H26xPacketBufferTest, SpsIdrIsNotKeyframeStapA) {
.Idr()
.SeqNum(2)
.Time(2)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -642,6 +704,7 @@ TEST(H26xPacketBufferTest, SpsIdrIsNotKeyframeStapA) {
.Idr()
.SeqNum(3)
.Time(3)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -651,15 +714,24 @@ TEST(H26xPacketBufferTest, SpsIdrIsNotKeyframeStapA) {
TEST(H26xPacketBufferTest, InsertingSpsPpsLastCompletesKeyframe) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Idr().SeqNum(2).Time(1).Marker().Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Idr()
.SeqNum(2)
.Time(1)
.AsFirstPacket()
.Marker()
.Build()));
EXPECT_THAT(
packet_buffer
.InsertPacket(
H264Packet(kH264StapA).Sps().Pps().SeqNum(1).Time(1).Build())
.packets,
SizeIs(2));
EXPECT_THAT(packet_buffer
.InsertPacket(H264Packet(kH264StapA)
.Sps()
.Pps()
.SeqNum(1)
.Time(1)
.AsFirstPacket()
.Build())
.packets,
SizeIs(2));
}
TEST(H26xPacketBufferTest, InsertingMidFuaCompletesFrame) {
@ -672,6 +744,7 @@ TEST(H26xPacketBufferTest, InsertingMidFuaCompletesFrame) {
.Idr()
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -682,6 +755,7 @@ TEST(H26xPacketBufferTest, InsertingMidFuaCompletesFrame) {
.SeqNum(1)
.Time(1)
.AsFirstFragment()
.AsFirstPacket()
.Build()));
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264FuA).Slice().SeqNum(3).Time(1).Marker().Build()));
@ -702,16 +776,21 @@ TEST(H26xPacketBufferTest, SeqNumJumpDoesNotCompleteFrame) {
.Idr()
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets,
SizeIs(1));
EXPECT_THAT(
packet_buffer
.InsertPacket(H264Packet(kH264FuA).Slice().SeqNum(1).Time(1).Build())
.packets,
IsEmpty());
EXPECT_THAT(packet_buffer
.InsertPacket(H264Packet(kH264FuA)
.Slice()
.SeqNum(1)
.Time(1)
.AsFirstPacket()
.Build())
.packets,
IsEmpty());
// Add `kBufferSize` to make the index of the sequence number wrap and end up
// where the packet with sequence number 2 would have ended up.
@ -734,6 +813,7 @@ TEST(H26xPacketBufferTest, OldFramesAreNotCompletedAfterBufferWrap) {
.Slice()
.SeqNum(1)
.Time(1)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -747,6 +827,7 @@ TEST(H26xPacketBufferTest, OldFramesAreNotCompletedAfterBufferWrap) {
.Idr()
.SeqNum(kBufferSize)
.Time(kBufferSize)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -762,6 +843,7 @@ TEST(H26xPacketBufferTest, OldPacketsDontBlockNewPackets) {
.Idr()
.SeqNum(kBufferSize)
.Time(kBufferSize)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -772,6 +854,7 @@ TEST(H26xPacketBufferTest, OldPacketsDontBlockNewPackets) {
.SeqNum(kBufferSize + 1)
.Time(kBufferSize + 1)
.AsFirstFragment()
.AsFirstPacket()
.Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264FuA)
@ -806,6 +889,7 @@ TEST(H26xPacketBufferTest, OldPacketDoesntCompleteFrame) {
.Idr()
.SeqNum(kBufferSize)
.Time(kBufferSize)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -834,6 +918,7 @@ TEST(H26xPacketBufferTest, OldPacketDoesntCompleteFrame) {
.SeqNum(kBufferSize + 1)
.Time(kBufferSize + 1)
.AsFirstFragment()
.AsFirstPacket()
.Build())
.packets,
IsEmpty());
@ -876,13 +961,18 @@ TEST(H26xPacketBufferTest, FrameBoundariesAreSet) {
TEST(H26xPacketBufferTest, ResolutionSetOnFirstPacket) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Aud().SeqNum(1).Time(1).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Aud()
.SeqNum(1)
.AsFirstPacket()
.Time(1)
.Build()));
auto res = packet_buffer.InsertPacket(H264Packet(kH264StapA)
.SpsWithResolution({320, 240})
.Pps()
.Idr()
.SeqNum(2)
.AsFirstPacket()
.Time(1)
.Marker()
.Build());
@ -895,19 +985,29 @@ TEST(H26xPacketBufferTest, ResolutionSetOnFirstPacket) {
TEST(H26xPacketBufferTest, KeyframeAndDeltaFrameSetOnFirstPacket) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Aud().SeqNum(1).Time(1).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Aud()
.SeqNum(1)
.AsFirstPacket()
.Time(1)
.Build()));
auto key = packet_buffer.InsertPacket(H264Packet(kH264StapA)
.Sps()
.Pps()
.Idr()
.SeqNum(2)
.AsFirstPacket()
.Time(1)
.Marker()
.Build());
auto delta = packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Slice().SeqNum(3).Time(2).Marker().Build());
auto delta = packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Slice()
.SeqNum(3)
.Time(2)
.AsFirstPacket()
.Marker()
.Build());
ASSERT_THAT(key.packets, SizeIs(2));
EXPECT_THAT(key.packets[0]->video_header.frame_type,
@ -920,11 +1020,20 @@ TEST(H26xPacketBufferTest, KeyframeAndDeltaFrameSetOnFirstPacket) {
TEST(H26xPacketBufferTest, RtpSeqNumWrap) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264StapA).Sps().Pps().SeqNum(0xffff).Time(0).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264StapA)
.Sps()
.Pps()
.SeqNum(0xffff)
.Time(0)
.AsFirstPacket()
.Build()));
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264FuA).Idr().SeqNum(0x1'0000).Time(0).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264FuA)
.Idr()
.SeqNum(0x1'0000)
.Time(0)
.AsFirstPacket()
.Build()));
EXPECT_THAT(packet_buffer
.InsertPacket(H264Packet(kH264FuA)
.Idr()
@ -946,6 +1055,7 @@ TEST(H26xPacketBufferTest, StapAFixedBitstream) {
.Idr({7, 8, 9})
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets;
@ -963,15 +1073,24 @@ TEST(H26xPacketBufferTest, StapAFixedBitstream) {
TEST(H26xPacketBufferTest, SingleNaluFixedBitstream) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Sps({1, 2, 3}).SeqNum(0).Time(0).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(
H264Packet(kH264SingleNalu).Pps({4, 5, 6}).SeqNum(1).Time(0).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Sps({1, 2, 3})
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264SingleNalu)
.Pps({4, 5, 6})
.SeqNum(1)
.Time(0)
.AsFirstPacket()
.Build()));
auto packets = packet_buffer
.InsertPacket(H264Packet(kH264SingleNalu)
.Idr({7, 8, 9})
.SeqNum(2)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets;
@ -993,12 +1112,14 @@ TEST(H26xPacketBufferTest, StapaAndFuaFixedBitstream) {
.Pps({4, 5, 6})
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Build()));
RTC_UNUSED(packet_buffer.InsertPacket(H264Packet(kH264FuA)
.Idr({8, 8, 8})
.SeqNum(1)
.Time(0)
.AsFirstFragment()
.AsFirstPacket()
.Build()));
auto packets = packet_buffer
.InsertPacket(H264Packet(kH264FuA)
@ -1040,6 +1161,7 @@ TEST(H26xPacketBufferTest, FullPacketBufferDoesNotBlockKeyframe) {
.Idr()
.SeqNum(kBufferSize)
.Time(1)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -1056,6 +1178,7 @@ TEST(H26xPacketBufferTest, AssembleFrameAfterReordering) {
.Idr()
.SeqNum(2)
.Time(2)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -1066,6 +1189,7 @@ TEST(H26xPacketBufferTest, AssembleFrameAfterReordering) {
.Slice()
.SeqNum(1)
.Time(1)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -1078,6 +1202,7 @@ TEST(H26xPacketBufferTest, AssembleFrameAfterReordering) {
.Idr()
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -1094,6 +1219,7 @@ TEST(H26xPacketBufferTest, AssembleFrameAfterLoss) {
.Idr()
.SeqNum(0)
.Time(0)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -1106,6 +1232,7 @@ TEST(H26xPacketBufferTest, AssembleFrameAfterLoss) {
.Idr()
.SeqNum(2)
.Time(2)
.AsFirstPacket()
.Marker()
.Build())
.packets,
@ -1116,11 +1243,17 @@ TEST(H26xPacketBufferTest, AssembleFrameAfterLoss) {
TEST(H26xPacketBufferTest, H265VpsSpsPpsIdrIsKeyframe) {
H26xPacketBuffer packet_buffer(/*allow_idr_only_keyframes=*/false);
EXPECT_THAT(
packet_buffer
.InsertPacket(H265Packet().Vps().Sps().Pps().Idr().Marker().Build())
.packets,
SizeIs(1));
EXPECT_THAT(packet_buffer
.InsertPacket(H265Packet()
.Vps()
.Sps()
.Pps()
.Idr()
.AsFirstPacket()
.Marker()
.Build())
.packets,
SizeIs(1));
}
TEST(H26xPacketBufferTest, H265IrapIsNotKeyframe) {
@ -1133,7 +1266,9 @@ TEST(H26xPacketBufferTest, H265IrapIsNotKeyframe) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
EXPECT_THAT(
packet_buffer.InsertPacket(H265Packet().Slice(type).Marker().Build())
packet_buffer
.InsertPacket(
H265Packet().Slice(type).AsFirstPacket().Marker().Build())
.packets,
IsEmpty());
}
@ -1143,7 +1278,9 @@ TEST(H26xPacketBufferTest, H265IdrIsNotKeyFrame) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
EXPECT_THAT(
packet_buffer.InsertPacket(H265Packet().Idr().Marker().Build()).packets,
packet_buffer
.InsertPacket(H265Packet().Idr().AsFirstPacket().Marker().Build())
.packets,
IsEmpty());
}
@ -1152,69 +1289,80 @@ TEST(H26xPacketBufferTest, H265IdrIsNotKeyFrameEvenWithSprop) {
packet_buffer.SetSpropParameterSets(kExampleSpropString);
EXPECT_THAT(
packet_buffer.InsertPacket(H265Packet().Idr().Marker().Build()).packets,
packet_buffer
.InsertPacket(H265Packet().Idr().AsFirstPacket().Marker().Build())
.packets,
IsEmpty());
}
TEST(H26xPacketBufferTest, H265SpsPpsIdrIsNotKeyFrame) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
EXPECT_THAT(packet_buffer
.InsertPacket(H265Packet().Sps().Pps().Idr().Marker().Build())
.packets,
IsEmpty());
EXPECT_THAT(
packet_buffer
.InsertPacket(
H265Packet().Sps().Pps().Idr().AsFirstPacket().Marker().Build())
.packets,
IsEmpty());
}
TEST(H26xPacketBufferTest, H265VpsPpsIdrIsNotKeyFrame) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
EXPECT_THAT(packet_buffer
.InsertPacket(H265Packet().Vps().Pps().Idr().Marker().Build())
.packets,
IsEmpty());
EXPECT_THAT(
packet_buffer
.InsertPacket(
H265Packet().Vps().Pps().Idr().AsFirstPacket().Marker().Build())
.packets,
IsEmpty());
}
TEST(H26xPacketBufferTest, H265VpsSpsIdrIsNotKeyFrame) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
EXPECT_THAT(packet_buffer
.InsertPacket(H265Packet().Vps().Sps().Idr().Marker().Build())
.packets,
IsEmpty());
EXPECT_THAT(
packet_buffer
.InsertPacket(
H265Packet().Vps().Sps().Idr().AsFirstPacket().Marker().Build())
.packets,
IsEmpty());
}
TEST(H26xPacketBufferTest, H265VpsIdrIsNotKeyFrame) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
EXPECT_THAT(
packet_buffer.InsertPacket(H265Packet().Vps().Idr().Marker().Build())
.packets,
IsEmpty());
EXPECT_THAT(packet_buffer
.InsertPacket(
H265Packet().Vps().Idr().AsFirstPacket().Marker().Build())
.packets,
IsEmpty());
}
TEST(H26xPacketBufferTest, H265SpsIdrIsNotKeyFrame) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
EXPECT_THAT(
packet_buffer.InsertPacket(H265Packet().Sps().Idr().Marker().Build())
.packets,
IsEmpty());
EXPECT_THAT(packet_buffer
.InsertPacket(
H265Packet().Sps().Idr().AsFirstPacket().Marker().Build())
.packets,
IsEmpty());
}
TEST(H26xPacketBufferTest, H265PpsIdrIsNotKeyFrame) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
EXPECT_THAT(
packet_buffer.InsertPacket(H265Packet().Pps().Idr().Marker().Build())
.packets,
IsEmpty());
EXPECT_THAT(packet_buffer
.InsertPacket(
H265Packet().Pps().Idr().AsFirstPacket().Marker().Build())
.packets,
IsEmpty());
}
TEST(H26xPacketBufferTest, H265ResolutionSetOnSpsPacket) {
H26xPacketBuffer packet_buffer(/*h264_allow_idr_only_keyframes=*/false);
RTC_UNUSED(
packet_buffer.InsertPacket(H265Packet().Aud().SeqNum(1).Time(1).Build()));
RTC_UNUSED(packet_buffer.InsertPacket(
H265Packet().Aud().SeqNum(1).Time(1).AsFirstPacket().Build()));
auto res = packet_buffer.InsertPacket(H265Packet()
.Vps()
.SpsWithResolution({320, 240})
@ -1222,6 +1370,7 @@ TEST(H26xPacketBufferTest, H265ResolutionSetOnSpsPacket) {
.Idr()
.SeqNum(2)
.Time(1)
.AsFirstPacket()
.Marker()
.Build());
@ -1237,8 +1386,14 @@ TEST(H26xPacketBufferTest, H265InsertingVpsSpsPpsLastCompletesKeyframe) {
H265Packet().Idr().SeqNum(2).Time(1).Marker().Build()));
EXPECT_THAT(packet_buffer
.InsertPacket(
H265Packet().Vps().Sps().Pps().SeqNum(1).Time(1).Build())
.InsertPacket(H265Packet()
.Vps()
.Sps()
.Pps()
.SeqNum(1)
.Time(1)
.AsFirstPacket()
.Build())
.packets,
SizeIs(2));
}