Bug 1916579 - normalize webrtc codec name capitalizatoin in GLEAN probes;r=bwc

Differential Revision: https://phabricator.services.mozilla.com/D220985
This commit is contained in:
Nico Grunbaum 2024-09-05 15:22:45 +00:00
parent e5d3610c6d
commit 0ac20b472e
2 changed files with 46 additions and 8 deletions

View File

@ -1483,6 +1483,13 @@ void RTCRtpSender::SyncToJsep(JsepTransceiver& aJsepTransceiver) const {
} }
} }
// Helper to upper case codec names for GLEAN probes
auto upCase(const std::string& str) -> std::string {
std::string result;
std::transform(str.begin(), str.end(), result.end(), ::toupper);
return result;
}
Maybe<RTCRtpSender::VideoConfig> RTCRtpSender::GetNewVideoConfig() { Maybe<RTCRtpSender::VideoConfig> RTCRtpSender::GetNewVideoConfig() {
// It is possible for SDP to signal that there is a send track, but there not // It is possible for SDP to signal that there is a send track, but there not
// actually be a send track, according to the specification; all that needs to // actually be a send track, according to the specification; all that needs to
@ -1593,17 +1600,18 @@ Maybe<RTCRtpSender::VideoConfig> RTCRtpSender::GetNewVideoConfig() {
// Log codec information we are tracking // Log codec information we are tracking
if (!mHaveLoggedOtherFec && if (!mHaveLoggedOtherFec &&
!GetJsepTransceiver().mSendTrack.GetFecCodecName().empty()) { !GetJsepTransceiver().mSendTrack.GetFecCodecName().empty()) {
const auto name = upCase(GetJsepTransceiver().mSendTrack.GetFecCodecName());
mozilla::glean::codec_stats::other_fec_signaled mozilla::glean::codec_stats::other_fec_signaled
.Get(nsDependentCString( .Get(nsDependentCString(name.c_str()))
GetJsepTransceiver().mSendTrack.GetFecCodecName().c_str()))
.Add(1); .Add(1);
mHaveLoggedOtherFec = true; mHaveLoggedOtherFec = true;
} }
if (!mHaveLoggedVideoPreferredCodec && if (!mHaveLoggedVideoPreferredCodec &&
!GetJsepTransceiver().mSendTrack.GetVideoPreferredCodec().empty()) { !GetJsepTransceiver().mSendTrack.GetVideoPreferredCodec().empty()) {
const auto name =
upCase(GetJsepTransceiver().mSendTrack.GetVideoPreferredCodec());
mozilla::glean::codec_stats::video_preferred_codec mozilla::glean::codec_stats::video_preferred_codec
.Get(nsDependentCString( .Get(nsDependentCString(name.c_str()))
GetJsepTransceiver().mSendTrack.GetVideoPreferredCodec().c_str()))
.Add(1); .Add(1);
mHaveLoggedVideoPreferredCodec = true; mHaveLoggedVideoPreferredCodec = true;
} }
@ -1685,9 +1693,10 @@ Maybe<RTCRtpSender::AudioConfig> RTCRtpSender::GetNewAudioConfig() {
if (!mHaveLoggedAudioPreferredCodec && if (!mHaveLoggedAudioPreferredCodec &&
!GetJsepTransceiver().mSendTrack.GetAudioPreferredCodec().empty()) { !GetJsepTransceiver().mSendTrack.GetAudioPreferredCodec().empty()) {
const auto name =
upCase(GetJsepTransceiver().mSendTrack.GetAudioPreferredCodec());
mozilla::glean::codec_stats::audio_preferred_codec mozilla::glean::codec_stats::audio_preferred_codec
.Get(nsDependentCString( .Get(nsDependentCString(name.c_str()))
GetJsepTransceiver().mSendTrack.GetAudioPreferredCodec().c_str()))
.Add(1); .Add(1);
mHaveLoggedAudioPreferredCodec = true; mHaveLoggedAudioPreferredCodec = true;
} }

View File

@ -460,7 +460,7 @@
pc1.setRemoteDescription(answer); pc1.setRemoteDescription(answer);
// Validate logging shows flexfec counted once ulpfec negotiated twice and preferred video VP9 since no VP8 was offered. // Validate logging shows flexfec counted once ulpfec negotiated twice and preferred video VP9 since no VP8 was offered.
let flexfecOffered = await GleanTest.codecStats.otherFecSignaled.flexfec.testGetValue() || 0; let flexfecOffered = await GleanTest.codecStats.otherFecSignaled.FLEXFEC.testGetValue() || 0;
ok(flexfecOffered == 1, "checkFlexfecOffered glean should count flexfec being offered" + flexfecOffered); ok(flexfecOffered == 1, "checkFlexfecOffered glean should count flexfec being offered" + flexfecOffered);
let ulpfecNegotiated = await GleanTest.codecStats.ulpfecNegotiated.negotiated.testGetValue() || 0; let ulpfecNegotiated = await GleanTest.codecStats.ulpfecNegotiated.negotiated.testGetValue() || 0;
ok(ulpfecNegotiated == 2, "checkUlpfecNegotiated glean should show ulpfec negotiated"); ok(ulpfecNegotiated == 2, "checkUlpfecNegotiated glean should show ulpfec negotiated");
@ -510,7 +510,7 @@
pc1.setRemoteDescription(answer); pc1.setRemoteDescription(answer);
// We should show CN as the preferred codec from the offer and the answer should prefer G722 since opus was removed. // We should show CN as the preferred codec from the offer and the answer should prefer G722 since opus was removed.
let preferredAudioCodecFAKECodec = await GleanTest.codecStats.audioPreferredCodec.FAKECodec.testGetValue() || 0; let preferredAudioCodecFAKECodec = await GleanTest.codecStats.audioPreferredCodec.FAKECODEC.testGetValue() || 0;
ok(preferredAudioCodecFAKECodec == 1, "checkPreferredAudioCodec Glean should show preferred audio codec FAKECodec " + preferredAudioCodecFAKECodec); ok(preferredAudioCodecFAKECodec == 1, "checkPreferredAudioCodec Glean should show preferred audio codec FAKECodec " + preferredAudioCodecFAKECodec);
let preferredAudioCodecG722 = await GleanTest.codecStats.audioPreferredCodec.G722.testGetValue() || 0; let preferredAudioCodecG722 = await GleanTest.codecStats.audioPreferredCodec.G722.testGetValue() || 0;
ok(preferredAudioCodecG722 == 1, "checkPreferredAudioCodec Glean should show preferred audio codec G722 " + preferredAudioCodecG722); ok(preferredAudioCodecG722 == 1, "checkPreferredAudioCodec Glean should show preferred audio codec G722 " + preferredAudioCodecG722);
@ -729,6 +729,35 @@
}); });
}, },
async function checkCodecCaseEquivalence() {
const pc1 = new RTCPeerConnection();
const pc2 = new RTCPeerConnection();
await gleanResetTestValues();
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const sender = pc1.addTrack(stream.getTracks()[0]);
await pc1.setLocalDescription();
let offer = pc1.localDescription;
// Set a video codec using a lower case name to ensure that GLEAN
// probes are case-insensitive.
const sdp = offer.sdp.replaceAll('VP8','vp8');
await pc2.setRemoteDescription({type: 'offer', sdp});
const answer = await pc2.createAnswer();
await pc2.setLocalDescription(answer);
await pc1.setRemoteDescription(answer);
// Check that the codec name is always upper case
let preferredVideoCodecVP8UCase = await GleanTest.codecStats.videoPreferredCodec.VP8.testGetValue() || 0;
ok(preferredVideoCodecVP8UCase == 2, "checkPreferredVideoCodec glean should show preferred video codec VP8" + preferredVideoCodecVP8UCase);
// Check that the bin for the lower case codec name does not exist
let preferredVideoCodecVP8LCase = await GleanTest.codecStats.videoPreferredCodec.vp8.testGetValue();
ok(preferredVideoCodecVP8LCase === null, "checkPreferredVideoCodec glean should show preferred video codec vp8" + preferredVideoCodecVP8LCase);
// The other probes of concern are covered by other tests which inherently
// use lower case or mixed case codec names: FAKECodec, flexfec.
},
]; ];
runNetworkTest(async () => { runNetworkTest(async () => {