@@ -871,6 +871,110 @@ r12l_to_p210le(AVFrame *__restrict out_frame,
871871}
872872#endif // P210_PRESENT
873873
874+ // copied from r12l_to_p210le
875+ static void
876+ r12l_to_ayuv64le (AVFrame * __restrict out_frame ,
877+ const unsigned char * __restrict in_data , int width , int height )
878+ {
879+ assert ((uintptr_t ) out_frame -> linesize [0 ] % 2 == 0 );
880+
881+ const struct color_coeffs cfs = * get_color_coeffs (CS_DFL , DEPTH16 );
882+ #define WRITE_RES (idx ) \
883+ *dst++ = 0xffff; /* alpha */ \
884+ res_y = (RGB_TO_Y (cfs , r , g , b ) >> (COMP_BASE + 12 - DEPTH16 )) + \
885+ (1 << (DEPTH16 - 4 )); \
886+ * dst ++ = CLAMP_LIMITED_Y (res_y , DEPTH16 ); \
887+ res_cb = \
888+ (RGB_TO_CB (cfs , r , g , b ) >> (COMP_BASE + 12 - DEPTH16 )) + \
889+ (1 << (DEPTH16 - 1 )); \
890+ res_cr = \
891+ (RGB_TO_CR (cfs , r , g , b ) >> (COMP_BASE + 12 - DEPTH16 )) + \
892+ (1 << (DEPTH16 - 1 )); \
893+ * dst ++ = CLAMP_LIMITED_CBCR (res_cb , depth ); \
894+ * dst ++ = CLAMP_LIMITED_CBCR (res_cr , depth ); \
895+
896+ const int src_linesize = vc_get_linesize (width , R12L );
897+ for (int y = 0 ; y < height ; ++ y ) {
898+ const unsigned char * src = in_data + y * src_linesize ;
899+ uint16_t * dst = (uint16_t * )(void * ) (out_frame -> data [0 ] + out_frame -> linesize [0 ] * y );
900+
901+ OPTIMIZED_FOR (int x = 0 ; x < width ; x += 8 ) {
902+ comp_type_t r = 0 ;
903+ comp_type_t g = 0 ;
904+ comp_type_t b = 0 ;
905+ comp_type_t res_y = 0 ;
906+ comp_type_t res_cb = 0 ;
907+ comp_type_t res_cr = 0 ;
908+
909+ r = src [BYTE_SWAP (0 )];
910+ r |= (src [BYTE_SWAP (1 )] & 0xF ) << 8 ;
911+ g = src [BYTE_SWAP (2 )] << 4 | src [BYTE_SWAP (1 )] >> 4 ; // g0
912+ b = src [BYTE_SWAP (3 )];
913+ src += 4 ;
914+
915+ b |= (src [BYTE_SWAP (0 )] & 0xF ) << 8 ;
916+ WRITE_RES (0 )
917+ r = src [BYTE_SWAP (1 )] << 4 | src [BYTE_SWAP (0 )] >> 4 ; // r1
918+ g = src [BYTE_SWAP (2 )];
919+ g |= (src [BYTE_SWAP (3 )] & 0xF ) << 8 ;
920+ b = src [BYTE_SWAP (3 )] >> 4 ;
921+ src += 4 ;
922+
923+ b |= src [BYTE_SWAP (0 )] << 4 ; // b1
924+ WRITE_RES (1 )
925+ r = src [BYTE_SWAP (1 )];
926+ r |= (src [BYTE_SWAP (2 )] & 0xF ) << 8 ;
927+ g = src [BYTE_SWAP (3 )] << 4 | src [BYTE_SWAP (2 )] >> 4 ; // g2
928+ src += 4 ;
929+
930+ b = src [BYTE_SWAP (0 )];
931+ b |= (src [BYTE_SWAP (1 )] & 0xF ) << 8 ;
932+ WRITE_RES (2 )
933+ r = src [BYTE_SWAP (2 )] << 4 | src [BYTE_SWAP (1 )] >> 4 ; // r3
934+ g = src [BYTE_SWAP (3 )];
935+ src += 4 ;
936+
937+ g |= (src [BYTE_SWAP (0 )] & 0xF ) << 8 ;
938+ b = src [BYTE_SWAP (1 )] << 4 | src [BYTE_SWAP (0 )] >> 4 ; // b3
939+ WRITE_RES (3 )
940+ r = src [BYTE_SWAP (2 )];
941+ r |= (src [BYTE_SWAP (3 )] & 0xF ) << 8 ;
942+ g = src [BYTE_SWAP (3 )] >> 4 ;
943+ src += 4 ;
944+
945+ g |= src [BYTE_SWAP (0 )] << 4 ; // g4
946+ b = src [BYTE_SWAP (1 )];
947+ b |= (src [BYTE_SWAP (2 )] & 0xF ) << 8 ;
948+ WRITE_RES (4 )
949+ r = src [BYTE_SWAP (3 )] << 4 | src [BYTE_SWAP (2 )] >> 4 ; // r5
950+ src += 4 ;
951+
952+ g = src [BYTE_SWAP (0 )];
953+ g |= (src [BYTE_SWAP (1 )] & 0xF ) << 8 ;
954+ b = src [BYTE_SWAP (2 )] << 4 | src [BYTE_SWAP (1 )] >> 4 ; // b5
955+ WRITE_RES (5 )
956+ r = src [BYTE_SWAP (3 )];
957+ src += 4 ;
958+
959+ r |= (src [BYTE_SWAP (0 )] & 0xF ) << 8 ;
960+ g = src [BYTE_SWAP (1 )] << 4 | src [BYTE_SWAP (0 )] >> 4 ; // g6
961+ b = src [BYTE_SWAP (2 )];
962+ b |= (src [BYTE_SWAP (3 )] & 0xF ) << 8 ;
963+ WRITE_RES (6 )
964+ r = src [BYTE_SWAP (3 )] >> 4 ;
965+ src += 4 ;
966+
967+ r |= src [BYTE_SWAP (0 )] << 4 ; // r7
968+ g = src [BYTE_SWAP (1 )];
969+ g |= (src [BYTE_SWAP (2 )] & 0xF ) << 8 ;
970+ b = src [BYTE_SWAP (3 )] << 4 | src [BYTE_SWAP (2 )] >> 4 ; // b7
971+ WRITE_RES (7 )
972+ src += 4 ;
973+ }
974+ }
975+ #undef WRITE_RES
976+ }
977+
874978/// @brief Converts RG48 to yuv444p 10/12/14 le
875979#if defined __GNUC__
876980static inline void rg48_to_yuv444pXXle (int depth , AVFrame * __restrict out_frame , const unsigned char * __restrict in_data , int width , int height )
@@ -1308,6 +1412,7 @@ static const struct uv_to_av_conversion *get_uv_to_av_conversions() {
13081412#if P210_PRESENT
13091413 { R12L , AV_PIX_FMT_P210LE , r12l_to_p210le },
13101414#endif // defined P210_PRESENT
1415+ { R12L , AV_PIX_FMT_AYUV64LE , r12l_to_ayuv64le },
13111416 { RG48 , AV_PIX_FMT_YUV444P10LE , rg48_to_yuv444p10le },
13121417 { RG48 , AV_PIX_FMT_YUV444P12LE , rg48_to_yuv444p12le },
13131418 { RG48 , AV_PIX_FMT_YUV444P16LE , rg48_to_yuv444p16le },
0 commit comments