tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

video-encoder-flush.https.any.js (2529B)


      1 // META: global=window,dedicatedworker
      2 // META: script=/common/media.js
      3 // META: script=/webcodecs/utils.js
      4 // META: script=/webcodecs/video-encoder-utils.js
      5 // META: variant=?av1
      6 // META: variant=?vp8
      7 // META: variant=?h264_avc
      8 
      9 let CONFIG = null;
     10 promise_setup(async () => {
     11  const config = {
     12    '?av1': {codec: 'av01.0.04M.08'},
     13    '?vp8': {codec: 'vp8'},
     14    '?h264_avc': {codec: 'avc1.42001e', avc: {format: 'avc'}},
     15  }[location.search];
     16  config.width = 640;
     17  config.height = 480;
     18  config.displayWidth = 800;
     19  config.displayHeight = 600;
     20  CONFIG = config;
     21 });
     22 
     23 promise_test(async t => {
     24  let codecInit = getDefaultCodecInit(t);
     25 
     26  let outputs = 0;
     27  let firstOutput = new Promise(resolve => {
     28    codecInit.output = (chunk, metadata) => {
     29      outputs++;
     30      assert_equals(outputs, 1, 'outputs');
     31      encoder.reset();
     32      resolve();
     33    };
     34  });
     35 
     36  let encoder = new VideoEncoder(codecInit);
     37  encoder.configure(CONFIG);
     38 
     39  let frame1 = createFrame(640, 480, 0);
     40  let frame2 = createFrame(640, 480, 33333);
     41  t.add_cleanup(() => {
     42    frame1.close();
     43    frame2.close();
     44  });
     45 
     46  encoder.encode(frame1);
     47  encoder.encode(frame2);
     48  const flushDone = encoder.flush();
     49 
     50  // Wait for the first output, then reset.
     51  await firstOutput;
     52 
     53  // Flush should have been synchronously rejected.
     54  await promise_rejects_dom(t, 'AbortError', flushDone);
     55 
     56  assert_equals(outputs, 1, 'outputs');
     57 }, 'Test reset during flush');
     58 
     59 promise_test(async t => {
     60  let frame1 = createFrame(640, 480, 0);
     61  let frame2 = createFrame(640, 480, 33333);
     62  t.add_cleanup(() => {
     63    frame1.close();
     64    frame2.close();
     65  });
     66 
     67  const callbacks = {};
     68  const encoder = createVideoEncoder(t, callbacks);
     69 
     70  let flushInCallbackDone;
     71  let outputs = 0;
     72  let firstOutput = new Promise(resolve => {
     73    callbacks.output = (chunk, metadata) => {
     74      encoder.reset();
     75 
     76      callbacks.output = (chunk, metadata) => {
     77        outputs++;
     78      };
     79 
     80      encoder.configure(CONFIG);
     81      encoder.encode(frame2);
     82      flushInCallbackDone = encoder.flush();
     83 
     84      resolve();
     85    };
     86  });
     87 
     88  encoder.configure(CONFIG);
     89  encoder.encode(frame1);
     90  const flushDone = encoder.flush();
     91 
     92  // Wait for the first output, then reset.
     93  await firstOutput;
     94 
     95  // Flush should have been synchronously rejected.
     96  await promise_rejects_dom(t, 'AbortError', flushDone);
     97 
     98  // Wait for the second flush and check the output count.
     99  await flushInCallbackDone;
    100 
    101  assert_equals(outputs, 1, 'outputs');
    102 }, 'Test new flush after reset in a flush callback');