| <!DOCTYPE html> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src=/resources/testdriver.js></script> |
| <script src=/resources/testdriver-vendor.js></script> |
| <script src='../mediacapture-streams/permission-helper.js'></script> |
| <script src="../webrtc/RTCPeerConnection-helper.js"></script> |
| <script src="../service-workers/service-worker/resources/test-helpers.sub.js"></script> |
| <script> |
| "use strict"; |
| |
| async function setupLoopbackWithCodecAndGetReader(t, codec) { |
| const caller = new RTCPeerConnection({encodedInsertableStreams:true}); |
| t.add_cleanup(() => caller.close()); |
| const callee = new RTCPeerConnection(); |
| t.add_cleanup(() => callee.close()); |
| |
| await setMediaPermission("granted", ["camera"]); |
| const stream = await navigator.mediaDevices.getUserMedia({video:true}); |
| const videoTrack = stream.getVideoTracks()[0]; |
| t.add_cleanup(() => videoTrack.stop()); |
| |
| const transceiver = caller.addTransceiver(videoTrack); |
| const codecCapability = |
| RTCRtpSender.getCapabilities('video').codecs.find(capability => { |
| return capability.mimeType.includes(codec); |
| }); |
| assert_not_equals(codecCapability, undefined); |
| transceiver.setCodecPreferences([codecCapability]); |
| |
| const senderStreams = transceiver.sender.createEncodedStreams(); |
| exchangeIceCandidates(caller, callee); |
| await exchangeOfferAnswer(caller, callee); |
| return senderStreams.readable.getReader(); |
| } |
| |
| promise_test(async t => { |
| const senderReader = await setupLoopbackWithCodecAndGetReader(t, 'VP8'); |
| const result = await senderReader.read(); |
| const metadata = result.value.getMetadata(); |
| // RTCEncodedVideoFrameAdditionalMetadata-only fields. |
| assert_true(Array.isArray(metadata.decodeTargetIndications), |
| 'decodeTargetIndication is an array'); |
| assert_equals(typeof metadata.isLastFrameInPicture, 'boolean', |
| 'isLastFrameInPicture is a boolean'); |
| assert_equals(typeof metadata.simulcastIdx, 'number', |
| 'simulcastIdx is a number'); |
| assert_equals(metadata.codec, 'vp8'); |
| assert_equals(typeof metadata.codecSpecifics, 'object', |
| 'codecSpecifics is an object'); |
| // VP8-only |
| assert_equals(typeof metadata.codecSpecifics.nonReference, 'boolean', |
| 'codecSpecifics.nonReference is a boolean'); |
| assert_equals(typeof metadata.codecSpecifics.pictureId, 'number', |
| 'codecSpecifics.pictureId is a number'); |
| assert_equals(typeof metadata.codecSpecifics.tl0PicIdx, 'number', |
| 'codecSpecifics.tl0PicIdx is a number'); |
| assert_equals(typeof metadata.codecSpecifics.temporalIdx, 'number', |
| 'codecSpecifics.temporalIdx is a number'); |
| assert_equals(typeof metadata.codecSpecifics.layerSync, 'boolean', |
| 'codecSpecifics.layerSync is a boolean'); |
| assert_equals(typeof metadata.codecSpecifics.keyIdx, 'number', |
| 'codecSpecifics.keyIdx is a number'); |
| assert_equals(typeof metadata.codecSpecifics.partitionId, 'number', |
| 'codecSpecifics.partitionId is a number'); |
| assert_equals(typeof metadata.codecSpecifics.beginningOfPartition, 'boolean', |
| 'codecSpecifics.beginningOfPartition is a boolean'); |
| }, "[VP8] getMetadata() supports the expected codec specifics"); |
| </script> |