mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
a8e52798ff
Implement HTMLMediaElement.fastSeek(), basically by changing all the MediaDecoderReader::Seek() overrides to not call MediaDecoderReader::DecodeToTarget(), and have MediaDecoderReader::DecodeSeek() call DecodeToTarget() if we're doing an accurate (non-fast) seek. Update gizmo.mp4 to have a keyframe every second, instead of only 1 keyframe at the start of stream. This makes the unit test I added more useful for mp4... I pushed most of the seek target clamping logic in MediaDecoder up into HTMLMediaElement, so that we're clamping in fewer places. Note MediaDecoderStateMachine::Seek() still sanity checks the seek target. We have to update the currentTime/MediaDecoder playback position after a seek completes now, rather than assuming the seek always got it exactly right. Removed those pesky assertions about seek target lying in the first frame after seek, since actually sometimes the media doesn't have samples for all streams after a seek (either due to the media being encoded like that, or because of a bug in the platform's decoder, not entirely sure). Green: https://tbpl.mozilla.org/?tree=Try&rev=b028258565e2 * * * Bug 778077 - Fix up MediaOMXReader fastseek to ensure audio stream stays in sync with video stream. r=cajbir
89 lines
3.0 KiB
HTML
89 lines
3.0 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<!--
|
|
https://bugzilla.mozilla.org/show_bug.cgi?id=778077
|
|
-->
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Test for Bug 778077</title>
|
|
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
|
<script type="text/javascript" src="manifest.js"></script>
|
|
<script type="application/javascript">
|
|
|
|
/** Test for Bug 778077 - HTMLMediaElement.fastSeek() **/
|
|
// Iterate through a list of keyframe timestamps, and seek to
|
|
// halfway between the keyframe and the keyframe after it.
|
|
var manager = new MediaTestManager;
|
|
|
|
function doSeek(v) {
|
|
// fastSeek to half way between this keyframe and the next, or if this is the last
|
|
// keyframe seek to halfway between this keyframe and the end of media.
|
|
var nextKeyFrame = (v.keyframeIndex + 1) < v.keyframes.length ? v.keyframes[v.keyframeIndex + 1] : v.duration;
|
|
v.target = (v.keyframes[v.keyframeIndex] + nextKeyFrame) / 2;
|
|
v.fastSeek(v.target);
|
|
ok(Math.abs(v.currentTime - v.target) < 0.01,
|
|
v.name + " seekTo=" + v.target + " currentTime (" + v.currentTime + ") should be close to seek target initially");
|
|
}
|
|
|
|
function onloadedmetadata(event) {
|
|
var v = event.target;
|
|
doSeek(v);
|
|
}
|
|
|
|
function onseeked(event) {
|
|
var v = event.target;
|
|
var keyframe = v.keyframes[v.keyframeIndex];
|
|
|
|
// Check that the current time ended up roughly after the keyframe.
|
|
// We must be a bit fuzzy here, as the decoder backend may actually
|
|
// seek to the audio sample prior to the keyframe.
|
|
ok(v.currentTime >= keyframe - 0.05,
|
|
v.name + " seekTo=" + v.target + " currentTime (" + v.currentTime +
|
|
") should be end up roughly after keyframe (" + keyframe + ") after fastSeek");
|
|
|
|
ok(v.currentTime <= v.target,
|
|
v.name + " seekTo=" + v.target + " currentTime (" + v.currentTime +
|
|
") should be end up less than target after fastSeek");
|
|
|
|
v.keyframeIndex++
|
|
if (v.keyframeIndex == v.keyframes.length) {
|
|
manager.finished(v.token);
|
|
v.src = "";
|
|
v.parentNode.removeChild(v);
|
|
} else {
|
|
doSeek(v);
|
|
}
|
|
}
|
|
|
|
function startTest(test, token) {
|
|
manager.started(token);
|
|
v = document.createElement("video");
|
|
v.src = test.name;
|
|
v.name = test.name;
|
|
v.preload = "metadata";
|
|
v.token = token;
|
|
v.target = 0;
|
|
v.keyframes = test.keyframes;
|
|
v.keyframeIndex = 0;
|
|
ok(v.keyframes.length > 0, v.name + " - video should have at least one sync point");
|
|
v.addEventListener("loadedmetadata", onloadedmetadata);
|
|
v.addEventListener("seeked", onseeked);
|
|
document.body.appendChild(v);
|
|
}
|
|
|
|
manager.runTests(gFastSeekTests, startTest);
|
|
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=778077">Mozilla Bug 778077</a>
|
|
<p id="display"></p>
|
|
<div id="content" style="display: none">
|
|
|
|
</div>
|
|
<pre id="test">
|
|
</pre>
|
|
</body>
|
|
</html>
|