mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-10 05:08:36 +02:00
Audio track and video tracks have under most cases a different start and end time. Additionally, the mp4 file is poorly muxed and contains out of order frames. As such we keep a table of time and duration for each media segments. The test itself was right, however it had an invalid time table to start with as it incorrectly used the dts (decode timestamp) instead of the pts (presentation timestamp). MozReview-Commit-ID: G2uwK3rroj3 --HG-- extra : rebase_source : 13e0c020ed825f4285291b81dd1fa9da6956dd4b
139 lines
8.6 KiB
HTML
139 lines
8.6 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>SourceBuffer.mode == "sequence" test cases.</title>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="mediasource-util.js"></script>
|
|
</head>
|
|
<body>
|
|
<div id="log"></div>
|
|
<script>
|
|
function mediasource_sequencemode_test(testFunction, description, options)
|
|
{
|
|
return mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
|
|
{
|
|
assert_greater_than(segmentInfo.media.length, 3, "at least 3 media segments for supported type");
|
|
mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
|
|
sourceBuffer.mode = "sequence";
|
|
assert_equals(sourceBuffer.mode, "sequence", "mode after setting it to \"sequence\"");
|
|
|
|
var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
|
|
test.expectEvent(sourceBuffer, "updatestart", "initSegment append started.");
|
|
test.expectEvent(sourceBuffer, "update", "initSegment append success.");
|
|
test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
|
|
sourceBuffer.appendBuffer(initSegment);
|
|
test.waitForExpectedEvents(function()
|
|
{
|
|
assert_equals(sourceBuffer.timestampOffset, 0, "timestampOffset initially 0");
|
|
testFunction(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData);
|
|
});
|
|
}, description, options);
|
|
}
|
|
|
|
function append_segment(test, sourceBuffer, mediaData, info, callback)
|
|
{
|
|
var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, info);
|
|
test.expectEvent(sourceBuffer, "updatestart", "media segment append started.");
|
|
test.expectEvent(sourceBuffer, "update", "media segment append success.");
|
|
test.expectEvent(sourceBuffer, "updateend", "media segment append ended.");
|
|
sourceBuffer.appendBuffer(mediaSegment);
|
|
test.waitForExpectedEvents(callback);
|
|
}
|
|
|
|
function threeDecimalPlaces(number)
|
|
{
|
|
return Number(number.toFixed(3));
|
|
}
|
|
|
|
// Verifies expected times to 3 decimal places before and after mediaSource.endOfStream(),
|
|
// and calls |callback| on success.
|
|
function verify_offset_and_buffered(test, mediaSource, sourceBuffer,
|
|
expectedTimestampOffset, expectedBufferedRangeStartTime,
|
|
expectedBufferedRangeMaxEndTimeBeforeEOS,
|
|
expectedBufferedRangeEndTimeAfterEOS,
|
|
callback) {
|
|
assert_equals(threeDecimalPlaces(sourceBuffer.timestampOffset),
|
|
threeDecimalPlaces(expectedTimestampOffset),
|
|
"expectedTimestampOffset");
|
|
|
|
// Prior to EOS, the buffered range end time may not have fully reached the next media
|
|
// segment's timecode (adjusted by any timestampOffset). It should not exceed it though.
|
|
// Therefore, an exact assertBufferedEquals() will not work here.
|
|
assert_equals(sourceBuffer.buffered.length, 1, "sourceBuffer.buffered has 1 range before EOS");
|
|
assert_equals(threeDecimalPlaces(sourceBuffer.buffered.start(0)),
|
|
threeDecimalPlaces(expectedBufferedRangeStartTime),
|
|
"sourceBuffer.buffered range begins where expected before EOS");
|
|
assert_less_than_equal(threeDecimalPlaces(sourceBuffer.buffered.end(0)),
|
|
threeDecimalPlaces(expectedBufferedRangeMaxEndTimeBeforeEOS),
|
|
"sourceBuffer.buffered range ends at or before expected upper bound before EOS");
|
|
|
|
test.expectEvent(mediaSource, "sourceended", "mediaSource endOfStream");
|
|
mediaSource.endOfStream();
|
|
test.waitForExpectedEvents(function()
|
|
{
|
|
assertBufferedEquals(sourceBuffer,
|
|
"{ [" + expectedBufferedRangeStartTime.toFixed(3) + ", " + expectedBufferedRangeEndTimeAfterEOS.toFixed(3) + ") }",
|
|
"sourceBuffer.buffered after EOS");
|
|
callback();
|
|
});
|
|
}
|
|
|
|
mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
|
|
{
|
|
var offset = Math.min(segmentInfo.media[0].timev, segmentInfo.media[0].timea);
|
|
var expectedStart = Math.max(segmentInfo.media[0].timev, segmentInfo.media[0].timea) - offset;
|
|
var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset;
|
|
var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset;
|
|
append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()
|
|
{
|
|
verify_offset_and_buffered(test, mediaSource, sourceBuffer,
|
|
-offset, expectedStart,
|
|
expectedEnd, expectedEndEOS,
|
|
test.done);
|
|
});
|
|
}, "Test sequence AppendMode appendBuffer(first media segment)");
|
|
|
|
mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
|
|
{
|
|
var offset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea);
|
|
var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - offset;
|
|
var expectedEnd = Math.min(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset;
|
|
var expectedEndEOS = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset;
|
|
assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0,
|
|
"segment starts after time 0");
|
|
append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()
|
|
{
|
|
verify_offset_and_buffered(test, mediaSource, sourceBuffer,
|
|
-offset, expectedStart,
|
|
expectedEnd, expectedEndEOS,
|
|
test.done);
|
|
});
|
|
}, "Test sequence AppendMode appendBuffer(second media segment)");
|
|
|
|
mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
|
|
{
|
|
assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0,
|
|
"segment starts after time 0");
|
|
append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()
|
|
{
|
|
append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()
|
|
{
|
|
var firstOffset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea);
|
|
var secondOffset = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - firstOffset;
|
|
var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - firstOffset;
|
|
var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset;
|
|
var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset;
|
|
// Current timestampOffset should reflect offset required to put media[0]
|
|
// immediately after media[1]'s highest frame end timestamp (as was adjusted
|
|
// by an earlier timestampOffset).
|
|
verify_offset_and_buffered(test, mediaSource, sourceBuffer,
|
|
secondOffset, expectedStart,
|
|
expectedEnd, expectedEndEOS,
|
|
test.done);
|
|
})
|
|
});
|
|
}, "Test sequence AppendMode appendBuffer(second media segment, then first media segment)");
|
|
</script>
|
|
</body>
|
|
</html>
|