123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- import YUVSurfaceShader from "./YUVSurfaceShader";
- import Texture from "./Texture";
- let canvas = null;
- let yuvSurfaceShader = null;
- let yTexture = null;
- let uTexture = null;
- let vTexture = null;
- function initWebGLCanvas() {
- canvas = document.createElement("canvas");
- canvas.id = "test_canvas";
- canvas.style = `position: fixed;top:0;left: 0;z-index: 100;`;
- const gl = canvas.getContext("webgl");
- yuvSurfaceShader = YUVSurfaceShader.create(gl);
- yTexture = Texture.create(gl, gl.LUMINANCE);
- uTexture = Texture.create(gl, gl.LUMINANCE);
- vTexture = Texture.create(gl, gl.LUMINANCE);
- document.body.append(canvas);
- }
- function draw(buffer, width, height) {
- canvas.width = width;
- canvas.height = height;
- // the width & height returned are actually padded, so we have to use the frame size to get the real image dimension
- // when uploading to texture
- const stride = width; // stride
- // height is padded with filler rows
- // if we knew the size of the video before encoding, we could cut out the black filler pixels. We don't, so just set
- // it to the size after encoding
- const sourceWidth = width;
- const sourceHeight = height;
- const maxXTexCoord = sourceWidth / stride;
- const maxYTexCoord = sourceHeight / height;
- const lumaSize = stride * height;
- const chromaSize = lumaSize >> 2;
- const yBuffer = buffer.subarray(0, lumaSize);
- const uBuffer = buffer.subarray(lumaSize, lumaSize + chromaSize);
- const vBuffer = buffer.subarray(
- lumaSize + chromaSize,
- lumaSize + 2 * chromaSize
- );
- // console.log("yBuffer", 1);
- window.updateTexture(yBuffer);
- const chromaHeight = height >> 1;
- const chromaStride = stride >> 1;
- // we upload the entire image, including stride padding & filler rows. The actual visible image will be mapped
- // from texture coordinates as to crop out stride padding & filler rows using maxXTexCoord and maxYTexCoord.
- yTexture.image2dBuffer(yBuffer, stride, height);
- uTexture.image2dBuffer(uBuffer, chromaStride, chromaHeight);
- vTexture.image2dBuffer(vBuffer, chromaStride, chromaHeight);
- yuvSurfaceShader.setTexture(yTexture, uTexture, vTexture);
- yuvSurfaceShader.updateShaderData(
- { w: width, h: height },
- { maxXTexCoord, maxYTexCoord }
- );
- // debugger
- // data = window.changeTexture(data);
- // window.updateTexture( data );
- yuvSurfaceShader.draw();
- }
- export { canvas, initWebGLCanvas, draw };
|