Negotiate the MID header extension for Unified Plan

Bug: webrtc:4050
Change-Id: Icf02eb5186742bb0cbf1a41964daab9e35ae9b6f
Reviewed-on: https://webrtc-review.googlesource.com/65026
Reviewed-by: Zhi Huang <zhihuang@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22777}
diff --git a/pc/mediasession.cc b/pc/mediasession.cc
index 474c0b4..3bf931c 100644
--- a/pc/mediasession.cc
+++ b/pc/mediasession.cc
@@ -1297,8 +1297,8 @@
 
   RtpHeaderExtensions audio_rtp_extensions;
   RtpHeaderExtensions video_rtp_extensions;
-  GetRtpHdrExtsToOffer(current_description, &audio_rtp_extensions,
-                       &video_rtp_extensions);
+  GetRtpHdrExtsToOffer(session_options, current_description,
+                       &audio_rtp_extensions, &video_rtp_extensions);
 
   // Must have options for each existing section.
   if (current_description) {
@@ -1718,6 +1718,7 @@
 }
 
 void MediaSessionDescriptionFactory::GetRtpHdrExtsToOffer(
+    const MediaSessionOptions& session_options,
     const SessionDescription* current_description,
     RtpHeaderExtensions* offer_audio_extensions,
     RtpHeaderExtensions* offer_video_extensions) const {
@@ -1753,12 +1754,12 @@
 
   // Add our default RTP header extensions that are not in
   // |current_description|.
-  MergeRtpHdrExts(audio_rtp_header_extensions(), offer_audio_extensions,
-                  &all_regular_extensions, &all_encrypted_extensions,
-                  &used_ids);
-  MergeRtpHdrExts(video_rtp_header_extensions(), offer_video_extensions,
-                  &all_regular_extensions, &all_encrypted_extensions,
-                  &used_ids);
+  MergeRtpHdrExts(audio_rtp_header_extensions(session_options.is_unified_plan),
+                  offer_audio_extensions, &all_regular_extensions,
+                  &all_encrypted_extensions, &used_ids);
+  MergeRtpHdrExts(video_rtp_header_extensions(session_options.is_unified_plan),
+                  offer_video_extensions, &all_regular_extensions,
+                  &all_encrypted_extensions, &used_ids);
 
   // TODO(jbauch): Support adding encrypted header extensions to existing
   // sessions.
@@ -2117,8 +2118,9 @@
   if (!CreateMediaContentAnswer(
           offer_audio_description, media_description_options, session_options,
           filtered_codecs, sdes_policy, GetCryptos(current_content),
-          audio_rtp_extensions_, enable_encrypted_rtp_header_extensions_,
-          current_streams, bundle_enabled, audio_answer.get())) {
+          audio_rtp_header_extensions(session_options.is_unified_plan),
+          enable_encrypted_rtp_header_extensions_, current_streams,
+          bundle_enabled, audio_answer.get())) {
     return false;  // Fails the session setup.
   }
 
@@ -2202,8 +2204,9 @@
   if (!CreateMediaContentAnswer(
           offer_video_description, media_description_options, session_options,
           filtered_codecs, sdes_policy, GetCryptos(current_content),
-          video_rtp_extensions_, enable_encrypted_rtp_header_extensions_,
-          current_streams, bundle_enabled, video_answer.get())) {
+          video_rtp_header_extensions(session_options.is_unified_plan),
+          enable_encrypted_rtp_header_extensions_, current_streams,
+          bundle_enabled, video_answer.get())) {
     return false;  // Failed the sessin setup.
   }
   bool secure = bundle_transport ? bundle_transport->description.secure()
diff --git a/pc/mediasession.h b/pc/mediasession.h
index 4f30b7c..5b94539 100644
--- a/pc/mediasession.h
+++ b/pc/mediasession.h
@@ -124,16 +124,28 @@
   void set_audio_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
     audio_rtp_extensions_ = extensions;
   }
-  const RtpHeaderExtensions& audio_rtp_header_extensions() const {
-    return audio_rtp_extensions_;
+  RtpHeaderExtensions audio_rtp_header_extensions(bool unified_plan) const {
+    RtpHeaderExtensions extensions = audio_rtp_extensions_;
+    // If we are Unified Plan, also offer the MID header extension.
+    if (unified_plan) {
+      extensions.push_back(webrtc::RtpExtension(
+          webrtc::RtpExtension::kMidUri, webrtc::RtpExtension::kMidDefaultId));
+    }
+    return extensions;
   }
   const VideoCodecs& video_codecs() const { return video_codecs_; }
   void set_video_codecs(const VideoCodecs& codecs) { video_codecs_ = codecs; }
   void set_video_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
     video_rtp_extensions_ = extensions;
   }
-  const RtpHeaderExtensions& video_rtp_header_extensions() const {
-    return video_rtp_extensions_;
+  RtpHeaderExtensions video_rtp_header_extensions(bool unified_plan) const {
+    RtpHeaderExtensions extensions = video_rtp_extensions_;
+    // If we are Unified Plan, also offer the MID header extension.
+    if (unified_plan) {
+      extensions.push_back(webrtc::RtpExtension(
+          webrtc::RtpExtension::kMidUri, webrtc::RtpExtension::kMidDefaultId));
+    }
+    return extensions;
   }
   const DataCodecs& data_codecs() const { return data_codecs_; }
   void set_data_codecs(const DataCodecs& codecs) { data_codecs_ = codecs; }
@@ -167,7 +179,8 @@
                           AudioCodecs* audio_codecs,
                           VideoCodecs* video_codecs,
                           DataCodecs* data_codecs) const;
-  void GetRtpHdrExtsToOffer(const SessionDescription* current_description,
+  void GetRtpHdrExtsToOffer(const MediaSessionOptions& session_options,
+                            const SessionDescription* current_description,
                             RtpHeaderExtensions* audio_extensions,
                             RtpHeaderExtensions* video_extensions) const;
   bool AddTransportOffer(