Separating voice activity flag from audio level in RtpHeaderExtension.

VAD flag was embedded in RtpHeaderExtension.audioLevel, which is not easy to interpret. This CL tries to separate the flag with the actual audio level.

BUG=
R=andrew@webrtc.org, henrik.lundin@webrtc.org

Review URL: https://codereview.webrtc.org/1272343003 .

Cr-Commit-Position: refs/heads/master@{#9691}
diff --git a/webrtc/common_types.cc b/webrtc/common_types.cc
index b67c18c..7b99f3c 100644
--- a/webrtc/common_types.cc
+++ b/webrtc/common_types.cc
@@ -28,6 +28,7 @@
       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 ac56eb1..39ece41 100644
--- a/webrtc/common_types.h
+++ b/webrtc/common_types.h
@@ -804,6 +804,7 @@
   // 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 d6d1b65..78f0497 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 @@
             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 ea6fb6a..409be1a6 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 @@
   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 @@
   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 @@
   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 @@
   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 @@
 
   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 0d083bd..2727e7b 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_utility.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_utility.cc
@@ -312,6 +312,7 @@
 
   // 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 @@
           // |  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;
         }