<!DOCTYPE html>
<html>
<head>
    <title>audio-session-category-track-change</title>
    <script src="../../../../media/video-test.js"></script>
    <script src="../../../../media/media-source/media-source-loader.js"></script>
    <script>
    mediaElement = video = document.createElement('video');

    loader = new MediaSourceLoader('../../../../media/media-source/content/test-fragmented-manifest.json', '../../../../media/media-source/');
    loader.onerror = () => {
        failTest('Media data loading failed');
    };

    loader.onload = () => {
        source = new MediaSource();
        waitForEvent('sourceopen', sourceOpen, false, false, source);
        waitForEventAndFail('error');
        run('video.src = URL.createObjectURL(source)');
    }

    function sourceOpen() {
        run('source.duration = loader.duration()');
        run('sourceBuffer = source.addSourceBuffer(loader.type())');
        waitForEventOn(sourceBuffer, 'update', sourceInitialized, false, true);
        run('sourceBuffer.appendBuffer(loader.initSegment())');
    }

    function sourceInitialized() {
        waitForEventOn(sourceBuffer, 'update', mediaSegmentAppended, false, true);
        run('sourceBuffer.appendBuffer(loader.mediaSegment(0))');
    }

    function mediaSegmentAppended() {
        run('canvas = document.createElement("canvas")');
        run('gl = canvas.getContext("webgl")');
        run('texture = gl.createTexture()');
        run('gl.bindTexture(gl.TEXTURE_2D, texture)');
        run('gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)');
        run('gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)');
        run('gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)');
        run('gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)');
        run('gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video)');
        run('video.play()');
        consoleWrite('Wait for currentTime to advance beyond 0s.');
        video.addEventListener('timeupdate', timeupdate);
    }

    function timeupdate() {
        if (video.currentTime == 0)
            return;

        consoleWrite('EVENT(timeupdate)');
        testExpected('video.getVideoPlaybackQuality().totalVideoFrames', '0', '>');
        endTest();
    }

    </script>
</head>
</html>