diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /dom/media/webrtc/tests/mochitests/test_peerConnection_videoCodecs.html | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/media/webrtc/tests/mochitests/test_peerConnection_videoCodecs.html')
-rw-r--r-- | dom/media/webrtc/tests/mochitests/test_peerConnection_videoCodecs.html | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_videoCodecs.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_videoCodecs.html new file mode 100644 index 0000000000..7a245b5d8c --- /dev/null +++ b/dom/media/webrtc/tests/mochitests/test_peerConnection_videoCodecs.html @@ -0,0 +1,142 @@ +<!DOCTYPE HTML> +<html> +<head> + <script type="application/javascript" src="pc.js"></script> + <script type="application/javascript" src="stats.js"></script> + <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script> +</head> +<body> +<pre id="test"> +<script type="application/javascript"> + createHTML({ + bug: "1395853", + title: "Verify video content over WebRTC for every video codec", + }); + + async function testVideoCodec(options = {}, codec) { + const test = new PeerConnectionTest(options); + test.setMediaConstraints([{video: true}], []); + + let payloadType; + test.chain.insertBefore("PC_LOCAL_SET_LOCAL_DESCRIPTION", [ + function PC_LOCAL_FILTER_OUT_CODECS() { + const otherCodec = codecs.find(c => c != codec); + const otherId = sdputils.findCodecId(test.originalOffer.sdp, otherCodec.name, otherCodec.offset); + const otherRtpmapMatcher = new RegExp(`a=rtpmap:${otherId}.*\\r\\n`, "gi"); + + const id = sdputils.findCodecId(test.originalOffer.sdp, codec.name, codec.offset); + payloadType = Number(id); + if (codec.offset) { + isnot(id, sdputils.findCodecId(test.originalOffer.sdp, codec.name, 0), + "Different offsets should return different payload types"); + } + test.originalOffer.sdp = + sdputils.removeAllButPayloadType(test.originalOffer.sdp, id); + + ok(!test.originalOffer.sdp.match(new RegExp(`m=.*UDP/TLS/RTP/SAVPF.* ${otherId}[^0-9]`, "gi")), + `Other codec ${otherId} should be removed after filtering`); + ok(test.originalOffer.sdp.match(new RegExp(`m=.*UDP/TLS/RTP/SAVPF.* ${id}[^0-9]`, "gi")), + `Tested codec ${id} should remain after filtering`); + + // We only set it now, or the framework would remove non-H264 codecs + // for us. + options.h264 = codec.name == "H264"; + }, + ]); + + test.chain.insertAfter("PC_LOCAL_WAIT_FOR_MEDIA_FLOW", + [PC_LOCAL_TEST_LOCAL_STATS]); + + test.chain.insertAfter("PC_REMOTE_WAIT_FOR_MEDIA_FLOW", + [PC_REMOTE_TEST_REMOTE_STATS]); + + test.chain.append([ + async function PC_LOCAL_TEST_CODEC() { + const stats = await test.pcLocal._pc.getStats(); + let codecCount = 0; + stats.forEach(stat => { + if (stat.type == "codec") { + is(codecCount++, 0, "expected only one encode codec stat"); + is(stat.payloadType, payloadType, "payloadType as expected"); + is(stat.mimeType, `video/${codec.name}`, "mimeType as expected"); + is(stat.codecType, "encode", "codecType as expected"); + } + }); + }, + async function PC_REMOTE_TEST_CODEC() { + const stats = await test.pcRemote._pc.getStats(); + let codecCount = 0; + stats.forEach(stat => { + if (stat.type == "codec") { + is(codecCount++, 0, "expected only one decode codec stat"); + is(stat.payloadType, payloadType, "payloadType as expected"); + is(stat.mimeType, `video/${codec.name}`, "mimeType as expected"); + is(stat.codecType, "decode", "codecType as expected"); + } + }); + }, + async function CHECK_VIDEO_FLOW() { + try { + const h = new VideoStreamHelper(); + await h.checkVideoPlaying( + test.pcRemote.remoteMediaElements[0], + 10, 10, 128); + ok(true, `Got video flow for codec ${codec.name}, offset ${codec.offset}`); + } catch(e) { + ok(false, `No video flow for codec ${codec.name}, offset ${codec.offset}: ${e}`); + } + }, + ]); + + await test.run(); + } + + // We match the name against the sdp to figure out the payload type, + // so all other present codecs can be removed. + // Use `offset` when there are multiple instances of a codec expected in an sdp. + const codecs = [ + { name: "VP8" }, + { name: "VP9" }, + { name: "H264" }, + { name: "H264", offset: 1 }, + ]; + + runNetworkTest(async (options) => { + // This test expects the video being captured will change color. Use fake + // video device as loopback does not currently change. + await pushPrefs( + ['media.video_loopback_dev', ''], + ['media.navigator.streams.fake', true]); + for (let codec of codecs) { + info(`Testing video for codec ${codec.name} offset ${codec.offset}`); + try { + let enc = SpecialPowers.getBoolPref('media.webrtc.platformencoder'); + let dec = SpecialPowers.getBoolPref('media.navigator.mediadatadecoder_h264_enabled'); + if (codec.name == "H264") { + await matchPlatformH264CodecPrefs(); + if (codec.offset == 1) { + // Force fake GMP codec for H.264 mode 0 because not all platforms + // support slice size control. Re-enable it after + // a. SW encoder fallback support (bug 1726617), and + // b. returning valid bitstream from fake GMP encoder (bug 1509012). + await pushPrefs( + ['media.webrtc.platformencoder', false], + ['media.navigator.mediadatadecoder_h264_enabled', false], + ); + } + } + await testVideoCodec(options, codec); + await pushPrefs( + ['media.webrtc.platformencoder', enc], + ['media.navigator.mediadatadecoder_h264_enabled', dec], + ); + } catch(e) { + ok(false, `Error in test for codec ${codec.name}: ${e}\n${e.stack}`); + } + info(`Tested video for codec ${codec.name}`); + } + }); +</script> +</pre> +</body> +</html> |