UMA counters for SDES x media type

These counters will register whether the media sections
used with SDES are for audio, video or data.

Bug: chromium:804275
Change-Id: I1da3bb6625af755c0897bf4cd349655cb283fbb6
Reviewed-on: https://webrtc-review.googlesource.com/59400
Reviewed-by: Fredrik Solenberg <solenberg@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22287}
diff --git a/api/umametrics.h b/api/umametrics.h
index 71a3d5e..a2d055d 100644
--- a/api/umametrics.h
+++ b/api/umametrics.h
@@ -40,6 +40,7 @@
   kEnumCounterKeyProtocol,
   kEnumCounterSdpSemanticRequested,
   kEnumCounterSdpSemanticNegotiated,
+  kEnumCounterKeyProtocolMediaType,
   kPeerConnectionEnumCounterMax
 };
 
@@ -120,6 +121,16 @@
   kEnumCounterKeyProtocolMax
 };
 
+enum KeyExchangeProtocolMedia {
+  kEnumCounterKeyProtocolMediaTypeDtlsAudio,
+  kEnumCounterKeyProtocolMediaTypeDtlsVideo,
+  kEnumCounterKeyProtocolMediaTypeDtlsData,
+  kEnumCounterKeyProtocolMediaTypeSdesAudio,
+  kEnumCounterKeyProtocolMediaTypeSdesVideo,
+  kEnumCounterKeyProtocolMediaTypeSdesData,
+  kEnumCounterKeyProtocolMediaTypeMax
+};
+
 enum SdpSemanticRequested {
   kSdpSemanticRequestDefault,
   kSdpSemanticRequestPlanB,
diff --git a/pc/peerconnection.cc b/pc/peerconnection.cc
index 44adeab..74fe030 100644
--- a/pc/peerconnection.cc
+++ b/pc/peerconnection.cc
@@ -382,6 +382,39 @@
   return desc1.contents().size() == desc2.contents().size();
 }
 
+void NoteKeyProtocolAndMedia(
+    KeyExchangeProtocolType protocol_type,
+    cricket::MediaType media_type,
+    rtc::scoped_refptr<webrtc::UMAObserver> uma_observer) {
+  if (!uma_observer)
+    return;
+  uma_observer->IncrementEnumCounter(webrtc::kEnumCounterKeyProtocol,
+                                     protocol_type,
+                                     webrtc::kEnumCounterKeyProtocolMax);
+  static const std::map<std::pair<KeyExchangeProtocolType, cricket::MediaType>,
+                        KeyExchangeProtocolMedia>
+      proto_media_counter_map = {
+          {{kEnumCounterKeyProtocolDtls, cricket::MEDIA_TYPE_AUDIO},
+           kEnumCounterKeyProtocolMediaTypeDtlsAudio},
+          {{kEnumCounterKeyProtocolDtls, cricket::MEDIA_TYPE_VIDEO},
+           kEnumCounterKeyProtocolMediaTypeDtlsVideo},
+          {{kEnumCounterKeyProtocolDtls, cricket::MEDIA_TYPE_DATA},
+           kEnumCounterKeyProtocolMediaTypeDtlsData},
+          {{kEnumCounterKeyProtocolSdes, cricket::MEDIA_TYPE_AUDIO},
+           kEnumCounterKeyProtocolMediaTypeSdesAudio},
+          {{kEnumCounterKeyProtocolSdes, cricket::MEDIA_TYPE_VIDEO},
+           kEnumCounterKeyProtocolMediaTypeSdesVideo},
+          {{kEnumCounterKeyProtocolSdes, cricket::MEDIA_TYPE_DATA},
+           kEnumCounterKeyProtocolMediaTypeSdesData}};
+
+  auto it = proto_media_counter_map.find({protocol_type, media_type});
+  if (it != proto_media_counter_map.end()) {
+    uma_observer->IncrementEnumCounter(webrtc::kEnumCounterKeyProtocolMediaType,
+                                       it->second,
+                                       kEnumCounterKeyProtocolMediaTypeMax);
+  }
+}
+
 // Checks that each non-rejected content has SDES crypto keys or a DTLS
 // fingerprint, unless it's in a BUNDLE group, in which case only the
 // BUNDLE-tag section (first media section/description in the BUNDLE group)
@@ -422,22 +455,16 @@
         return RTCError(RTCErrorType::INVALID_PARAMETER,
                         kSdpWithoutDtlsFingerprint);
       }
-      if (uma_observer) {
-        uma_observer->IncrementEnumCounter(webrtc::kEnumCounterKeyProtocol,
-                                           webrtc::kEnumCounterKeyProtocolDtls,
-                                           webrtc::kEnumCounterKeyProtocolMax);
-      }
+      NoteKeyProtocolAndMedia(webrtc::kEnumCounterKeyProtocolDtls,
+                              media->type(), uma_observer);
     } else {
       if (media->cryptos().empty()) {
         RTC_LOG(LS_WARNING)
             << "Session description must have SDES when DTLS disabled.";
         return RTCError(RTCErrorType::INVALID_PARAMETER, kSdpWithoutSdesCrypto);
       }
-      if (uma_observer) {
-        uma_observer->IncrementEnumCounter(webrtc::kEnumCounterKeyProtocol,
-                                           webrtc::kEnumCounterKeyProtocolSdes,
-                                           webrtc::kEnumCounterKeyProtocolMax);
-      }
+      NoteKeyProtocolAndMedia(webrtc::kEnumCounterKeyProtocolSdes,
+                              media->type(), uma_observer);
     }
   }
   return RTCError::OK();