@@ -755,3 +755,71 @@ test(t => {
755
755
frame . close ( ) ;
756
756
} , 'Test a VideoFrame constructed from canvas can drop the alpha channel.' ) ;
757
757
758
+ promise_test ( async t => {
759
+ let fmt = 'RGBA' ;
760
+ const rgb_plane = [
761
+ 0xBA , 0xDF , 0x00 , 0xD0 , 0xBA , 0xDF , 0x01 , 0xD0 , 0xBA , 0xDF , 0x02 , 0xD0 ,
762
+ 0xBA , 0xDF , 0x03 , 0xD0
763
+ ] ;
764
+ let data = new Uint8Array ( rgb_plane ) ;
765
+ let unused_buffer = new ArrayBuffer ( 123 ) ;
766
+ let init = {
767
+ format : fmt ,
768
+ timestamp : 1234 ,
769
+ codedWidth : 2 ,
770
+ codedHeight : 2 ,
771
+ visibleRect : { x : 0 , y : 0 , width : 2 , height : 2 } ,
772
+ transfer : [ data . buffer , unused_buffer ]
773
+ } ;
774
+ assert_equals ( data . length , 16 , 'data.length' ) ;
775
+ assert_equals ( unused_buffer . byteLength , 123 , 'unused_buffer.byteLength' ) ;
776
+
777
+ let frame = new VideoFrame ( data , init ) ;
778
+ assert_equals ( frame . format , fmt , 'format' ) ;
779
+ assert_equals ( data . length , 0 , 'data.length after detach' ) ;
780
+ assert_equals ( unused_buffer . byteLength , 0 , 'unused_buffer after detach' ) ;
781
+
782
+ const options = {
783
+ rect : { x : 0 , y : 0 , width : init . codedWidth , height : init . codedHeight }
784
+ } ;
785
+ let size = frame . allocationSize ( options ) ;
786
+ let output_data = new Uint8Array ( size ) ;
787
+ let layout = await frame . copyTo ( output_data , options ) ;
788
+ let expected_data = new Uint8Array ( rgb_plane ) ;
789
+ assert_equals ( expected_data . length , size , 'expected_data size' ) ;
790
+ for ( let i = 0 ; i < size ; i ++ ) {
791
+ assert_equals ( expected_data [ i ] , output_data [ i ] , `expected_data[${ i } ]` ) ;
792
+ }
793
+
794
+ frame . close ( ) ;
795
+ } , 'Test transfering ArrayBuffer to VideoFrame' ) ;
796
+
797
+
798
+ promise_test ( async t => {
799
+ const rgb_plane = [
800
+ 0xBA , 0xDF , 0x00 , 0xD0 , 0xBA , 0xDF , 0x01 , 0xD0 , 0xBA , 0xDF , 0x02 , 0xD0 ,
801
+ 0xBA , 0xDF , 0x03 , 0xD0
802
+ ] ;
803
+ let data = new Uint8Array ( rgb_plane ) ;
804
+ let detached_buffer = new ArrayBuffer ( 123 ) ;
805
+
806
+ // Detach `detached_buffer`
807
+ structuredClone ( { x : detached_buffer } , { transfer : [ detached_buffer ] } ) ;
808
+
809
+ let init = {
810
+ format : 'RGBA' ,
811
+ timestamp : 1234 ,
812
+ codedWidth : 2 ,
813
+ codedHeight : 2 ,
814
+ visibleRect : { x : 0 , y : 0 , width : 2 , height : 2 } ,
815
+ transfer : [ data . buffer , detached_buffer ]
816
+ } ;
817
+
818
+ try {
819
+ new VideoFrame ( data , init ) ;
820
+ } catch ( error ) {
821
+ assert_equals ( error . name , 'DataCloneError' , 'error.name' ) ;
822
+ }
823
+ // `data.buffer` didn't get detached
824
+ assert_equals ( data . length , 16 , 'data.length' ) ;
825
+ } , 'Test transfering detached buffer to VideoFrame' ) ;
0 commit comments