| // Copyright © 2018 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). |
| |
| function findSupportedChangeTypeTestTypes(cb) |
| { |
| var CHANGE_TYPE_MEDIA_LIST = [ |
| { |
| type: 'video/webm; codecs="vp8"', |
| is_video: true, |
| url: 'webm/test-v-128k-320x240-24fps-8kfr.webm' |
| }, |
| { |
| type: 'video/webm; codecs="vp9"', |
| is_video: true, |
| url: 'webm/test-vp9.webm' |
| }, |
| { |
| type: 'video/mp4; codecs="avc1.4D4001"', |
| is_video: true, |
| url: 'mp4/test-v-128k-320x240-24fps-8kfr.mp4' |
| }, |
| { |
| type: 'video/mp4; codecs="hvc1.1.6.L60.90"', |
| is_video: true, |
| url: 'hevc/test-v-128k-320x240-24fps-8kfr.mp4' |
| }, |
| { |
| type: 'audio/webm; codecs="vorbis"', |
| is_video: false, |
| url: 'webm/test-a-128k-44100Hz-1ch.webm' |
| }, |
| { |
| type: 'audio/mp4; codecs="mp4a.40.2"', |
| is_video: false, |
| url: 'mp4/test-a-128k-44100Hz-1ch.mp4' |
| }, |
| { |
| type: 'audio/mpeg', |
| is_video: false, |
| url: 'mp3/sound_5.mp3' |
| } |
| ]; |
| |
| var audio_result = []; |
| var video_result = []; |
| |
| for (var i = 0; i < CHANGE_TYPE_MEDIA_LIST.length; ++i) { |
| var media = CHANGE_TYPE_MEDIA_LIST[i]; |
| if (window.MediaSource && MediaSource.isTypeSupported(media.type)) { |
| if (media.is_video === true) { |
| video_result.push(media); |
| } else { |
| audio_result.push(media); |
| } |
| } |
| } |
| |
| |
| cb(audio_result, video_result); |
| } |
| |
| function appendBuffer(test, sourceBuffer, data) |
| { |
| test.expectEvent(sourceBuffer, "update"); |
| test.expectEvent(sourceBuffer, "updateend"); |
| sourceBuffer.appendBuffer(data); |
| } |
| |
| function trimBuffered(test, mediaElement, sourceBuffer, minimumPreviousDuration, newDuration) |
| { |
| assert_less_than(newDuration, minimumPreviousDuration); |
| assert_less_than(minimumPreviousDuration, mediaElement.duration); |
| test.expectEvent(sourceBuffer, "update"); |
| test.expectEvent(sourceBuffer, "updateend"); |
| sourceBuffer.remove(newDuration, Infinity); |
| } |
| |
| function trimDuration(test, mediaElement, mediaSource, newDuration) |
| { |
| assert_less_than(newDuration, mediaElement.duration); |
| test.expectEvent(mediaElement, "durationchange"); |
| mediaSource.duration = newDuration; |
| } |
| |
| function runChangeTypeTest(test, mediaElement, mediaSource, typeA, dataA, typeB, dataB) |
| { |
| var sourceBuffer = mediaSource.addSourceBuffer(typeA); |
| |
| appendBuffer(test, sourceBuffer, dataA); |
| |
| // changeType A->B and append B starting at 0.5 seconds. |
| test.waitForExpectedEvents(function() |
| { |
| sourceBuffer.changeType(typeB); |
| sourceBuffer.timestampOffset = 0.5; |
| appendBuffer(test, sourceBuffer, dataB); |
| }); |
| |
| // changeType B->B and append B starting at 1.0 seconds. |
| test.waitForExpectedEvents(function() |
| { |
| sourceBuffer.changeType(typeB); |
| sourceBuffer.timestampOffset = 1.0; |
| appendBuffer(test, sourceBuffer, dataB); |
| }); |
| |
| // changeType B->A and append A starting at 1.5 seconds. |
| test.waitForExpectedEvents(function() |
| { |
| sourceBuffer.changeType(typeA); |
| sourceBuffer.timestampOffset = 1.5; |
| appendBuffer(test, sourceBuffer, dataA); |
| }); |
| |
| // changeTypoe A->A and append A starting at 1.3 seconds. |
| test.waitForExpectedEvents(function() |
| { |
| sourceBuffer.changeType(typeA); |
| sourceBuffer.timestampOffset = 1.3; |
| appendBuffer(test, sourceBuffer, dataA); |
| }); |
| |
| // Trim duration to 2 seconds, then play through to end. |
| test.waitForExpectedEvents(function() |
| { |
| trimBuffered(test, mediaElement, sourceBuffer, 2.1, 2); |
| }); |
| |
| test.waitForExpectedEvents(function() |
| { |
| trimDuration(test, mediaElement, mediaSource, 2); |
| }); |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_equals(mediaElement.currentTime, 0); |
| test.expectEvent(mediaSource, "sourceended"); |
| test.expectEvent(mediaElement, "play"); |
| test.expectEvent(mediaElement, "ended"); |
| mediaSource.endOfStream(); |
| mediaElement.play(); |
| }); |
| |
| test.waitForExpectedEvents(function() { |
| test.done(); |
| }); |
| } |
| |
| function mediaSourceChangeTypeTest(metadataA, metadataB, description) |
| { |
| mediasource_test(function(test, mediaElement, mediaSource) |
| { |
| mediaElement.pause(); |
| mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'")); |
| MediaSourceUtil.loadBinaryData(test, metadataA.url, function(dataA) { |
| MediaSourceUtil.loadBinaryData(test, metadataB.url, function(dataB) { |
| runChangeTypeTest(test, mediaElement, mediaSource, metadataA.type, dataA, metadataB.type, dataB); |
| }); |
| }); |
| }, description); |
| } |
| |