diff --git a/webrtc/common_types.cc b/webrtc/common_types.cc index b67c18c986..7b99f3c5a8 100644 --- a/webrtc/common_types.cc +++ b/webrtc/common_types.cc @@ -28,6 +28,7 @@ RTPHeaderExtension::RTPHeaderExtension() hasTransportSequenceNumber(false), transportSequenceNumber(0), hasAudioLevel(false), + voiceActivity(false), audioLevel(0), hasVideoRotation(false), videoRotation(0) { diff --git a/webrtc/common_types.h b/webrtc/common_types.h index ac56eb1cf1..39ece41197 100644 --- a/webrtc/common_types.h +++ b/webrtc/common_types.h @@ -804,6 +804,7 @@ struct RTPHeaderExtension { // Audio Level includes both level in dBov and voiced/unvoiced bit. See: // https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/ bool hasAudioLevel; + bool voiceActivity; uint8_t audioLevel; // For Coordination of Video Orientation. See diff --git a/webrtc/modules/audio_coding/neteq/tools/rtp_analyze.cc b/webrtc/modules/audio_coding/neteq/tools/rtp_analyze.cc index d6d1b6560a..78f0497fff 100644 --- a/webrtc/modules/audio_coding/neteq/tools/rtp_analyze.cc +++ b/webrtc/modules/audio_coding/neteq/tools/rtp_analyze.cc @@ -123,11 +123,10 @@ int main(int argc, char* argv[]) { packet->header().markerBit, packet->header().ssrc); if (print_audio_level && packet->header().extension.hasAudioLevel) { - // |audioLevel| consists of one bit for "V" and then 7 bits level. fprintf(out_file, " %5u (%1i)", - packet->header().extension.audioLevel & 0x7F, - (packet->header().extension.audioLevel & 0x80) == 0 ? 0 : 1); + packet->header().extension.audioLevel, + packet->header().extension.voiceActivity); } if (print_abs_send_time && packet->header().extension.hasAbsoluteSendTime) { if (cycles == -1) { diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc index ea6fb6adf3..409be1a66c 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc @@ -320,6 +320,7 @@ TEST_F(RtpSenderTest, BuildRTPPacket) { EXPECT_FALSE(rtp_header.extension.hasAudioLevel); EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); EXPECT_EQ(0u, rtp_header.extension.absoluteSendTime); + EXPECT_FALSE(rtp_header.extension.voiceActivity); EXPECT_EQ(0u, rtp_header.extension.audioLevel); EXPECT_EQ(0u, rtp_header.extension.videoRotation); } @@ -504,9 +505,8 @@ TEST_F(RtpSenderTest, BuildRTPPacketWithAudioLevelExtension) { VerifyRTPHeaderCommon(rtp_header); EXPECT_EQ(length, rtp_header.headerLength); EXPECT_TRUE(rtp_header.extension.hasAudioLevel); - // Expect kAudioLevel + 0x80 because we set "voiced" to true in the call to - // UpdateAudioLevel(), above. - EXPECT_EQ(kAudioLevel + 0x80u, rtp_header.extension.audioLevel); + EXPECT_TRUE(rtp_header.extension.voiceActivity); + EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); // Parse without map extension webrtc::RTPHeader rtp_header2; @@ -516,6 +516,7 @@ TEST_F(RtpSenderTest, BuildRTPPacketWithAudioLevelExtension) { VerifyRTPHeaderCommon(rtp_header2); EXPECT_EQ(length, rtp_header2.headerLength); EXPECT_FALSE(rtp_header2.extension.hasAudioLevel); + EXPECT_FALSE(rtp_header2.extension.voiceActivity); EXPECT_EQ(0u, rtp_header2.extension.audioLevel); } @@ -566,7 +567,8 @@ TEST_F(RtpSenderTest, BuildRTPPacketWithHeaderExtensions) { EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset); EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime); - EXPECT_EQ(kAudioLevel + 0x80u, rtp_header.extension.audioLevel); + EXPECT_TRUE(rtp_header.extension.voiceActivity); + EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); EXPECT_EQ(kTransportSequenceNumber, rtp_header.extension.transportSequenceNumber); @@ -584,6 +586,7 @@ TEST_F(RtpSenderTest, BuildRTPPacketWithHeaderExtensions) { EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset); EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); + EXPECT_FALSE(rtp_header2.extension.voiceActivity); EXPECT_EQ(0u, rtp_header2.extension.audioLevel); EXPECT_EQ(0u, rtp_header2.extension.transportSequenceNumber); } diff --git a/webrtc/modules/rtp_rtcp/source/rtp_utility.cc b/webrtc/modules/rtp_rtcp/source/rtp_utility.cc index 0d083bd92a..2727e7b8bc 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_utility.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_utility.cc @@ -312,6 +312,7 @@ bool RtpHeaderParser::Parse(RTPHeader& header, // May not be present in packet. header.extension.hasAudioLevel = false; + header.extension.voiceActivity = false; header.extension.audioLevel = 0; // May not be present in packet. @@ -423,14 +424,8 @@ void RtpHeaderParser::ParseOneByteExtensionHeader( // | ID | len=0 |V| level | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // - - // Parse out the fields but only use it for debugging for now. - // const uint8_t V = (*ptr & 0x80) >> 7; - // const uint8_t level = (*ptr & 0x7f); - // DEBUG_PRINT("RTP_AUDIO_LEVEL_UNIQUE_ID: ID=%u, len=%u, V=%u, - // level=%u", ID, len, V, level); - - header.extension.audioLevel = ptr[0]; + header.extension.audioLevel = ptr[0] & 0x7f; + header.extension.voiceActivity = (ptr[0] & 0x80) != 0; header.extension.hasAudioLevel = true; break; }