| // Extract & return the resolution string from a filename, if any. |
| function resolutionFromFilename(filename) |
| { |
| resolution = filename.replace(/^.*[^0-9]([0-9]+x[0-9]+)[^0-9].*$/, "$1"); |
| if (resolution != filename) { |
| return resolution; |
| } |
| return ""; |
| } |
| |
| function appendBuffer(test, sourceBuffer, data) |
| { |
| test.expectEvent(sourceBuffer, "update"); |
| test.expectEvent(sourceBuffer, "updateend"); |
| sourceBuffer.appendBuffer(data); |
| } |
| |
| function mediaSourceConfigChangeTest(directory, idA, idB, description) |
| { |
| var manifestFilenameA = directory + "/test-" + idA + "-manifest.json"; |
| var manifestFilenameB = directory + "/test-" + idB + "-manifest.json"; |
| mediasource_test(function(test, mediaElement, mediaSource) |
| { |
| mediaElement.pause(); |
| mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'")); |
| var expectResizeEvents = resolutionFromFilename(manifestFilenameA) != resolutionFromFilename(manifestFilenameB); |
| var expectedResizeEventCount = 0; |
| |
| MediaSourceUtil.fetchManifestAndData(test, manifestFilenameA, function(typeA, dataA) |
| { |
| MediaSourceUtil.fetchManifestAndData(test, manifestFilenameB, function(typeB, dataB) |
| { |
| assert_equals(typeA, typeB, "Media format types match"); |
| |
| var sourceBuffer = mediaSource.addSourceBuffer(typeA); |
| |
| appendBuffer(test, sourceBuffer, dataA); |
| ++expectedResizeEventCount; |
| |
| test.waitForExpectedEvents(function() |
| { |
| // Add the second buffer starting at 0.5 second. |
| sourceBuffer.timestampOffset = 0.5; |
| appendBuffer(test, sourceBuffer, dataB); |
| ++expectedResizeEventCount; |
| }); |
| |
| test.waitForExpectedEvents(function() |
| { |
| // Add the first buffer starting at 1 second. |
| sourceBuffer.timestampOffset = 1; |
| appendBuffer(test, sourceBuffer, dataA); |
| ++expectedResizeEventCount; |
| }); |
| |
| test.waitForExpectedEvents(function() |
| { |
| // Add the second buffer starting at 1.5 second. |
| sourceBuffer.timestampOffset = 1.5; |
| appendBuffer(test, sourceBuffer, dataB); |
| ++expectedResizeEventCount; |
| }); |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_false(sourceBuffer.updating, "updating"); |
| assert_greater_than(mediaSource.duration, 2, "duration"); |
| |
| // Truncate the presentation to a duration of 2 seconds. |
| mediaSource.duration = 2; |
| |
| assert_true(sourceBuffer.updating, "updating"); |
| test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer'); |
| test.expectEvent(sourceBuffer, 'update', 'sourceBuffer'); |
| test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer'); |
| }); |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_false(sourceBuffer.updating, "updating"); |
| |
| mediaSource.endOfStream(); |
| |
| assert_false(sourceBuffer.updating, "updating"); |
| |
| if (expectResizeEvents) { |
| for (var i = 0; i < expectedResizeEventCount; ++i) { |
| test.expectEvent(mediaElement, "resize"); |
| } |
| } |
| test.expectEvent(mediaElement, "ended"); |
| mediaElement.play(); |
| }); |
| |
| test.waitForExpectedEvents(function() { |
| test.done(); |
| }); |
| }); |
| }); |
| }, description); |
| }; |