Skip to content

Commit e32dc06

Browse files
committed
to_lavc_vid_conv: add r12l_to_ayuv64le
refers to <#479>
1 parent 9d1a754 commit e32dc06

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

src/libavcodec/to_lavc_vid_conv.c

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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__
876980
static 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

Comments
 (0)