// META: global=window,dedicatedworker function make4x2VideoFrame(rotation, flip) { // y y r r // b b g g let data = new Uint8Array([ 255, 255, 0, 255, 255, 255, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 255, 0, 255, 0, 255, 0, 255, ]); return new VideoFrame(data, { format: "RGBX", codedWidth: 4, codedHeight: 2, timestamp: 0, rotation, flip }); } // Verifies various properties about a frame created frommake4x2VideoFrame() // with flip=true and a 90 degree rotation. function validateOrientedFrame(frame) { assert_equals(frame.visibleRect.width, 4, 'visibleRect.width'); assert_equals(frame.visibleRect.height, 2, 'visibleRect.height'); assert_equals(frame.rotation, 90, 'rotation'); assert_equals(frame.flip, true, 'flip'); assert_equals(frame.displayWidth, 2, 'displayWidth'); assert_equals(frame.displayHeight, 4, 'displayHeight'); let width = frame.displayWidth; let height = frame.displayHeight; let canvas = new OffscreenCanvas(width, height); let ctx = canvas.getContext('2d'); ctx.drawImage(frame, 0, 0); frame.close(); let data = ctx.getImageData(0, 0, width, height).data; function check_pixel(x, y, expected_color) { let tolerance = 2; assert_approx_equals(data[4*(width*y+x)], expected_color[0], tolerance); assert_approx_equals(data[4*(width*y+x)+1], expected_color[1], tolerance); assert_approx_equals(data[4*(width*y+x)+2], expected_color[2], tolerance); } // Expected rendering: // y b // y b // r g // r g check_pixel(0, 0, [255, 255, 0]); check_pixel(1, 0, [0, 0, 255]); check_pixel(0, 3, [255, 0, 0]); check_pixel(1, 3, [0, 255, 0]); } test(_ => { let frame = make4x2VideoFrame(-315, true); validateOrientedFrame(frame); }, 'Test oriented VideoFrame from ArrayBuffer'); test(_ => { for (let baseRotation = 0; baseRotation < 360; baseRotation += 90) { for (let baseFlip = 0; baseFlip < 2; ++baseFlip) { let baseFrame = make4x2VideoFrame(baseRotation, !!baseFlip); for (let deltaRotation = 0; deltaRotation < 360; deltaRotation += 90) { for (let deltaFlip = 0; deltaFlip < 2; ++deltaFlip) { let deltaFrame = new VideoFrame(baseFrame, { rotation: deltaRotation, flip: !!deltaFlip }); let appliedRotation = !!baseFlip ? 360 - deltaRotation : deltaRotation; let expectedRotation = (baseRotation + appliedRotation) % 360; let expectedFlip = !!(baseFlip ^ deltaFlip); assert_equals(deltaFrame.rotation, expectedRotation, 'rotation'); assert_equals(deltaFrame.flip, expectedFlip, 'flip'); deltaFrame.close(); } } baseFrame.close(); } } }, 'Test combinations of rotation and flip'); test(_ => { let orig_frame = make4x2VideoFrame(0, false); let frame = new VideoFrame(orig_frame, {rotation: -315, flip: true}); orig_frame.close(); validateOrientedFrame(frame); }, 'Test orientation of wrapped VideoFrame');