<!DOCTYPE html>
<!--
Take frames coming from various sources and read them using copyTo().
-->
<title>copyTo() test</title>
<script src="webcodecs_common.js"></script>
<script type="text/javascript">
  'use strict';

  function yuv_to_rgb601(y, u, v) {
    let b = 1.164 * (y - 16) + 2.018 * (u - 128);
    let g = 1.164 * (y - 16) - 0.813 * (v - 128) - 0.391 * (u - 128);
    let r = 1.164 * (y - 16) + 1.596 * (v - 128);
    return { r: r, g: g, b: b };
  }

  function yuv_to_rgb709(y, u, v) {
    let b = 1.164 * (y - 16) + 2.113 * (u - 128);
    let g = 1.164 * (y - 16) - 0.533 * (v - 128) - 0.213 * (u - 128);
    let r = 1.164 * (y - 16) + 1.793 * (v - 128);
    return { r: r, g: g, b: b };
  }

  function yuv_to_rgb601_full(y, u, v) {
    let r = y + 1.402 * (v - 128);
    let g = y - 0.344136 * (u - 128) - 0.714136 * (v - 128);
    let b = y + 1.772 * (u - 128);
    return { r: r, g: g, b: b };
  }

  function yuv_to_rgb709_full(y, u, v) {
    let r = y + 1.5748 * (v - 128);
    let g = y - 0.1873 * (u - 128) - 0.4681 * (v - 128);
    let b = y + 1.8556 * (u - 128);
    return { r: r, g: g, b: b };
  }

  function compareArrayBuffers(buffer1, buffer2) {
    const view1 = new DataView(buffer1);
    const view2 = new DataView(buffer2);

    if (view1.byteLength !== view2.byteLength) {
      return false;
    }

    for (let i = 0; i < view1.byteLength; i++) {
      if (view1.getUint8(i) !== view2.getUint8(i)) {
        return false;
      }
    }

    return true;
  }

  async function validateFourColorsBytes(frame) {
    const m = 4;
    const tolerance = 8;
    let expected_xy_color = [
      // Left-top yellow
      { x: m, y: m, r: 255, g: 255, b: 0 },
      // Right-top red
      { x: frame.displayWidth - m, y: m, r: 255, g: 0, b: 0 },
      // Left-bottom blue
      { x: m, y: frame.displayHeight - m, r: 0, g: 0, b: 255 },
      // Right-bottom green
      { x: frame.displayWidth - m, y: frame.displayHeight - m,
        r: 0, g: 255, b: 0 },
    ]

    for (let test of expected_xy_color) {
      const options = {
        rect: { x: test.x, y: test.y, width: 1, height: 1 }
      }
      let size = frame.allocationSize(options);
      let buffer = new ArrayBuffer(size);
      let shared_buffer = new SharedArrayBuffer(size);
      let layout = await frame.copyTo(buffer, options);
      await frame.copyTo(shared_buffer, options);
      TEST.assert(compareArrayBuffers(buffer, shared_buffer),
                  'Readback mismatch between shared and non-shared buffers');
      let view = new DataView(buffer);
      let rgb = null;

      let yuv_to_rgb = null;
      if (frame.colorSpace.fullRange) {
        yuv_to_rgb = yuv_to_rgb601_full;
        if (frame.colorSpace.matrix == "bt709")
          yuv_to_rgb = yuv_to_rgb709_full;
      } else {
        yuv_to_rgb = yuv_to_rgb601;
        if (frame.colorSpace.matrix == "bt709")
          yuv_to_rgb = yuv_to_rgb709;
      }

      switch (frame.format) {
        case "I420":
        case "I420A":
          rgb = yuv_to_rgb(view.getUint8(layout[0].offset),   // Y
            view.getUint8(layout[1].offset),                  // U
            view.getUint8(layout[2].offset));                 // V
          break;
        case "NV12":
          rgb = yuv_to_rgb(view.getUint8(layout[0].offset),   // Y
            view.getUint8(layout[1].offset),                  // U
            view.getUint8(layout[1].offset + 1));             // V
          break;
        case "RGBX":
        case "RGBA":
          rgb = {
            r: view.getUint8(layout[0].offset),
            g: view.getUint8(layout[0].offset + 1),
            b: view.getUint8(layout[0].offset + 2)
          };
          break;
        case "BGRX":
        case "BGRA":
          rgb = {
            r: view.getUint8(layout[0].offset + 2),
            g: view.getUint8(layout[0].offset + 1),
            b: view.getUint8(layout[0].offset)
          };
          break;
        default:
          TEST.reportFailure("Unexpected frame format: " + frame.format);
          return;
      }

      let message =
          `Test ${frame.format} ${JSON.stringify(test)} ${JSON.stringify(rgb)}`;
      TEST.assert(Math.abs(rgb.r - test.r) < tolerance, message);
      TEST.assert(Math.abs(rgb.g - test.g) < tolerance, message);
      TEST.assert(Math.abs(rgb.b - test.b) < tolerance, message);
    }
  }

  function readWholeBuffer(buffer) {
    let bytes = new Uint8Array(buffer);
    return bytes.reduce((acc, byte) => { return byte ? acc + 1 : acc; }, 0);
  }

  function makeWorker() {
    const worker = new Worker('buffer-read-and-reply-worker.js');
    let resolve_promise = null;
    worker.onmessage = function(e) { resolve_promise(e.data); }
    let worker_promise = new Promise((resolve) => {
      resolve_promise = resolve;
    });
    return { worker , worker_promise };
  }

  async function main(arg) {
    let source_type = arg.source_type;
    TEST.log('Starting test with arguments: ' + JSON.stringify(arg));
    let source = await createFrameSource(source_type, FRAME_WIDTH, FRAME_HEIGHT);
    if (!source) {
      TEST.skip('Unsupported source: ' + source_type);
      return;
    }

    let frame = await source.getNextFrame();
    let size = frame.allocationSize();

    // Readback a whole frame to a regular buffer detach it
    {
      let buf = new ArrayBuffer(size);
      TEST.assert(readWholeBuffer(buf) == 0, "Buffer should be zero");
      let copy_promise = frame.copyTo(buf);
      buf.transfer(1);
      let layout = await copy_promise;
      TEST.assert(layout, "layout is empty / ArrayBuffer");
    }

    // Readback a whole frame to a regular buffer and send it to a worker
    {
      let {worker, worker_promise } = makeWorker();
      let buf = new ArrayBuffer(size);
      TEST.assert(readWholeBuffer(buf) == 0, "Buffer should be zero");
      let copy_promise = frame.copyTo(buf);
      worker.postMessage(buf, [buf]);
      let result_buf = await worker_promise;
      let layout = await copy_promise;
      TEST.assert(readWholeBuffer(result_buf) > 0, "Buffer shouldn't be zero");
      TEST.assert(layout, "layout is empty / ArrayBuffer");
      worker.terminate();
    }

    // Readback a whole frame to a shared buffer and send it to a worker
    {
      let {worker, worker_promise} = makeWorker();
      let buf = new SharedArrayBuffer(size);
      TEST.assert(readWholeBuffer(buf) == 0, "Buffer should be zero");
      let copy_promise = frame.copyTo(buf);
      worker.postMessage(buf);
      await worker_promise;
      let layout = await copy_promise;
      TEST.assert(readWholeBuffer(buf) > 0, "SharedBuffer shouldn't be zero");
      TEST.assert(layout, "layout is empty / SharedArrayBuffer");
      worker.terminate();
    }

    // Test that padding bytes (stride/offset padding) are not overwritten.
    {
      const PAD = 0xAA;
      const options = {
        layout: [
          {offset: 5, stride: frame.displayWidth * 4 + 16}, // plenty of padding
        ],
      };
      if (frame.format === 'I420' || frame.format === 'I420A') {
        options.layout = [
          {offset: 5, stride: frame.displayWidth + 16},
          {offset: (frame.displayWidth + 16) * frame.displayHeight + 10, stride: frame.displayWidth / 2 + 16},
          {offset: (frame.displayWidth + 16) * frame.displayHeight + (frame.displayWidth / 2 + 16) * (frame.displayHeight / 2) + 20, stride: frame.displayWidth / 2 + 16},
        ];
        if (frame.format === 'I420A') {
          options.layout.push({
            offset: (frame.displayWidth + 16) * frame.displayHeight + (frame.displayWidth / 2 + 16) * (frame.displayHeight / 2) * 2 + 30,
            stride: frame.displayWidth + 16
          });
        }
      } else if (frame.format === 'NV12') {
        options.layout = [
          {offset: 5, stride: frame.displayWidth + 16},
          {offset: (frame.displayWidth + 16) * frame.displayHeight + 10, stride: frame.displayWidth + 16},
        ];
      }

      let size_with_padding = frame.allocationSize(options);
      let buf = new ArrayBuffer(size_with_padding);
      let view = new Uint8Array(buf);
      view.fill(PAD);

      let layout = await frame.copyTo(buf, options);

      // Verify that the layout matches what we specified
      for (let plane = 0; plane < layout.length; plane++) {
        TEST.assert(layout[plane].offset === options.layout[plane].offset, "offset mismatch");
        TEST.assert(layout[plane].stride === options.layout[plane].stride, "stride mismatch");
      }

      // We want to verify that the bytes between rows (the padding bytes) are untouched (still PAD).
      for (let plane = 0; plane < layout.length; plane++) {
        let plane_offset = layout[plane].offset;
        let stride = layout[plane].stride;
        let plane_height = frame.displayHeight;
        let plane_width = frame.displayWidth;
        if (plane > 0 && (frame.format === 'I420' || frame.format === 'I420A' || frame.format === 'NV12')) {
          plane_height /= 2;
          if (frame.format === 'I420' || frame.format === 'I420A') {
            plane_width /= 2;
          }
        }
        let bytes_per_pixel = 1;
        if (frame.format === 'RGBA' || frame.format === 'RGBX' || frame.format === 'BGRA' || frame.format === 'BGRX') {
          bytes_per_pixel = 4;
        } else if (frame.format === 'NV12' && plane === 1) {
          bytes_per_pixel = 2; // UV interleaved
        }

        let row_bytes = plane_width * bytes_per_pixel;
        for (let y = 0; y < plane_height; ++y) {
          let row_start = plane_offset + y * stride;
          for (let x = row_bytes; x < stride; ++x) {
            let pad_idx = row_start + x;
            if (pad_idx < size_with_padding) {
              TEST.assert(view[pad_idx] === PAD, `Padding byte overwritten at index ${pad_idx} for plane ${plane}, row ${y}, x ${x}. Expected ${PAD}, got ${view[pad_idx]}`);
            }
          }
        }
      }
    }

    // Validate pixels
    if (!arg.validate_camera_frames && source_type == 'camera') {
      TEST.log("Skip copyTo result validation");
    } else {
      await validateFourColorsBytes(frame);
    }

    frame.close();
    source.close();
    TEST.log('Test completed');
  }
  addManualTestButton([{'source_type': 'offscreen'}]);
  addManualTestButton([{'source_type': 'arraybuffer'}]);
</script>
