Home | History | Annotate | Download | only in data
      1 <html>
      2   <head>
      3     <title>Test media source config changes.</title>
      4   </head>
      5   <body onload="runTest();">
      6     <video controls></video>
      7     <script src='eme_player_js/app_loader.js' type='text/javascript'></script>
      8     <script type="text/javascript">
      9       var testConfig = new TestConfig();
     10       testConfig.loadQueryParams();
     11       var runEncrypted = testConfig.runEncrypted == 1;
     12 
     13       var video = document.querySelector('video');
     14       var mediaType = 'video/webm; codecs="vorbis, vp8"';
     15 
     16       var MEDIA_1 = 'bear-320x240.webm';
     17       var MEDIA_2 = 'bear-640x360.webm';
     18       if (runEncrypted) {
     19         MEDIA_1 = 'bear-320x240-av_enc-av.webm';
     20         MEDIA_2 = 'bear-640x360-av_enc-av.webm';
     21       }
     22 
     23       var MEDIA_1_WIDTH = 320;
     24       var MEDIA_1_HEIGHT = 240;
     25 
     26       var MEDIA_2_WIDTH = 640;
     27       var MEDIA_2_HEIGHT = 360;
     28       var MEDIA_2_LENGTH = 2.75;
     29 
     30       // The time in secs to append the second media source.
     31       var APPEND_TIME = 1;
     32       // DELTA is the time after APPEND_TIME where the second video dimensions
     33       // are guaranteed to take effect.
     34       var DELTA = 0.1;
     35       // Append MEDIA_2 source at APPEND_TIME, so expected total duration is:
     36       var TOTAL_DURATION = APPEND_TIME + MEDIA_2_LENGTH;
     37 
     38       function appendNextSource(mediaSource) {
     39         console.log('Appending next media source at ' + APPEND_TIME + 'sec.');
     40         var xhr = new XMLHttpRequest();
     41         xhr.open("GET", MEDIA_2);
     42         xhr.responseType = 'arraybuffer';
     43         xhr.addEventListener('load', function(e) {
     44           var onUpdateEnd = function(e) {
     45             console.log('Second buffer append ended.');
     46             srcBuffer.removeEventListener('updateend', onUpdateEnd);
     47             mediaSource.endOfStream();
     48             if (!mediaSource.duration ||
     49                 Math.abs(mediaSource.duration - TOTAL_DURATION) > DELTA) {
     50               Utils.failTest('Unexpected mediaSource.duration = ' +
     51                        mediaSource.duration + ', expected duration = ' +
     52                        TOTAL_DURATION);
     53               return;
     54             }
     55             video.play();
     56           };
     57           console.log('Appending next media source at ' + APPEND_TIME + 'sec.');
     58           var srcBuffer = mediaSource.sourceBuffers[0];
     59           srcBuffer.addEventListener('updateend', onUpdateEnd);
     60           srcBuffer.timestampOffset = APPEND_TIME;
     61           srcBuffer.appendBuffer(new Uint8Array(e.target.response));
     62         });
     63         xhr.send();
     64       }
     65 
     66       function onTimeUpdate() {
     67         // crbug.com/246308
     68         //checkVideoProperties();
     69 
     70         // Seek to APPEND_TIME because after a seek a timeUpdate event is fired
     71         // before video width and height properties get updated.
     72         if (video.currentTime < APPEND_TIME - DELTA) {
     73           // Seek to save test execution time (about 1 secs) and to test seek
     74           // on the first buffer.
     75           video.currentTime = APPEND_TIME - DELTA;
     76         } else if (video.currentTime > APPEND_TIME + DELTA) {
     77           // Check video duration here to guarantee that second segment has been
     78           // appended and video total duration is updated.
     79           // Video duration is a float value so we check it within a range.
     80           if (!video.duration ||
     81               Math.abs(video.duration - TOTAL_DURATION) > DELTA) {
     82             Utils.failTest('Unexpected video.duration = ' + video.duration +
     83                      ', expected duration = ' + TOTAL_DURATION);
     84             return;
     85           }
     86 
     87           video.removeEventListener('timeupdate', onTimeUpdate);
     88           video.removeEventListener('ended', Utils.failTest);
     89           Utils.installTitleEventHandler(video, 'ended');
     90           // Seek to save test execution time and to test seek on second buffer.
     91           video.currentTime = APPEND_TIME + MEDIA_2_LENGTH * 0.9;
     92         }
     93       }
     94 
     95       function checkVideoProperties() {
     96         if (video.currentTime <= APPEND_TIME) {
     97           if (video.videoWidth != MEDIA_1_WIDTH ||
     98               video.videoHeight != MEDIA_1_HEIGHT) {
     99             logVideoDimensions();
    100             Utils.failTest('Unexpected dimensions for first video segment.');
    101             return;
    102           }
    103         } else if (video.currentTime >= APPEND_TIME + DELTA) {
    104           if (video.videoWidth != MEDIA_2_WIDTH ||
    105               video.videoHeight != MEDIA_2_HEIGHT) {
    106             logVideoDimensions();
    107             Utils.failTest('Unexpected dimensions for second video segment.');
    108             return;
    109           }
    110         }
    111       }
    112 
    113       function logVideoDimensions() {
    114         console.log('video.currentTime = ' + video.currentTime +
    115                     ', video dimensions = ' + video.videoWidth + 'x' +
    116                     video.videoHeight + '.');
    117       }
    118 
    119       function runTest() {
    120         testConfig.mediaFile = MEDIA_1;
    121         testConfig.mediaType = mediaType;
    122         video.addEventListener('timeupdate', onTimeUpdate);
    123         video.addEventListener('ended', Utils.failTest);
    124         if (runEncrypted) {
    125           var emePlayer = PlayerUtils.createPlayer(video, testConfig);
    126           emePlayer.registerEventListeners();
    127         }
    128         var mediaSource = MediaSourceUtils.loadMediaSource(
    129             MEDIA_1, mediaType, appendNextSource);
    130         video.src = window.URL.createObjectURL(mediaSource);
    131       }
    132       </script>
    133   </body>
    134 </html>
    135