mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 22:00:47 +01:00
Remove RTPVideoHeader::vp8() accessors.
Bug: none Change-Id: Ia7d65148fb36a8f26647bee8a876ce7217ff8a68 Reviewed-on: https://webrtc-review.googlesource.com/93321 Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Stefan Holmer <stefan@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Commit-Queue: Philip Eliasson <philipel@webrtc.org> Cr-Commit-Position: refs/heads/master@{#24626}
This commit is contained in:
parent
5e007b77f1
commit
af7afc6642
19 changed files with 237 additions and 185 deletions
|
@ -27,11 +27,12 @@ void PopulateRtpWithCodecSpecifics(const CodecSpecificInfo& info,
|
||||||
rtp->codec = info.codecType;
|
rtp->codec = info.codecType;
|
||||||
switch (info.codecType) {
|
switch (info.codecType) {
|
||||||
case kVideoCodecVP8: {
|
case kVideoCodecVP8: {
|
||||||
rtp->vp8().InitRTPVideoHeaderVP8();
|
auto& vp8_header = rtp->video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
rtp->vp8().nonReference = info.codecSpecific.VP8.nonReference;
|
vp8_header.InitRTPVideoHeaderVP8();
|
||||||
rtp->vp8().temporalIdx = info.codecSpecific.VP8.temporalIdx;
|
vp8_header.nonReference = info.codecSpecific.VP8.nonReference;
|
||||||
rtp->vp8().layerSync = info.codecSpecific.VP8.layerSync;
|
vp8_header.temporalIdx = info.codecSpecific.VP8.temporalIdx;
|
||||||
rtp->vp8().keyIdx = info.codecSpecific.VP8.keyIdx;
|
vp8_header.layerSync = info.codecSpecific.VP8.layerSync;
|
||||||
|
vp8_header.keyIdx = info.codecSpecific.VP8.keyIdx;
|
||||||
rtp->simulcastIdx = spatial_index.value_or(0);
|
rtp->simulcastIdx = spatial_index.value_or(0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -171,13 +172,15 @@ void RtpPayloadParams::SetCodecSpecific(RTPVideoHeader* rtp_video_header,
|
||||||
state_.picture_id = (static_cast<uint16_t>(state_.picture_id) + 1) & 0x7FFF;
|
state_.picture_id = (static_cast<uint16_t>(state_.picture_id) + 1) & 0x7FFF;
|
||||||
}
|
}
|
||||||
if (rtp_video_header->codec == kVideoCodecVP8) {
|
if (rtp_video_header->codec == kVideoCodecVP8) {
|
||||||
rtp_video_header->vp8().pictureId = state_.picture_id;
|
auto& vp8_header =
|
||||||
|
absl::get<RTPVideoHeaderVP8>(rtp_video_header->video_type_header);
|
||||||
|
vp8_header.pictureId = state_.picture_id;
|
||||||
|
|
||||||
if (rtp_video_header->vp8().temporalIdx != kNoTemporalIdx) {
|
if (vp8_header.temporalIdx != kNoTemporalIdx) {
|
||||||
if (rtp_video_header->vp8().temporalIdx == 0) {
|
if (vp8_header.temporalIdx == 0) {
|
||||||
++state_.tl0_pic_idx;
|
++state_.tl0_pic_idx;
|
||||||
}
|
}
|
||||||
rtp_video_header->vp8().tl0PicIdx = state_.tl0_pic_idx;
|
vp8_header.tl0PicIdx = state_.tl0_pic_idx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rtp_video_header->codec == kVideoCodecVP9) {
|
if (rtp_video_header->codec == kVideoCodecVP9) {
|
||||||
|
|
|
@ -61,12 +61,14 @@ TEST(RtpPayloadParamsTest, InfoMappedToRtpVideoHeader_Vp8) {
|
||||||
EXPECT_EQ(VideoContentType::SCREENSHARE, header.content_type);
|
EXPECT_EQ(VideoContentType::SCREENSHARE, header.content_type);
|
||||||
EXPECT_EQ(1, header.simulcastIdx);
|
EXPECT_EQ(1, header.simulcastIdx);
|
||||||
EXPECT_EQ(kVideoCodecVP8, header.codec);
|
EXPECT_EQ(kVideoCodecVP8, header.codec);
|
||||||
EXPECT_EQ(kPictureId + 2, header.vp8().pictureId);
|
const auto& vp8_header =
|
||||||
EXPECT_EQ(kTemporalIdx, header.vp8().temporalIdx);
|
absl::get<RTPVideoHeaderVP8>(header.video_type_header);
|
||||||
EXPECT_EQ(kTl0PicIdx + 1, header.vp8().tl0PicIdx);
|
EXPECT_EQ(kPictureId + 2, vp8_header.pictureId);
|
||||||
EXPECT_EQ(kNoKeyIdx, header.vp8().keyIdx);
|
EXPECT_EQ(kTemporalIdx, vp8_header.temporalIdx);
|
||||||
EXPECT_TRUE(header.vp8().layerSync);
|
EXPECT_EQ(kTl0PicIdx + 1, vp8_header.tl0PicIdx);
|
||||||
EXPECT_TRUE(header.vp8().nonReference);
|
EXPECT_EQ(kNoKeyIdx, vp8_header.keyIdx);
|
||||||
|
EXPECT_TRUE(vp8_header.layerSync);
|
||||||
|
EXPECT_TRUE(vp8_header.nonReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(RtpPayloadParamsTest, InfoMappedToRtpVideoHeader_Vp9) {
|
TEST(RtpPayloadParamsTest, InfoMappedToRtpVideoHeader_Vp9) {
|
||||||
|
@ -157,7 +159,8 @@ TEST(RtpPayloadParamsTest, PictureIdIsSetForVp8) {
|
||||||
RTPVideoHeader header =
|
RTPVideoHeader header =
|
||||||
params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
|
params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
|
||||||
EXPECT_EQ(kVideoCodecVP8, header.codec);
|
EXPECT_EQ(kVideoCodecVP8, header.codec);
|
||||||
EXPECT_EQ(kInitialPictureId1 + 1, header.vp8().pictureId);
|
EXPECT_EQ(kInitialPictureId1 + 1,
|
||||||
|
absl::get<RTPVideoHeaderVP8>(header.video_type_header).pictureId);
|
||||||
|
|
||||||
// State should hold latest used picture id and tl0_pic_idx.
|
// State should hold latest used picture id and tl0_pic_idx.
|
||||||
state = params.state();
|
state = params.state();
|
||||||
|
@ -180,7 +183,8 @@ TEST(RtpPayloadParamsTest, PictureIdWraps) {
|
||||||
RTPVideoHeader header =
|
RTPVideoHeader header =
|
||||||
params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
|
params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
|
||||||
EXPECT_EQ(kVideoCodecVP8, header.codec);
|
EXPECT_EQ(kVideoCodecVP8, header.codec);
|
||||||
EXPECT_EQ(0, header.vp8().pictureId);
|
EXPECT_EQ(0,
|
||||||
|
absl::get<RTPVideoHeaderVP8>(header.video_type_header).pictureId);
|
||||||
|
|
||||||
// State should hold latest used picture id and tl0_pic_idx.
|
// State should hold latest used picture id and tl0_pic_idx.
|
||||||
EXPECT_EQ(0, params.state().picture_id); // Wrapped.
|
EXPECT_EQ(0, params.state().picture_id); // Wrapped.
|
||||||
|
@ -205,16 +209,18 @@ TEST(RtpPayloadParamsTest, Tl0PicIdxUpdatedForVp8) {
|
||||||
params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
|
params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
|
||||||
|
|
||||||
EXPECT_EQ(kVideoCodecVP8, header.codec);
|
EXPECT_EQ(kVideoCodecVP8, header.codec);
|
||||||
EXPECT_EQ(kInitialPictureId1 + 1, header.vp8().pictureId);
|
const auto& vp8_header =
|
||||||
EXPECT_EQ(kInitialTl0PicIdx1, header.vp8().tl0PicIdx);
|
absl::get<RTPVideoHeaderVP8>(header.video_type_header);
|
||||||
|
EXPECT_EQ(kInitialPictureId1 + 1, vp8_header.pictureId);
|
||||||
|
EXPECT_EQ(kInitialTl0PicIdx1, vp8_header.tl0PicIdx);
|
||||||
|
|
||||||
// OnEncodedImage, temporalIdx: 0.
|
// OnEncodedImage, temporalIdx: 0.
|
||||||
codec_info.codecSpecific.VP8.temporalIdx = 0;
|
codec_info.codecSpecific.VP8.temporalIdx = 0;
|
||||||
|
|
||||||
header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
|
header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
|
||||||
EXPECT_EQ(kVideoCodecVP8, header.codec);
|
EXPECT_EQ(kVideoCodecVP8, header.codec);
|
||||||
EXPECT_EQ(kInitialPictureId1 + 2, header.vp8().pictureId);
|
EXPECT_EQ(kInitialPictureId1 + 2, vp8_header.pictureId);
|
||||||
EXPECT_EQ(kInitialTl0PicIdx1 + 1, header.vp8().tl0PicIdx);
|
EXPECT_EQ(kInitialTl0PicIdx1 + 1, vp8_header.tl0PicIdx);
|
||||||
|
|
||||||
// State should hold latest used picture id and tl0_pic_idx.
|
// State should hold latest used picture id and tl0_pic_idx.
|
||||||
EXPECT_EQ(kInitialPictureId1 + 2, params.state().picture_id);
|
EXPECT_EQ(kInitialPictureId1 + 2, params.state().picture_id);
|
||||||
|
|
|
@ -318,16 +318,16 @@ bool RtpDepacketizerVp8::Parse(ParsedPayload* parsed_payload,
|
||||||
beginning_of_partition && (partition_id == 0);
|
beginning_of_partition && (partition_id == 0);
|
||||||
parsed_payload->video_header().simulcastIdx = 0;
|
parsed_payload->video_header().simulcastIdx = 0;
|
||||||
parsed_payload->video_header().codec = kVideoCodecVP8;
|
parsed_payload->video_header().codec = kVideoCodecVP8;
|
||||||
parsed_payload->video_header().vp8().nonReference =
|
auto& vp8_header = parsed_payload->video_header()
|
||||||
(*payload_data & 0x20) ? true : false; // N bit
|
.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
parsed_payload->video_header().vp8().partitionId = partition_id;
|
vp8_header.nonReference = (*payload_data & 0x20) ? true : false; // N bit
|
||||||
parsed_payload->video_header().vp8().beginningOfPartition =
|
vp8_header.partitionId = partition_id;
|
||||||
beginning_of_partition;
|
vp8_header.beginningOfPartition = beginning_of_partition;
|
||||||
parsed_payload->video_header().vp8().pictureId = kNoPictureId;
|
vp8_header.pictureId = kNoPictureId;
|
||||||
parsed_payload->video_header().vp8().tl0PicIdx = kNoTl0PicIdx;
|
vp8_header.tl0PicIdx = kNoTl0PicIdx;
|
||||||
parsed_payload->video_header().vp8().temporalIdx = kNoTemporalIdx;
|
vp8_header.temporalIdx = kNoTemporalIdx;
|
||||||
parsed_payload->video_header().vp8().layerSync = false;
|
vp8_header.layerSync = false;
|
||||||
parsed_payload->video_header().vp8().keyIdx = kNoKeyIdx;
|
vp8_header.keyIdx = kNoKeyIdx;
|
||||||
|
|
||||||
if (partition_id > 8) {
|
if (partition_id > 8) {
|
||||||
// Weak check for corrupt payload_data: PartID MUST NOT be larger than 8.
|
// Weak check for corrupt payload_data: PartID MUST NOT be larger than 8.
|
||||||
|
@ -344,8 +344,7 @@ bool RtpDepacketizerVp8::Parse(ParsedPayload* parsed_payload,
|
||||||
|
|
||||||
if (extension) {
|
if (extension) {
|
||||||
const int parsed_bytes =
|
const int parsed_bytes =
|
||||||
ParseVP8Extension(&parsed_payload->video_header().vp8(), payload_data,
|
ParseVP8Extension(&vp8_header, payload_data, payload_data_length);
|
||||||
payload_data_length);
|
|
||||||
if (parsed_bytes < 0)
|
if (parsed_bytes < 0)
|
||||||
return false;
|
return false;
|
||||||
payload_data += parsed_bytes;
|
payload_data += parsed_bytes;
|
||||||
|
|
|
@ -57,9 +57,11 @@ constexpr RtpPacketizer::PayloadSizeLimits kNoSizeLimits;
|
||||||
// +-+-+-+-+-+-+-+-+
|
// +-+-+-+-+-+-+-+-+
|
||||||
void VerifyBasicHeader(RTPVideoHeader* header, bool N, bool S, int part_id) {
|
void VerifyBasicHeader(RTPVideoHeader* header, bool N, bool S, int part_id) {
|
||||||
ASSERT_TRUE(header != NULL);
|
ASSERT_TRUE(header != NULL);
|
||||||
EXPECT_EQ(N, header->vp8().nonReference);
|
const auto& vp8_header =
|
||||||
EXPECT_EQ(S, header->vp8().beginningOfPartition);
|
absl::get<RTPVideoHeaderVP8>(header->video_type_header);
|
||||||
EXPECT_EQ(part_id, header->vp8().partitionId);
|
EXPECT_EQ(N, vp8_header.nonReference);
|
||||||
|
EXPECT_EQ(S, vp8_header.beginningOfPartition);
|
||||||
|
EXPECT_EQ(part_id, vp8_header.partitionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VerifyExtensions(RTPVideoHeader* header,
|
void VerifyExtensions(RTPVideoHeader* header,
|
||||||
|
@ -68,10 +70,12 @@ void VerifyExtensions(RTPVideoHeader* header,
|
||||||
uint8_t temporal_idx, /* T */
|
uint8_t temporal_idx, /* T */
|
||||||
int key_idx /* K */) {
|
int key_idx /* K */) {
|
||||||
ASSERT_TRUE(header != NULL);
|
ASSERT_TRUE(header != NULL);
|
||||||
EXPECT_EQ(picture_id, header->vp8().pictureId);
|
const auto& vp8_header =
|
||||||
EXPECT_EQ(tl0_pic_idx, header->vp8().tl0PicIdx);
|
absl::get<RTPVideoHeaderVP8>(header->video_type_header);
|
||||||
EXPECT_EQ(temporal_idx, header->vp8().temporalIdx);
|
EXPECT_EQ(picture_id, vp8_header.pictureId);
|
||||||
EXPECT_EQ(key_idx, header->vp8().keyIdx);
|
EXPECT_EQ(tl0_pic_idx, vp8_header.tl0PicIdx);
|
||||||
|
EXPECT_EQ(temporal_idx, vp8_header.temporalIdx);
|
||||||
|
EXPECT_EQ(key_idx, vp8_header.keyIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -268,7 +272,9 @@ TEST_F(RtpDepacketizerVp8Test, TIDAndLayerSync) {
|
||||||
VerifyBasicHeader(&payload.video_header(), 0, 0, 8);
|
VerifyBasicHeader(&payload.video_header(), 0, 0, 8);
|
||||||
VerifyExtensions(&payload.video_header(), kNoPictureId, kNoTl0PicIdx, 2,
|
VerifyExtensions(&payload.video_header(), kNoPictureId, kNoTl0PicIdx, 2,
|
||||||
kNoKeyIdx);
|
kNoKeyIdx);
|
||||||
EXPECT_FALSE(payload.video_header().vp8().layerSync);
|
EXPECT_FALSE(
|
||||||
|
absl::get<RTPVideoHeaderVP8>(payload.video_header().video_type_header)
|
||||||
|
.layerSync);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(RtpDepacketizerVp8Test, KeyIdx) {
|
TEST_F(RtpDepacketizerVp8Test, KeyIdx) {
|
||||||
|
@ -351,7 +357,10 @@ TEST_F(RtpDepacketizerVp8Test, TestWithPacketizer) {
|
||||||
VerifyExtensions(&payload.video_header(), input_header.pictureId,
|
VerifyExtensions(&payload.video_header(), input_header.pictureId,
|
||||||
input_header.tl0PicIdx, input_header.temporalIdx,
|
input_header.tl0PicIdx, input_header.temporalIdx,
|
||||||
input_header.keyIdx);
|
input_header.keyIdx);
|
||||||
EXPECT_EQ(payload.video_header().vp8().layerSync, input_header.layerSync);
|
EXPECT_EQ(
|
||||||
|
absl::get<RTPVideoHeaderVP8>(payload.video_header().video_type_header)
|
||||||
|
.layerSync,
|
||||||
|
input_header.layerSync);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(RtpDepacketizerVp8Test, TestEmptyPayload) {
|
TEST_F(RtpDepacketizerVp8Test, TestEmptyPayload) {
|
||||||
|
|
|
@ -240,7 +240,7 @@ class RtpRtcpImplTest : public ::testing::Test {
|
||||||
rtp_video_header.is_first_packet_in_frame = true;
|
rtp_video_header.is_first_packet_in_frame = true;
|
||||||
rtp_video_header.simulcastIdx = 0;
|
rtp_video_header.simulcastIdx = 0;
|
||||||
rtp_video_header.codec = kVideoCodecVP8;
|
rtp_video_header.codec = kVideoCodecVP8;
|
||||||
rtp_video_header.vp8() = vp8_header;
|
rtp_video_header.video_type_header = vp8_header;
|
||||||
rtp_video_header.video_timing = {0u, 0u, 0u, 0u, 0u, 0u, false};
|
rtp_video_header.video_timing = {0u, 0u, 0u, 0u, 0u, 0u, false};
|
||||||
|
|
||||||
const uint8_t payload[100] = {0};
|
const uint8_t payload[100] = {0};
|
||||||
|
|
|
@ -1842,7 +1842,8 @@ TEST_P(RtpSenderVideoTest, RetransmissionTypesH264) {
|
||||||
TEST_P(RtpSenderVideoTest, RetransmissionTypesVP8BaseLayer) {
|
TEST_P(RtpSenderVideoTest, RetransmissionTypesVP8BaseLayer) {
|
||||||
RTPVideoHeader header;
|
RTPVideoHeader header;
|
||||||
header.codec = kVideoCodecVP8;
|
header.codec = kVideoCodecVP8;
|
||||||
header.vp8().temporalIdx = 0;
|
auto& vp8_header = header.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
|
vp8_header.temporalIdx = 0;
|
||||||
|
|
||||||
EXPECT_EQ(kDontRetransmit,
|
EXPECT_EQ(kDontRetransmit,
|
||||||
rtp_sender_video_->GetStorageType(
|
rtp_sender_video_->GetStorageType(
|
||||||
|
@ -1874,8 +1875,9 @@ TEST_P(RtpSenderVideoTest, RetransmissionTypesVP8HigherLayers) {
|
||||||
RTPVideoHeader header;
|
RTPVideoHeader header;
|
||||||
header.codec = kVideoCodecVP8;
|
header.codec = kVideoCodecVP8;
|
||||||
|
|
||||||
|
auto& vp8_header = header.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
for (int tid = 1; tid <= kMaxTemporalStreams; ++tid) {
|
for (int tid = 1; tid <= kMaxTemporalStreams; ++tid) {
|
||||||
header.vp8().temporalIdx = tid;
|
vp8_header.temporalIdx = tid;
|
||||||
|
|
||||||
EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
|
EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
|
||||||
header, kRetransmitOff,
|
header, kRetransmitOff,
|
||||||
|
@ -1938,8 +1940,9 @@ TEST_P(RtpSenderVideoTest, ConditionalRetransmit) {
|
||||||
(RTPSenderVideo::kTLRateWindowSizeMs + (kFrameIntervalMs / 2)) /
|
(RTPSenderVideo::kTLRateWindowSizeMs + (kFrameIntervalMs / 2)) /
|
||||||
kFrameIntervalMs;
|
kFrameIntervalMs;
|
||||||
constexpr int kPattern[] = {0, 2, 1, 2};
|
constexpr int kPattern[] = {0, 2, 1, 2};
|
||||||
|
auto& vp8_header = header.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
for (size_t i = 0; i < arraysize(kPattern) * kNumRepetitions; ++i) {
|
for (size_t i = 0; i < arraysize(kPattern) * kNumRepetitions; ++i) {
|
||||||
header.vp8().temporalIdx = kPattern[i % arraysize(kPattern)];
|
vp8_header.temporalIdx = kPattern[i % arraysize(kPattern)];
|
||||||
rtp_sender_video_->GetStorageType(header, kSettings, kRttMs);
|
rtp_sender_video_->GetStorageType(header, kSettings, kRttMs);
|
||||||
fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
|
fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
|
||||||
}
|
}
|
||||||
|
@ -1948,7 +1951,7 @@ TEST_P(RtpSenderVideoTest, ConditionalRetransmit) {
|
||||||
// right now. We will wait at most one expected retransmission time before
|
// right now. We will wait at most one expected retransmission time before
|
||||||
// acknowledging that it did not arrive, which means this frame and the next
|
// acknowledging that it did not arrive, which means this frame and the next
|
||||||
// will not be retransmitted.
|
// will not be retransmitted.
|
||||||
header.vp8().temporalIdx = 1;
|
vp8_header.temporalIdx = 1;
|
||||||
EXPECT_EQ(StorageType::kDontRetransmit,
|
EXPECT_EQ(StorageType::kDontRetransmit,
|
||||||
rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
|
rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
|
||||||
fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
|
fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
|
||||||
|
@ -1964,7 +1967,7 @@ TEST_P(RtpSenderVideoTest, ConditionalRetransmit) {
|
||||||
// Insert a frame for TL2. We just had frame in TL1, so the next one there is
|
// Insert a frame for TL2. We just had frame in TL1, so the next one there is
|
||||||
// in three frames away. TL0 is still too far in the past. So, allow
|
// in three frames away. TL0 is still too far in the past. So, allow
|
||||||
// retransmission.
|
// retransmission.
|
||||||
header.vp8().temporalIdx = 2;
|
vp8_header.temporalIdx = 2;
|
||||||
EXPECT_EQ(StorageType::kAllowRetransmission,
|
EXPECT_EQ(StorageType::kAllowRetransmission,
|
||||||
rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
|
rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
|
||||||
fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
|
fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
|
||||||
|
@ -1995,8 +1998,9 @@ TEST_P(RtpSenderVideoTest, ConditionalRetransmitLimit) {
|
||||||
(RTPSenderVideo::kTLRateWindowSizeMs + (kFrameIntervalMs / 2)) /
|
(RTPSenderVideo::kTLRateWindowSizeMs + (kFrameIntervalMs / 2)) /
|
||||||
kFrameIntervalMs;
|
kFrameIntervalMs;
|
||||||
constexpr int kPattern[] = {0, 2, 2, 2};
|
constexpr int kPattern[] = {0, 2, 2, 2};
|
||||||
|
auto& vp8_header = header.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
for (size_t i = 0; i < arraysize(kPattern) * kNumRepetitions; ++i) {
|
for (size_t i = 0; i < arraysize(kPattern) * kNumRepetitions; ++i) {
|
||||||
header.vp8().temporalIdx = kPattern[i % arraysize(kPattern)];
|
vp8_header.temporalIdx = kPattern[i % arraysize(kPattern)];
|
||||||
|
|
||||||
rtp_sender_video_->GetStorageType(header, kSettings, kRttMs);
|
rtp_sender_video_->GetStorageType(header, kSettings, kRttMs);
|
||||||
fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
|
fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
|
||||||
|
@ -2007,7 +2011,7 @@ TEST_P(RtpSenderVideoTest, ConditionalRetransmitLimit) {
|
||||||
// we don't store for retransmission because we expect a frame in a lower
|
// we don't store for retransmission because we expect a frame in a lower
|
||||||
// layer, but that last frame in TL1 was a long time ago in absolute terms,
|
// layer, but that last frame in TL1 was a long time ago in absolute terms,
|
||||||
// so allow retransmission anyway.
|
// so allow retransmission anyway.
|
||||||
header.vp8().temporalIdx = 1;
|
vp8_header.temporalIdx = 1;
|
||||||
EXPECT_EQ(StorageType::kAllowRetransmission,
|
EXPECT_EQ(StorageType::kAllowRetransmission,
|
||||||
rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
|
rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
|
||||||
}
|
}
|
||||||
|
|
|
@ -466,15 +466,15 @@ StorageType RTPSenderVideo::GetStorageType(
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t RTPSenderVideo::GetTemporalId(const RTPVideoHeader& header) {
|
uint8_t RTPSenderVideo::GetTemporalId(const RTPVideoHeader& header) {
|
||||||
switch (header.codec) {
|
struct TemporalIdGetter {
|
||||||
case kVideoCodecVP8:
|
uint8_t operator()(const RTPVideoHeaderVP8& vp8) { return vp8.temporalIdx; }
|
||||||
return header.vp8().temporalIdx;
|
uint8_t operator()(const RTPVideoHeaderVP9& vp9) {
|
||||||
case kVideoCodecVP9:
|
return vp9.temporal_idx;
|
||||||
return absl::get<RTPVideoHeaderVP9>(header.video_type_header)
|
}
|
||||||
.temporal_idx;
|
uint8_t operator()(const RTPVideoHeaderH264&) { return kNoTemporalIdx; }
|
||||||
default:
|
uint8_t operator()(const absl::monostate&) { return kNoTemporalIdx; }
|
||||||
return kNoTemporalIdx;
|
};
|
||||||
}
|
return absl::visit(TemporalIdGetter(), header.video_type_header);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RTPSenderVideo::UpdateConditionalRetransmit(
|
bool RTPSenderVideo::UpdateConditionalRetransmit(
|
||||||
|
|
|
@ -21,8 +21,10 @@
|
||||||
#include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
|
#include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
using RTPVideoTypeHeader =
|
using RTPVideoTypeHeader = absl::variant<absl::monostate,
|
||||||
absl::variant<RTPVideoHeaderVP8, RTPVideoHeaderVP9, RTPVideoHeaderH264>;
|
RTPVideoHeaderVP8,
|
||||||
|
RTPVideoHeaderVP9,
|
||||||
|
RTPVideoHeaderH264>;
|
||||||
|
|
||||||
struct RTPVideoHeader {
|
struct RTPVideoHeader {
|
||||||
struct GenericDescriptorInfo {
|
struct GenericDescriptorInfo {
|
||||||
|
@ -42,21 +44,6 @@ struct RTPVideoHeader {
|
||||||
|
|
||||||
~RTPVideoHeader();
|
~RTPVideoHeader();
|
||||||
|
|
||||||
// TODO(philipel): Remove when downstream projects have been updated.
|
|
||||||
RTPVideoHeaderVP8& vp8() {
|
|
||||||
if (!absl::holds_alternative<RTPVideoHeaderVP8>(video_type_header))
|
|
||||||
video_type_header.emplace<RTPVideoHeaderVP8>();
|
|
||||||
|
|
||||||
return absl::get<RTPVideoHeaderVP8>(video_type_header);
|
|
||||||
}
|
|
||||||
// TODO(philipel): Remove when downstream projects have been updated.
|
|
||||||
const RTPVideoHeaderVP8& vp8() const {
|
|
||||||
if (!absl::holds_alternative<RTPVideoHeaderVP8>(video_type_header))
|
|
||||||
video_type_header.emplace<RTPVideoHeaderVP8>();
|
|
||||||
|
|
||||||
return absl::get<RTPVideoHeaderVP8>(video_type_header);
|
|
||||||
}
|
|
||||||
|
|
||||||
absl::optional<GenericDescriptorInfo> generic;
|
absl::optional<GenericDescriptorInfo> generic;
|
||||||
|
|
||||||
uint16_t width = 0;
|
uint16_t width = 0;
|
||||||
|
@ -69,8 +56,7 @@ struct RTPVideoHeader {
|
||||||
|
|
||||||
PlayoutDelay playout_delay;
|
PlayoutDelay playout_delay;
|
||||||
VideoSendTiming video_timing;
|
VideoSendTiming video_timing;
|
||||||
// TODO(philipel): remove mutable when downstream projects have been updated.
|
RTPVideoTypeHeader video_type_header;
|
||||||
mutable RTPVideoTypeHeader video_type_header;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|
|
@ -37,7 +37,9 @@ TEST(TestDecodingState, FrameContinuity) {
|
||||||
packet.seqNum = 0xffff;
|
packet.seqNum = 0xffff;
|
||||||
packet.frameType = kVideoFrameDelta;
|
packet.frameType = kVideoFrameDelta;
|
||||||
packet.video_header.codec = kVideoCodecVP8;
|
packet.video_header.codec = kVideoCodecVP8;
|
||||||
packet.video_header.vp8().pictureId = 0x007F;
|
auto& vp8_header =
|
||||||
|
packet.video_header.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
|
vp8_header.pictureId = 0x007F;
|
||||||
FrameData frame_data;
|
FrameData frame_data;
|
||||||
frame_data.rtt_ms = 0;
|
frame_data.rtt_ms = 0;
|
||||||
frame_data.rolling_average_packets_per_frame = -1;
|
frame_data.rolling_average_packets_per_frame = -1;
|
||||||
|
@ -53,17 +55,17 @@ TEST(TestDecodingState, FrameContinuity) {
|
||||||
packet.frameType = kVideoFrameDelta;
|
packet.frameType = kVideoFrameDelta;
|
||||||
// Use pictureId
|
// Use pictureId
|
||||||
packet.is_first_packet_in_frame = false;
|
packet.is_first_packet_in_frame = false;
|
||||||
packet.video_header.vp8().pictureId = 0x0002;
|
vp8_header.pictureId = 0x0002;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
packet.video_header.vp8().pictureId = 0;
|
vp8_header.pictureId = 0;
|
||||||
packet.seqNum = 10;
|
packet.seqNum = 10;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
||||||
|
|
||||||
// Use sequence numbers.
|
// Use sequence numbers.
|
||||||
packet.video_header.vp8().pictureId = kNoPictureId;
|
vp8_header.pictureId = kNoPictureId;
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
packet.seqNum = dec_state.sequence_num() - 1u;
|
packet.seqNum = dec_state.sequence_num() - 1u;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
|
@ -82,9 +84,9 @@ TEST(TestDecodingState, FrameContinuity) {
|
||||||
// Insert packet with temporal info.
|
// Insert packet with temporal info.
|
||||||
dec_state.Reset();
|
dec_state.Reset();
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
vp8_header.temporalIdx = 0;
|
||||||
packet.video_header.vp8().pictureId = 0;
|
vp8_header.pictureId = 0;
|
||||||
packet.seqNum = 1;
|
packet.seqNum = 1;
|
||||||
packet.timestamp = 1;
|
packet.timestamp = 1;
|
||||||
EXPECT_TRUE(dec_state.full_sync());
|
EXPECT_TRUE(dec_state.full_sync());
|
||||||
|
@ -93,9 +95,9 @@ TEST(TestDecodingState, FrameContinuity) {
|
||||||
EXPECT_TRUE(dec_state.full_sync());
|
EXPECT_TRUE(dec_state.full_sync());
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
// 1 layer up - still good.
|
// 1 layer up - still good.
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
packet.video_header.vp8().temporalIdx = 1;
|
vp8_header.temporalIdx = 1;
|
||||||
packet.video_header.vp8().pictureId = 1;
|
vp8_header.pictureId = 1;
|
||||||
packet.seqNum = 2;
|
packet.seqNum = 2;
|
||||||
packet.timestamp = 2;
|
packet.timestamp = 2;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
|
@ -104,18 +106,18 @@ TEST(TestDecodingState, FrameContinuity) {
|
||||||
EXPECT_TRUE(dec_state.full_sync());
|
EXPECT_TRUE(dec_state.full_sync());
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
// Lost non-base layer packet => should update sync parameter.
|
// Lost non-base layer packet => should update sync parameter.
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
packet.video_header.vp8().temporalIdx = 3;
|
vp8_header.temporalIdx = 3;
|
||||||
packet.video_header.vp8().pictureId = 3;
|
vp8_header.pictureId = 3;
|
||||||
packet.seqNum = 4;
|
packet.seqNum = 4;
|
||||||
packet.timestamp = 4;
|
packet.timestamp = 4;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
||||||
// Now insert the next non-base layer (belonging to a next tl0PicId).
|
// Now insert the next non-base layer (belonging to a next tl0PicId).
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
packet.video_header.vp8().tl0PicIdx = 1;
|
vp8_header.tl0PicIdx = 1;
|
||||||
packet.video_header.vp8().temporalIdx = 2;
|
vp8_header.temporalIdx = 2;
|
||||||
packet.video_header.vp8().pictureId = 4;
|
vp8_header.pictureId = 4;
|
||||||
packet.seqNum = 5;
|
packet.seqNum = 5;
|
||||||
packet.timestamp = 5;
|
packet.timestamp = 5;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
|
@ -125,9 +127,9 @@ TEST(TestDecodingState, FrameContinuity) {
|
||||||
EXPECT_TRUE(dec_state.full_sync());
|
EXPECT_TRUE(dec_state.full_sync());
|
||||||
// Next base layer (dropped interim non-base layers) - should update sync.
|
// Next base layer (dropped interim non-base layers) - should update sync.
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
packet.video_header.vp8().tl0PicIdx = 1;
|
vp8_header.tl0PicIdx = 1;
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
vp8_header.temporalIdx = 0;
|
||||||
packet.video_header.vp8().pictureId = 5;
|
vp8_header.pictureId = 5;
|
||||||
packet.seqNum = 6;
|
packet.seqNum = 6;
|
||||||
packet.timestamp = 6;
|
packet.timestamp = 6;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
|
@ -137,18 +139,18 @@ TEST(TestDecodingState, FrameContinuity) {
|
||||||
|
|
||||||
// Check wrap for temporal layers.
|
// Check wrap for temporal layers.
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
packet.video_header.vp8().tl0PicIdx = 0x00FF;
|
vp8_header.tl0PicIdx = 0x00FF;
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
vp8_header.temporalIdx = 0;
|
||||||
packet.video_header.vp8().pictureId = 6;
|
vp8_header.pictureId = 6;
|
||||||
packet.seqNum = 7;
|
packet.seqNum = 7;
|
||||||
packet.timestamp = 7;
|
packet.timestamp = 7;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
dec_state.SetState(&frame);
|
dec_state.SetState(&frame);
|
||||||
EXPECT_FALSE(dec_state.full_sync());
|
EXPECT_FALSE(dec_state.full_sync());
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
packet.video_header.vp8().tl0PicIdx = 0x0000;
|
vp8_header.tl0PicIdx = 0x0000;
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
vp8_header.temporalIdx = 0;
|
||||||
packet.video_header.vp8().pictureId = 7;
|
vp8_header.pictureId = 7;
|
||||||
packet.seqNum = 8;
|
packet.seqNum = 8;
|
||||||
packet.timestamp = 8;
|
packet.timestamp = 8;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
|
@ -214,9 +216,11 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
packet.video_header.codec = kVideoCodecVP8;
|
packet.video_header.codec = kVideoCodecVP8;
|
||||||
packet.timestamp = 0;
|
packet.timestamp = 0;
|
||||||
packet.seqNum = 0;
|
packet.seqNum = 0;
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
auto& vp8_header =
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
packet.video_header.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
packet.video_header.vp8().pictureId = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
|
vp8_header.temporalIdx = 0;
|
||||||
|
vp8_header.pictureId = 0;
|
||||||
FrameData frame_data;
|
FrameData frame_data;
|
||||||
frame_data.rtt_ms = 0;
|
frame_data.rtt_ms = 0;
|
||||||
frame_data.rolling_average_packets_per_frame = -1;
|
frame_data.rolling_average_packets_per_frame = -1;
|
||||||
|
@ -226,9 +230,9 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
packet.timestamp = 1;
|
packet.timestamp = 1;
|
||||||
packet.seqNum = 1;
|
packet.seqNum = 1;
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
packet.video_header.vp8().temporalIdx = 1;
|
vp8_header.temporalIdx = 1;
|
||||||
packet.video_header.vp8().pictureId = 1;
|
vp8_header.pictureId = 1;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
||||||
dec_state.SetState(&frame);
|
dec_state.SetState(&frame);
|
||||||
|
@ -238,9 +242,9 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
packet.timestamp = 3;
|
packet.timestamp = 3;
|
||||||
packet.seqNum = 3;
|
packet.seqNum = 3;
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
packet.video_header.vp8().temporalIdx = 3;
|
vp8_header.temporalIdx = 3;
|
||||||
packet.video_header.vp8().pictureId = 3;
|
vp8_header.pictureId = 3;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
||||||
dec_state.SetState(&frame);
|
dec_state.SetState(&frame);
|
||||||
|
@ -249,9 +253,9 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
packet.timestamp = 4;
|
packet.timestamp = 4;
|
||||||
packet.seqNum = 4;
|
packet.seqNum = 4;
|
||||||
packet.video_header.vp8().tl0PicIdx = 1;
|
vp8_header.tl0PicIdx = 1;
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
vp8_header.temporalIdx = 0;
|
||||||
packet.video_header.vp8().pictureId = 4;
|
vp8_header.pictureId = 4;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
||||||
dec_state.SetState(&frame);
|
dec_state.SetState(&frame);
|
||||||
|
@ -263,9 +267,9 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
packet.is_first_packet_in_frame = 1;
|
packet.is_first_packet_in_frame = 1;
|
||||||
packet.timestamp = 5;
|
packet.timestamp = 5;
|
||||||
packet.seqNum = 5;
|
packet.seqNum = 5;
|
||||||
packet.video_header.vp8().tl0PicIdx = 2;
|
vp8_header.tl0PicIdx = 2;
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
vp8_header.temporalIdx = 0;
|
||||||
packet.video_header.vp8().pictureId = 5;
|
vp8_header.pictureId = 5;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
||||||
dec_state.SetState(&frame);
|
dec_state.SetState(&frame);
|
||||||
|
@ -276,9 +280,9 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
packet.frameType = kVideoFrameDelta;
|
packet.frameType = kVideoFrameDelta;
|
||||||
packet.timestamp = 6;
|
packet.timestamp = 6;
|
||||||
packet.seqNum = 6;
|
packet.seqNum = 6;
|
||||||
packet.video_header.vp8().tl0PicIdx = 3;
|
vp8_header.tl0PicIdx = 3;
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
vp8_header.temporalIdx = 0;
|
||||||
packet.video_header.vp8().pictureId = 6;
|
vp8_header.pictureId = 6;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
||||||
EXPECT_TRUE(dec_state.full_sync());
|
EXPECT_TRUE(dec_state.full_sync());
|
||||||
|
@ -287,9 +291,9 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
packet.is_first_packet_in_frame = 1;
|
packet.is_first_packet_in_frame = 1;
|
||||||
packet.timestamp = 8;
|
packet.timestamp = 8;
|
||||||
packet.seqNum = 8;
|
packet.seqNum = 8;
|
||||||
packet.video_header.vp8().tl0PicIdx = 4;
|
vp8_header.tl0PicIdx = 4;
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
vp8_header.temporalIdx = 0;
|
||||||
packet.video_header.vp8().pictureId = 8;
|
vp8_header.pictureId = 8;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
||||||
EXPECT_TRUE(dec_state.full_sync());
|
EXPECT_TRUE(dec_state.full_sync());
|
||||||
|
@ -302,10 +306,10 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
packet.is_first_packet_in_frame = 1;
|
packet.is_first_packet_in_frame = 1;
|
||||||
packet.timestamp = 9;
|
packet.timestamp = 9;
|
||||||
packet.seqNum = 9;
|
packet.seqNum = 9;
|
||||||
packet.video_header.vp8().tl0PicIdx = 4;
|
vp8_header.tl0PicIdx = 4;
|
||||||
packet.video_header.vp8().temporalIdx = 2;
|
vp8_header.temporalIdx = 2;
|
||||||
packet.video_header.vp8().pictureId = 9;
|
vp8_header.pictureId = 9;
|
||||||
packet.video_header.vp8().layerSync = true;
|
vp8_header.layerSync = true;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
dec_state.SetState(&frame);
|
dec_state.SetState(&frame);
|
||||||
EXPECT_TRUE(dec_state.full_sync());
|
EXPECT_TRUE(dec_state.full_sync());
|
||||||
|
@ -323,10 +327,10 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
packet.markerBit = 1;
|
packet.markerBit = 1;
|
||||||
packet.timestamp = 0;
|
packet.timestamp = 0;
|
||||||
packet.seqNum = 0;
|
packet.seqNum = 0;
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
vp8_header.temporalIdx = 0;
|
||||||
packet.video_header.vp8().pictureId = 0;
|
vp8_header.pictureId = 0;
|
||||||
packet.video_header.vp8().layerSync = false;
|
vp8_header.layerSync = false;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
dec_state.SetState(&frame);
|
dec_state.SetState(&frame);
|
||||||
EXPECT_TRUE(dec_state.full_sync());
|
EXPECT_TRUE(dec_state.full_sync());
|
||||||
|
@ -337,10 +341,10 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
packet.markerBit = 0;
|
packet.markerBit = 0;
|
||||||
packet.timestamp = 1;
|
packet.timestamp = 1;
|
||||||
packet.seqNum = 1;
|
packet.seqNum = 1;
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
packet.video_header.vp8().temporalIdx = 2;
|
vp8_header.temporalIdx = 2;
|
||||||
packet.video_header.vp8().pictureId = 1;
|
vp8_header.pictureId = 1;
|
||||||
packet.video_header.vp8().layerSync = true;
|
vp8_header.layerSync = true;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
||||||
// Layer 1
|
// Layer 1
|
||||||
|
@ -350,10 +354,10 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||||
packet.markerBit = 1;
|
packet.markerBit = 1;
|
||||||
packet.timestamp = 2;
|
packet.timestamp = 2;
|
||||||
packet.seqNum = 3;
|
packet.seqNum = 3;
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
packet.video_header.vp8().temporalIdx = 1;
|
vp8_header.temporalIdx = 1;
|
||||||
packet.video_header.vp8().pictureId = 2;
|
vp8_header.pictureId = 2;
|
||||||
packet.video_header.vp8().layerSync = true;
|
vp8_header.layerSync = true;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
||||||
EXPECT_TRUE(dec_state.full_sync());
|
EXPECT_TRUE(dec_state.full_sync());
|
||||||
|
@ -368,9 +372,11 @@ TEST(TestDecodingState, DiscontinuousPicIdContinuousSeqNum) {
|
||||||
packet.video_header.codec = kVideoCodecVP8;
|
packet.video_header.codec = kVideoCodecVP8;
|
||||||
packet.timestamp = 0;
|
packet.timestamp = 0;
|
||||||
packet.seqNum = 0;
|
packet.seqNum = 0;
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
auto& vp8_header =
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
packet.video_header.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
packet.video_header.vp8().pictureId = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
|
vp8_header.temporalIdx = 0;
|
||||||
|
vp8_header.pictureId = 0;
|
||||||
FrameData frame_data;
|
FrameData frame_data;
|
||||||
frame_data.rtt_ms = 0;
|
frame_data.rtt_ms = 0;
|
||||||
frame_data.rolling_average_packets_per_frame = -1;
|
frame_data.rolling_average_packets_per_frame = -1;
|
||||||
|
@ -384,8 +390,8 @@ TEST(TestDecodingState, DiscontinuousPicIdContinuousSeqNum) {
|
||||||
packet.frameType = kVideoFrameDelta;
|
packet.frameType = kVideoFrameDelta;
|
||||||
packet.timestamp += 3000;
|
packet.timestamp += 3000;
|
||||||
++packet.seqNum;
|
++packet.seqNum;
|
||||||
packet.video_header.vp8().temporalIdx = 1;
|
vp8_header.temporalIdx = 1;
|
||||||
packet.video_header.vp8().pictureId = 2;
|
vp8_header.pictureId = 2;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
||||||
dec_state.SetState(&frame);
|
dec_state.SetState(&frame);
|
||||||
|
@ -421,9 +427,11 @@ TEST(TestDecodingState, PictureIdRepeat) {
|
||||||
packet.video_header.codec = kVideoCodecVP8;
|
packet.video_header.codec = kVideoCodecVP8;
|
||||||
packet.timestamp = 0;
|
packet.timestamp = 0;
|
||||||
packet.seqNum = 0;
|
packet.seqNum = 0;
|
||||||
packet.video_header.vp8().tl0PicIdx = 0;
|
auto& vp8_header =
|
||||||
packet.video_header.vp8().temporalIdx = 0;
|
packet.video_header.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
packet.video_header.vp8().pictureId = 0;
|
vp8_header.tl0PicIdx = 0;
|
||||||
|
vp8_header.temporalIdx = 0;
|
||||||
|
vp8_header.pictureId = 0;
|
||||||
FrameData frame_data;
|
FrameData frame_data;
|
||||||
frame_data.rtt_ms = 0;
|
frame_data.rtt_ms = 0;
|
||||||
frame_data.rolling_average_packets_per_frame = -1;
|
frame_data.rolling_average_packets_per_frame = -1;
|
||||||
|
@ -433,15 +441,15 @@ TEST(TestDecodingState, PictureIdRepeat) {
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
++packet.timestamp;
|
++packet.timestamp;
|
||||||
++packet.seqNum;
|
++packet.seqNum;
|
||||||
packet.video_header.vp8().temporalIdx++;
|
vp8_header.temporalIdx++;
|
||||||
packet.video_header.vp8().pictureId++;
|
vp8_header.pictureId++;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
|
||||||
frame.Reset();
|
frame.Reset();
|
||||||
// Testing only gap in tl0PicIdx when tl0PicIdx in continuous.
|
// Testing only gap in tl0PicIdx when tl0PicIdx in continuous.
|
||||||
packet.video_header.vp8().tl0PicIdx += 3;
|
vp8_header.tl0PicIdx += 3;
|
||||||
packet.video_header.vp8().temporalIdx++;
|
vp8_header.temporalIdx++;
|
||||||
packet.video_header.vp8().tl0PicIdx = 1;
|
vp8_header.tl0PicIdx = 1;
|
||||||
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
|
||||||
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,8 @@ void VCMEncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header) {
|
||||||
if (header) {
|
if (header) {
|
||||||
switch (header->codec) {
|
switch (header->codec) {
|
||||||
case kVideoCodecVP8: {
|
case kVideoCodecVP8: {
|
||||||
|
const auto& vp8_header =
|
||||||
|
absl::get<RTPVideoHeaderVP8>(header->video_type_header);
|
||||||
if (_codecSpecificInfo.codecType != kVideoCodecVP8) {
|
if (_codecSpecificInfo.codecType != kVideoCodecVP8) {
|
||||||
// This is the first packet for this frame.
|
// This is the first packet for this frame.
|
||||||
_codecSpecificInfo.codecSpecific.VP8.temporalIdx = 0;
|
_codecSpecificInfo.codecSpecific.VP8.temporalIdx = 0;
|
||||||
|
@ -64,15 +66,14 @@ void VCMEncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header) {
|
||||||
_codecSpecificInfo.codecType = kVideoCodecVP8;
|
_codecSpecificInfo.codecType = kVideoCodecVP8;
|
||||||
}
|
}
|
||||||
_codecSpecificInfo.codecSpecific.VP8.nonReference =
|
_codecSpecificInfo.codecSpecific.VP8.nonReference =
|
||||||
header->vp8().nonReference;
|
vp8_header.nonReference;
|
||||||
if (header->vp8().temporalIdx != kNoTemporalIdx) {
|
if (vp8_header.temporalIdx != kNoTemporalIdx) {
|
||||||
_codecSpecificInfo.codecSpecific.VP8.temporalIdx =
|
_codecSpecificInfo.codecSpecific.VP8.temporalIdx =
|
||||||
header->vp8().temporalIdx;
|
vp8_header.temporalIdx;
|
||||||
_codecSpecificInfo.codecSpecific.VP8.layerSync =
|
_codecSpecificInfo.codecSpecific.VP8.layerSync = vp8_header.layerSync;
|
||||||
header->vp8().layerSync;
|
|
||||||
}
|
}
|
||||||
if (header->vp8().keyIdx != kNoKeyIdx) {
|
if (vp8_header.keyIdx != kNoKeyIdx) {
|
||||||
_codecSpecificInfo.codecSpecific.VP8.keyIdx = header->vp8().keyIdx;
|
_codecSpecificInfo.codecSpecific.VP8.keyIdx = vp8_header.keyIdx;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,10 +108,12 @@ class TestRtpFrameReferenceFinder : public ::testing::Test,
|
||||||
packet.seqNum = seq_num_start;
|
packet.seqNum = seq_num_start;
|
||||||
packet.markerBit = (seq_num_start == seq_num_end);
|
packet.markerBit = (seq_num_start == seq_num_end);
|
||||||
packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta;
|
packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta;
|
||||||
packet.video_header.vp8().pictureId = pid % (1 << 15);
|
auto& vp8_header =
|
||||||
packet.video_header.vp8().temporalIdx = tid;
|
packet.video_header.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
packet.video_header.vp8().tl0PicIdx = tl0;
|
vp8_header.pictureId = pid % (1 << 15);
|
||||||
packet.video_header.vp8().layerSync = sync;
|
vp8_header.temporalIdx = tid;
|
||||||
|
vp8_header.tl0PicIdx = tl0;
|
||||||
|
vp8_header.layerSync = sync;
|
||||||
ref_packet_buffer_->InsertPacket(&packet);
|
ref_packet_buffer_->InsertPacket(&packet);
|
||||||
|
|
||||||
if (seq_num_start != seq_num_end) {
|
if (seq_num_start != seq_num_end) {
|
||||||
|
|
|
@ -62,7 +62,9 @@ int VCMSessionInfo::PictureId() const {
|
||||||
if (packets_.empty())
|
if (packets_.empty())
|
||||||
return kNoPictureId;
|
return kNoPictureId;
|
||||||
if (packets_.front().video_header.codec == kVideoCodecVP8) {
|
if (packets_.front().video_header.codec == kVideoCodecVP8) {
|
||||||
return packets_.front().video_header.vp8().pictureId;
|
return absl::get<RTPVideoHeaderVP8>(
|
||||||
|
packets_.front().video_header.video_type_header)
|
||||||
|
.pictureId;
|
||||||
} else if (packets_.front().video_header.codec == kVideoCodecVP9) {
|
} else if (packets_.front().video_header.codec == kVideoCodecVP9) {
|
||||||
return absl::get<RTPVideoHeaderVP9>(
|
return absl::get<RTPVideoHeaderVP9>(
|
||||||
packets_.front().video_header.video_type_header)
|
packets_.front().video_header.video_type_header)
|
||||||
|
@ -76,7 +78,9 @@ int VCMSessionInfo::TemporalId() const {
|
||||||
if (packets_.empty())
|
if (packets_.empty())
|
||||||
return kNoTemporalIdx;
|
return kNoTemporalIdx;
|
||||||
if (packets_.front().video_header.codec == kVideoCodecVP8) {
|
if (packets_.front().video_header.codec == kVideoCodecVP8) {
|
||||||
return packets_.front().video_header.vp8().temporalIdx;
|
return absl::get<RTPVideoHeaderVP8>(
|
||||||
|
packets_.front().video_header.video_type_header)
|
||||||
|
.temporalIdx;
|
||||||
} else if (packets_.front().video_header.codec == kVideoCodecVP9) {
|
} else if (packets_.front().video_header.codec == kVideoCodecVP9) {
|
||||||
return absl::get<RTPVideoHeaderVP9>(
|
return absl::get<RTPVideoHeaderVP9>(
|
||||||
packets_.front().video_header.video_type_header)
|
packets_.front().video_header.video_type_header)
|
||||||
|
@ -90,7 +94,9 @@ bool VCMSessionInfo::LayerSync() const {
|
||||||
if (packets_.empty())
|
if (packets_.empty())
|
||||||
return false;
|
return false;
|
||||||
if (packets_.front().video_header.codec == kVideoCodecVP8) {
|
if (packets_.front().video_header.codec == kVideoCodecVP8) {
|
||||||
return packets_.front().video_header.vp8().layerSync;
|
return absl::get<RTPVideoHeaderVP8>(
|
||||||
|
packets_.front().video_header.video_type_header)
|
||||||
|
.layerSync;
|
||||||
} else if (packets_.front().video_header.codec == kVideoCodecVP9) {
|
} else if (packets_.front().video_header.codec == kVideoCodecVP9) {
|
||||||
return absl::get<RTPVideoHeaderVP9>(
|
return absl::get<RTPVideoHeaderVP9>(
|
||||||
packets_.front().video_header.video_type_header)
|
packets_.front().video_header.video_type_header)
|
||||||
|
@ -104,7 +110,9 @@ int VCMSessionInfo::Tl0PicId() const {
|
||||||
if (packets_.empty())
|
if (packets_.empty())
|
||||||
return kNoTl0PicIdx;
|
return kNoTl0PicIdx;
|
||||||
if (packets_.front().video_header.codec == kVideoCodecVP8) {
|
if (packets_.front().video_header.codec == kVideoCodecVP8) {
|
||||||
return packets_.front().video_header.vp8().tl0PicIdx;
|
return absl::get<RTPVideoHeaderVP8>(
|
||||||
|
packets_.front().video_header.video_type_header)
|
||||||
|
.tl0PicIdx;
|
||||||
} else if (packets_.front().video_header.codec == kVideoCodecVP9) {
|
} else if (packets_.front().video_header.codec == kVideoCodecVP9) {
|
||||||
return absl::get<RTPVideoHeaderVP9>(
|
return absl::get<RTPVideoHeaderVP9>(
|
||||||
packets_.front().video_header.video_type_header)
|
packets_.front().video_header.video_type_header)
|
||||||
|
@ -347,7 +355,8 @@ size_t VCMSessionInfo::DeletePacketData(PacketIterator start,
|
||||||
VCMSessionInfo::PacketIterator VCMSessionInfo::FindNextPartitionBeginning(
|
VCMSessionInfo::PacketIterator VCMSessionInfo::FindNextPartitionBeginning(
|
||||||
PacketIterator it) const {
|
PacketIterator it) const {
|
||||||
while (it != packets_.end()) {
|
while (it != packets_.end()) {
|
||||||
if ((*it).video_header.vp8().beginningOfPartition) {
|
if (absl::get<RTPVideoHeaderVP8>((*it).video_header.video_type_header)
|
||||||
|
.beginningOfPartition) {
|
||||||
return it;
|
return it;
|
||||||
}
|
}
|
||||||
++it;
|
++it;
|
||||||
|
@ -359,10 +368,16 @@ VCMSessionInfo::PacketIterator VCMSessionInfo::FindPartitionEnd(
|
||||||
PacketIterator it) const {
|
PacketIterator it) const {
|
||||||
assert((*it).codec == kVideoCodecVP8);
|
assert((*it).codec == kVideoCodecVP8);
|
||||||
PacketIterator prev_it = it;
|
PacketIterator prev_it = it;
|
||||||
const int partition_id = (*it).video_header.vp8().partitionId;
|
const int partition_id =
|
||||||
|
absl::get<RTPVideoHeaderVP8>((*it).video_header.video_type_header)
|
||||||
|
.partitionId;
|
||||||
while (it != packets_.end()) {
|
while (it != packets_.end()) {
|
||||||
bool beginning = (*it).video_header.vp8().beginningOfPartition;
|
bool beginning =
|
||||||
int current_partition_id = (*it).video_header.vp8().partitionId;
|
absl::get<RTPVideoHeaderVP8>((*it).video_header.video_type_header)
|
||||||
|
.beginningOfPartition;
|
||||||
|
int current_partition_id =
|
||||||
|
absl::get<RTPVideoHeaderVP8>((*it).video_header.video_type_header)
|
||||||
|
.partitionId;
|
||||||
bool packet_loss_found = (!beginning && !InSequence(it, prev_it));
|
bool packet_loss_found = (!beginning && !InSequence(it, prev_it));
|
||||||
if (packet_loss_found ||
|
if (packet_loss_found ||
|
||||||
(beginning && current_partition_id != partition_id)) {
|
(beginning && current_partition_id != partition_id)) {
|
||||||
|
|
|
@ -129,6 +129,7 @@ TEST_F(TestVideoReceiver, PaddingOnlyFramesWithLosses) {
|
||||||
header.header.ssrc = 1;
|
header.header.ssrc = 1;
|
||||||
header.header.headerLength = 12;
|
header.header.headerLength = 12;
|
||||||
header.video_header().codec = kVideoCodecVP8;
|
header.video_header().codec = kVideoCodecVP8;
|
||||||
|
header.video_header().video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
// Insert one video frame to get one frame decoded.
|
// Insert one video frame to get one frame decoded.
|
||||||
header.frameType = kVideoFrameKey;
|
header.frameType = kVideoFrameKey;
|
||||||
header.video_header().is_first_packet_in_frame = true;
|
header.video_header().is_first_packet_in_frame = true;
|
||||||
|
@ -180,8 +181,10 @@ TEST_F(TestVideoReceiver, PaddingOnlyAndVideo) {
|
||||||
header.header.ssrc = 1;
|
header.header.ssrc = 1;
|
||||||
header.header.headerLength = 12;
|
header.header.headerLength = 12;
|
||||||
header.video_header().codec = kVideoCodecVP8;
|
header.video_header().codec = kVideoCodecVP8;
|
||||||
header.video_header().vp8().pictureId = -1;
|
auto& vp8_header =
|
||||||
header.video_header().vp8().tl0PicIdx = -1;
|
header.video.video_type_header.emplace<RTPVideoHeaderVP8>();
|
||||||
|
vp8_header.pictureId = -1;
|
||||||
|
vp8_header.tl0PicIdx = -1;
|
||||||
for (int i = 0; i < 3; ++i) {
|
for (int i = 0; i < 3; ++i) {
|
||||||
// Insert 2 video frames.
|
// Insert 2 video frames.
|
||||||
for (int j = 0; j < 2; ++j) {
|
for (int j = 0; j < 2; ++j) {
|
||||||
|
|
|
@ -24,7 +24,8 @@ ConfigurableFrameSizeEncoder::ConfigurableFrameSizeEncoder(
|
||||||
: callback_(NULL),
|
: callback_(NULL),
|
||||||
max_frame_size_(max_frame_size),
|
max_frame_size_(max_frame_size),
|
||||||
current_frame_size_(max_frame_size),
|
current_frame_size_(max_frame_size),
|
||||||
buffer_(new uint8_t[max_frame_size]) {
|
buffer_(new uint8_t[max_frame_size]),
|
||||||
|
codec_type_(kVideoCodecGeneric) {
|
||||||
memset(buffer_.get(), 0, max_frame_size);
|
memset(buffer_.get(), 0, max_frame_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,8 +51,8 @@ int32_t ConfigurableFrameSizeEncoder::Encode(
|
||||||
encodedImage.SetTimestamp(inputImage.timestamp());
|
encodedImage.SetTimestamp(inputImage.timestamp());
|
||||||
encodedImage.capture_time_ms_ = inputImage.render_time_ms();
|
encodedImage.capture_time_ms_ = inputImage.render_time_ms();
|
||||||
RTPFragmentationHeader* fragmentation = NULL;
|
RTPFragmentationHeader* fragmentation = NULL;
|
||||||
CodecSpecificInfo specific;
|
CodecSpecificInfo specific{};
|
||||||
memset(&specific, 0, sizeof(specific));
|
specific.codecType = codec_type_;
|
||||||
callback_->OnEncodedImage(encodedImage, &specific, fragmentation);
|
callback_->OnEncodedImage(encodedImage, &specific, fragmentation);
|
||||||
|
|
||||||
return WEBRTC_VIDEO_CODEC_OK;
|
return WEBRTC_VIDEO_CODEC_OK;
|
||||||
|
@ -84,5 +85,9 @@ int32_t ConfigurableFrameSizeEncoder::SetFrameSize(size_t size) {
|
||||||
return WEBRTC_VIDEO_CODEC_OK;
|
return WEBRTC_VIDEO_CODEC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConfigurableFrameSizeEncoder::SetCodecType(VideoCodecType codec_type) {
|
||||||
|
codec_type_ = codec_type;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace test
|
} // namespace test
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|
|
@ -44,11 +44,14 @@ class ConfigurableFrameSizeEncoder : public VideoEncoder {
|
||||||
|
|
||||||
int32_t SetFrameSize(size_t size);
|
int32_t SetFrameSize(size_t size);
|
||||||
|
|
||||||
|
void SetCodecType(VideoCodecType codec_type_);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EncodedImageCallback* callback_;
|
EncodedImageCallback* callback_;
|
||||||
const size_t max_frame_size_;
|
const size_t max_frame_size_;
|
||||||
size_t current_frame_size_;
|
size_t current_frame_size_;
|
||||||
std::unique_ptr<uint8_t[]> buffer_;
|
std::unique_ptr<uint8_t[]> buffer_;
|
||||||
|
VideoCodecType codec_type_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace test
|
} // namespace test
|
||||||
|
|
|
@ -103,7 +103,9 @@ bool LayerFilteringTransport::SendRtp(const uint8_t* packet,
|
||||||
bool end_of_frame;
|
bool end_of_frame;
|
||||||
|
|
||||||
if (is_vp8) {
|
if (is_vp8) {
|
||||||
temporal_idx = parsed_payload.video_header().vp8().temporalIdx;
|
temporal_idx = absl::get<RTPVideoHeaderVP8>(
|
||||||
|
parsed_payload.video_header().video_type_header)
|
||||||
|
.temporalIdx;
|
||||||
spatial_idx = kNoSpatialIdx;
|
spatial_idx = kNoSpatialIdx;
|
||||||
num_active_spatial_layers_ = 1;
|
num_active_spatial_layers_ = 1;
|
||||||
non_ref_for_inter_layer_pred = false;
|
non_ref_for_inter_layer_pred = false;
|
||||||
|
|
|
@ -100,11 +100,14 @@ class PictureIdObserver : public test::RtpRtcpObserver {
|
||||||
&parsed_payload, &packet[header.headerLength], payload_length));
|
&parsed_payload, &packet[header.headerLength], payload_length));
|
||||||
|
|
||||||
switch (codec_type_) {
|
switch (codec_type_) {
|
||||||
case kVideoCodecVP8:
|
case kVideoCodecVP8: {
|
||||||
parsed->picture_id = parsed_payload.video_header().vp8().pictureId;
|
const auto& vp8_header = absl::get<RTPVideoHeaderVP8>(
|
||||||
parsed->tl0_pic_idx = parsed_payload.video_header().vp8().tl0PicIdx;
|
parsed_payload.video_header().video_type_header);
|
||||||
parsed->temporal_idx = parsed_payload.video_header().vp8().temporalIdx;
|
parsed->picture_id = vp8_header.pictureId;
|
||||||
|
parsed->tl0_pic_idx = vp8_header.tl0PicIdx;
|
||||||
|
parsed->temporal_idx = vp8_header.temporalIdx;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case kVideoCodecVP9: {
|
case kVideoCodecVP9: {
|
||||||
const auto& vp9_header = absl::get<RTPVideoHeaderVP9>(
|
const auto& vp9_header = absl::get<RTPVideoHeaderVP9>(
|
||||||
parsed_payload.video_header().video_type_header);
|
parsed_payload.video_header().video_type_header);
|
||||||
|
|
|
@ -420,7 +420,9 @@ bool VideoAnalyzer::IsInSelectedSpatialAndTemporalLayer(
|
||||||
int temporal_idx;
|
int temporal_idx;
|
||||||
int spatial_idx;
|
int spatial_idx;
|
||||||
if (is_vp8) {
|
if (is_vp8) {
|
||||||
temporal_idx = parsed_payload.video_header().vp8().temporalIdx;
|
temporal_idx = absl::get<RTPVideoHeaderVP8>(
|
||||||
|
parsed_payload.video_header().video_type_header)
|
||||||
|
.temporalIdx;
|
||||||
spatial_idx = kNoTemporalIdx;
|
spatial_idx = kNoTemporalIdx;
|
||||||
} else {
|
} else {
|
||||||
const auto& vp9_header = absl::get<RTPVideoHeaderVP9>(
|
const auto& vp9_header = absl::get<RTPVideoHeaderVP9>(
|
||||||
|
|
|
@ -991,6 +991,8 @@ void VideoSendStreamTest::TestPacketFragmentationSize(VideoFormat format,
|
||||||
// Fragmentation required, this test doesn't make sense without it.
|
// Fragmentation required, this test doesn't make sense without it.
|
||||||
encoder_.SetFrameSize(start_size);
|
encoder_.SetFrameSize(start_size);
|
||||||
RTC_DCHECK_GT(stop_size, max_packet_size);
|
RTC_DCHECK_GT(stop_size, max_packet_size);
|
||||||
|
if (!test_generic_packetization_)
|
||||||
|
encoder_.SetCodecType(kVideoCodecVP8);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1127,6 +1129,7 @@ void VideoSendStreamTest::TestPacketFragmentationSize(VideoFormat format,
|
||||||
|
|
||||||
if (!test_generic_packetization_)
|
if (!test_generic_packetization_)
|
||||||
send_config->rtp.payload_name = "VP8";
|
send_config->rtp.payload_name = "VP8";
|
||||||
|
|
||||||
send_config->encoder_settings.encoder_factory = &encoder_factory_;
|
send_config->encoder_settings.encoder_factory = &encoder_factory_;
|
||||||
send_config->rtp.max_packet_size = kMaxPacketSize;
|
send_config->rtp.max_packet_size = kMaxPacketSize;
|
||||||
send_config->post_encode_callback = this;
|
send_config->post_encode_callback = this;
|
||||||
|
@ -2176,8 +2179,6 @@ TEST_P(VideoSendStreamTest, VideoSendStreamUpdateActiveSimulcastLayers) {
|
||||||
sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
|
sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
|
||||||
GetVideoSendConfig()->encoder_settings.encoder_factory = &encoder_factory;
|
GetVideoSendConfig()->encoder_settings.encoder_factory = &encoder_factory;
|
||||||
|
|
||||||
GetVideoSendConfig()->rtp.payload_name = "VP8";
|
|
||||||
|
|
||||||
CreateVideoStreams();
|
CreateVideoStreams();
|
||||||
|
|
||||||
// Inject a frame, to force encoder creation.
|
// Inject a frame, to force encoder creation.
|
||||||
|
|
Loading…
Reference in a new issue