@@ -16,7 +16,7 @@ cdef object _cinit_bypass_sentinel
1616supported_np_pix_fmts = {
1717 " abgr" , " argb" , " bayer_bggr16be" , " bayer_bggr16le" , " bayer_bggr8" , " bayer_gbrg16be" ,
1818 " bayer_gbrg16le" , " bayer_gbrg8" , " bayer_grbg16be" , " bayer_grbg16le" , " bayer_grbg8" ,
19- " bayer_rggb16be" , " bayer_rggb16le" , " bayer_rggb8" , " bgr24" , " bgr8" , " bgra" ,
19+ " bayer_rggb16be" , " bayer_rggb16le" , " bayer_rggb8" , " bgr24" , " bgr48be " , " bgr48le " , " bgr8" , " bgra" , " bgra64be " , " bgra64le " ,
2020 " gbrapf32be" , " gbrapf32le" , " gbrp" , " gbrp10be" , " gbrp10le" , " gbrp12be" , " gbrp12le" ,
2121 " gbrp14be" , " gbrp14le" , " gbrp16be" , " gbrp16le" , " gbrpf32be" , " gbrpf32le" , " gray" ,
2222 " gray16be" , " gray16le" , " gray8" , " grayf32be" , " grayf32le" , " nv12" , " pal8" , " rgb24" ,
@@ -342,6 +342,8 @@ cdef class VideoFrame(Frame):
342342 " bayer_rggb16le" : (2 , " uint16" ),
343343 " bayer_rggb16be" : (2 , " uint16" ),
344344 " bgr24" : (3 , " uint8" ),
345+ " bgr48be" : (6 , " uint16" ),
346+ " bgr48le" : (6 , " uint16" ),
345347 " bgr8" : (1 , " uint8" ),
346348 " bgra" : (4 , " uint8" ),
347349 " gbrapf32be" : (4 , " float32" ),
@@ -370,6 +372,8 @@ cdef class VideoFrame(Frame):
370372 " rgba" : (4 , " uint8" ),
371373 " rgba64be" : (8 , " uint16" ),
372374 " rgba64le" : (8 , " uint16" ),
375+ " bgra64be" : (8 , " uint16" ),
376+ " bgra64le" : (8 , " uint16" ),
373377 " yuv444p" : (1 , " uint8" ),
374378 " yuv444p16be" : (2 , " uint16" ),
375379 " yuv444p16le" : (2 , " uint16" ),
@@ -467,43 +471,58 @@ cdef class VideoFrame(Frame):
467471 if not width:
468472 width = array.shape[1 ]
469473
470- if format in ( " rgb24" , " bgr24" ) :
474+ if format in { " rgb24" , " bgr24" } :
471475 check_ndarray(array, " uint8" , 3 )
472476 check_ndarray_shape(array, array.shape[2 ] == 3 )
473477 if array.strides[1 :] != (3 , 1 ):
474478 raise ValueError (" provided array does not have C_CONTIGUOUS rows" )
479+ linesizes = (array.strides[0 ], )
480+ elif format in {" rgb48le" , " rgb48be" , " bgr48le" , " bgr48be" }:
481+ check_ndarray(array, " uint16" , 3 )
482+ check_ndarray_shape(array, array.shape[2 ] == 3 )
483+ if array.strides[1 :] != (6 , 2 ):
484+ raise ValueError (" provided array does not have C_CONTIGUOUS rows" )
475485 linesizes = (array.strides[0 ], )
476- elif format in ( " rgba" , " bgra" ) :
486+ elif format in { " rgba" , " bgra" , " argb " , " abgr " } :
477487 check_ndarray(array, " uint8" , 3 )
478488 check_ndarray_shape(array, array.shape[2 ] == 4 )
479489 if array.strides[1 :] != (4 , 1 ):
480490 raise ValueError (" provided array does not have C_CONTIGUOUS rows" )
481491 linesizes = (array.strides[0 ], )
482- elif format in (" gray" , " gray8" , " rgb8" , " bgr8" ):
492+ elif format in {" rgba64le" , " rgba64be" , " bgra64le" , " bgra64be" }:
493+ check_ndarray(array, " uint16" , 3 )
494+ check_ndarray_shape(array, array.shape[2 ] == 4 )
495+ if array.strides[1 :] != (8 , 2 ):
496+ raise ValueError (" provided array does not have C_CONTIGUOUS rows" )
497+ linesizes = (array.strides[0 ], )
498+ elif format in {" gray" , " gray8" , " rgb8" , " bgr8" ," bayer_bggr8" , " bayer_rggb8" , " bayer_gbrg8" , " bayer_grbg8" }:
483499 check_ndarray(array, " uint8" , 2 )
484500 if array.strides[1 ] != 1 :
485501 raise ValueError (" provided array does not have C_CONTIGUOUS rows" )
486502 linesizes = (array.strides[0 ], )
487- elif format in (" yuv420p" , " yuvj420p" , " nv12" ):
503+ elif format in {" gray16le" , " gray16be" , " bayer_rggb16le" , " bayer_gbrg16le" , " bayer_grbg16le" ," bayer_bggr16be" , " bayer_rggb16be" , " bayer_gbrg16be" , " bayer_grbg16be" }:
504+ check_ndarray(array, " uint16" , 2 )
505+ if array.strides[1 ] != 2 :
506+ raise ValueError (" provided array does not have C_CONTIGUOUS rows" )
507+ linesizes = (array.strides[0 ], )
508+ elif format in {" grayf32le" , " grayf32be" }:
509+ check_ndarray(array, " float32" , 2 )
510+ if array.strides[1 ] != 4 :
511+ raise ValueError (" provided array does not have C_CONTIGUOUS rows" )
512+ linesizes = (array.strides[0 ], )
513+ elif format in {" yuv420p" , " yuvj420p" , " nv12" }:
488514 check_ndarray(array, " uint8" , 2 )
489515 check_ndarray_shape(array, array.shape[0 ] % 3 == 0 )
490516 check_ndarray_shape(array, array.shape[1 ] % 2 == 0 )
491517 height = height // 6 * 4
492518 if array.strides[1 ] != 1 :
493519 raise ValueError (" provided array does not have C_CONTIGUOUS rows" )
494- if format in ( " yuv420p" , " yuvj420p" ) :
520+ if format in { " yuv420p" , " yuvj420p" } :
495521 # For YUV420 planar formats, the UV plane stride is always half the Y stride.
496522 linesizes = (array.strides[0 ], array.strides[0 ] // 2 , array.strides[0 ] // 2 )
497523 else :
498524 # Planes where U and V are interleaved have the same stride as Y.
499525 linesizes = (array.strides[0 ], array.strides[0 ])
500- elif format in {" bayer_bggr8" , " bayer_rggb8" , " bayer_gbrg8" , " bayer_grbg8" ," bayer_bggr16le" , " bayer_rggb16le" , " bayer_gbrg16le" , " bayer_grbg16le" ," bayer_bggr16be" , " bayer_rggb16be" , " bayer_gbrg16be" , " bayer_grbg16be" }:
501- check_ndarray(array, " uint8" if format.endswith(" 8" ) else " uint16" , 2 )
502-
503- if array.strides[1 ] != (1 if format.endswith(" 8" ) else 2 ):
504- raise ValueError (" provided array does not have C_CONTIGUOUS rows" )
505-
506- linesizes = (array.strides[0 ],)
507526 else :
508527 raise ValueError (f" Conversion from numpy array with format `{format}` is not yet supported" )
509528
@@ -717,13 +736,13 @@ cdef class VideoFrame(Frame):
717736 elif format in {" argb" , " rgba" , " abgr" , " bgra" }:
718737 check_ndarray(array, " uint8" , 3 )
719738 check_ndarray_shape(array, array.shape[2 ] == 4 )
720- elif format in {" rgb48be" , " rgb48le" }:
739+ elif format in {" rgb48be" , " rgb48le" , " bgr48be " , " bgr48le " }:
721740 check_ndarray(array, " uint16" , 3 )
722741 check_ndarray_shape(array, array.shape[2 ] == 3 )
723742 frame = VideoFrame(array.shape[1 ], array.shape[0 ], format)
724743 copy_array_to_plane(byteswap_array(array, format.endswith(" be" )), frame.planes[0 ], 6 )
725744 return frame
726- elif format in {" rgba64be" , " rgba64le" }:
745+ elif format in {" rgba64be" , " rgba64le" , " bgra64be " , " bgra64le " }:
727746 check_ndarray(array, " uint16" , 3 )
728747 check_ndarray_shape(array, array.shape[2 ] == 4 )
729748 frame = VideoFrame(array.shape[1 ], array.shape[0 ], format)
0 commit comments