@@ -1124,6 +1124,112 @@ static void grayf32##endian_name##ToY16_c(uint8_t *dst, const uint8_t *src,
1124
1124
rgbf32_planar_funcs_endian (le , 0 )
1125
1125
rgbf32_planar_funcs_endian (be , 1 )
1126
1126
1127
+ #define rdpx (src ) av_int2float(half2float(is_be ? AV_RB16(&src) : AV_RL16(&src), h2f_tbl))
1128
+
1129
+ static av_always_inline void rgbaf16ToUV_half_endian (uint16_t * dstU , uint16_t * dstV , int is_be ,
1130
+ const uint16_t * src , int width ,
1131
+ int32_t * rgb2yuv , Half2FloatTables * h2f_tbl )
1132
+ {
1133
+ int32_t ru = rgb2yuv [RU_IDX ], gu = rgb2yuv [GU_IDX ], bu = rgb2yuv [BU_IDX ];
1134
+ int32_t rv = rgb2yuv [RV_IDX ], gv = rgb2yuv [GV_IDX ], bv = rgb2yuv [BV_IDX ];
1135
+ int i ;
1136
+ for (i = 0 ; i < width ; i ++ ) {
1137
+ int r = (lrintf (av_clipf (65535.0f * rdpx (src [i * 8 + 0 ]), 0.0f , 65535.0f )) +
1138
+ lrintf (av_clipf (65535.0f * rdpx (src [i * 8 + 4 ]), 0.0f , 65535.0f ))) >> 1 ;
1139
+ int g = (lrintf (av_clipf (65535.0f * rdpx (src [i * 8 + 1 ]), 0.0f , 65535.0f )) +
1140
+ lrintf (av_clipf (65535.0f * rdpx (src [i * 8 + 5 ]), 0.0f , 65535.0f ))) >> 1 ;
1141
+ int b = (lrintf (av_clipf (65535.0f * rdpx (src [i * 8 + 2 ]), 0.0f , 65535.0f )) +
1142
+ lrintf (av_clipf (65535.0f * rdpx (src [i * 8 + 6 ]), 0.0f , 65535.0f ))) >> 1 ;
1143
+
1144
+ dstU [i ] = (ru * r + gu * g + bu * b + (0x10001 <<(RGB2YUV_SHIFT - 1 ))) >> RGB2YUV_SHIFT ;
1145
+ dstV [i ] = (rv * r + gv * g + bv * b + (0x10001 <<(RGB2YUV_SHIFT - 1 ))) >> RGB2YUV_SHIFT ;
1146
+ }
1147
+ }
1148
+
1149
+ static av_always_inline void rgbaf16ToUV_endian (uint16_t * dstU , uint16_t * dstV , int is_be ,
1150
+ const uint16_t * src , int width ,
1151
+ int32_t * rgb2yuv , Half2FloatTables * h2f_tbl )
1152
+ {
1153
+ int32_t ru = rgb2yuv [RU_IDX ], gu = rgb2yuv [GU_IDX ], bu = rgb2yuv [BU_IDX ];
1154
+ int32_t rv = rgb2yuv [RV_IDX ], gv = rgb2yuv [GV_IDX ], bv = rgb2yuv [BV_IDX ];
1155
+ int i ;
1156
+ for (i = 0 ; i < width ; i ++ ) {
1157
+ int r = lrintf (av_clipf (65535.0f * rdpx (src [i * 4 + 0 ]), 0.0f , 65535.0f ));
1158
+ int g = lrintf (av_clipf (65535.0f * rdpx (src [i * 4 + 1 ]), 0.0f , 65535.0f ));
1159
+ int b = lrintf (av_clipf (65535.0f * rdpx (src [i * 4 + 2 ]), 0.0f , 65535.0f ));
1160
+
1161
+ dstU [i ] = (ru * r + gu * g + bu * b + (0x10001 <<(RGB2YUV_SHIFT - 1 ))) >> RGB2YUV_SHIFT ;
1162
+ dstV [i ] = (rv * r + gv * g + bv * b + (0x10001 <<(RGB2YUV_SHIFT - 1 ))) >> RGB2YUV_SHIFT ;
1163
+ }
1164
+ }
1165
+
1166
+ static av_always_inline void rgbaf16ToY_endian (uint16_t * dst , const uint16_t * src , int is_be ,
1167
+ int width , int32_t * rgb2yuv , Half2FloatTables * h2f_tbl )
1168
+ {
1169
+ int32_t ry = rgb2yuv [RY_IDX ], gy = rgb2yuv [GY_IDX ], by = rgb2yuv [BY_IDX ];
1170
+ int i ;
1171
+ for (i = 0 ; i < width ; i ++ ) {
1172
+ int r = lrintf (av_clipf (65535.0f * rdpx (src [i * 4 + 0 ]), 0.0f , 65535.0f ));
1173
+ int g = lrintf (av_clipf (65535.0f * rdpx (src [i * 4 + 1 ]), 0.0f , 65535.0f ));
1174
+ int b = lrintf (av_clipf (65535.0f * rdpx (src [i * 4 + 2 ]), 0.0f , 65535.0f ));
1175
+
1176
+ dst [i ] = (ry * r + gy * g + by * b + (0x2001 <<(RGB2YUV_SHIFT - 1 ))) >> RGB2YUV_SHIFT ;
1177
+ }
1178
+ }
1179
+
1180
+ static av_always_inline void rgbaf16ToA_endian (uint16_t * dst , const uint16_t * src , int is_be ,
1181
+ int width , Half2FloatTables * h2f_tbl )
1182
+ {
1183
+ int i ;
1184
+ for (i = 0 ; i < width ; i ++ ) {
1185
+ dst [i ] = lrintf (av_clipf (65535.0f * rdpx (src [i * 4 + 3 ]), 0.0f , 65535.0f ));
1186
+ }
1187
+ }
1188
+
1189
+ #undef rdpx
1190
+
1191
+ #define rgbaf16_funcs_endian (endian_name , endian ) \
1192
+ static void rgbaf16##endian_name##ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused, \
1193
+ const uint8_t *src1, const uint8_t *src2, \
1194
+ int width, uint32_t *_rgb2yuv, void *opq) \
1195
+ { \
1196
+ const uint16_t *src = (const uint16_t*)src1; \
1197
+ uint16_t *dstU = (uint16_t*)_dstU; \
1198
+ uint16_t *dstV = (uint16_t*)_dstV; \
1199
+ int32_t *rgb2yuv = (int32_t*)_rgb2yuv; \
1200
+ av_assert1(src1==src2); \
1201
+ rgbaf16ToUV_half_endian(dstU, dstV, endian, src, width, rgb2yuv, opq); \
1202
+ } \
1203
+ static void rgbaf16##endian_name##ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused, \
1204
+ const uint8_t *src1, const uint8_t *src2, \
1205
+ int width, uint32_t *_rgb2yuv, void *opq) \
1206
+ { \
1207
+ const uint16_t *src = (const uint16_t*)src1; \
1208
+ uint16_t *dstU = (uint16_t*)_dstU; \
1209
+ uint16_t *dstV = (uint16_t*)_dstV; \
1210
+ int32_t *rgb2yuv = (int32_t*)_rgb2yuv; \
1211
+ av_assert1(src1==src2); \
1212
+ rgbaf16ToUV_endian(dstU, dstV, endian, src, width, rgb2yuv, opq); \
1213
+ } \
1214
+ static void rgbaf16##endian_name##ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0, \
1215
+ const uint8_t *unused1, int width, uint32_t *_rgb2yuv, void *opq) \
1216
+ { \
1217
+ const uint16_t *src = (const uint16_t*)_src; \
1218
+ uint16_t *dst = (uint16_t*)_dst; \
1219
+ int32_t *rgb2yuv = (int32_t*)_rgb2yuv; \
1220
+ rgbaf16ToY_endian(dst, src, endian, width, rgb2yuv, opq); \
1221
+ } \
1222
+ static void rgbaf16##endian_name##ToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0, \
1223
+ const uint8_t *unused1, int width, uint32_t *unused2, void *opq) \
1224
+ { \
1225
+ const uint16_t *src = (const uint16_t*)_src; \
1226
+ uint16_t *dst = (uint16_t*)_dst; \
1227
+ rgbaf16ToA_endian(dst, src, endian, width, opq); \
1228
+ }
1229
+
1230
+ rgbaf16_funcs_endian (le , 0 )
1231
+ rgbaf16_funcs_endian (be , 1 )
1232
+
1127
1233
av_cold void ff_sws_init_input_funcs (SwsContext * c )
1128
1234
{
1129
1235
enum AVPixelFormat srcFormat = c -> srcFormat ;
@@ -1388,6 +1494,12 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
1388
1494
case AV_PIX_FMT_X2BGR10LE :
1389
1495
c -> chrToYV12 = bgr30leToUV_half_c ;
1390
1496
break ;
1497
+ case AV_PIX_FMT_RGBAF16BE :
1498
+ c -> chrToYV12 = rgbaf16beToUV_half_c ;
1499
+ break ;
1500
+ case AV_PIX_FMT_RGBAF16LE :
1501
+ c -> chrToYV12 = rgbaf16leToUV_half_c ;
1502
+ break ;
1391
1503
}
1392
1504
} else {
1393
1505
switch (srcFormat ) {
@@ -1475,6 +1587,12 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
1475
1587
case AV_PIX_FMT_X2BGR10LE :
1476
1588
c -> chrToYV12 = bgr30leToUV_c ;
1477
1589
break ;
1590
+ case AV_PIX_FMT_RGBAF16BE :
1591
+ c -> chrToYV12 = rgbaf16beToUV_c ;
1592
+ break ;
1593
+ case AV_PIX_FMT_RGBAF16LE :
1594
+ c -> chrToYV12 = rgbaf16leToUV_c ;
1595
+ break ;
1478
1596
}
1479
1597
}
1480
1598
@@ -1763,6 +1881,12 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
1763
1881
case AV_PIX_FMT_X2BGR10LE :
1764
1882
c -> lumToYV12 = bgr30leToY_c ;
1765
1883
break ;
1884
+ case AV_PIX_FMT_RGBAF16BE :
1885
+ c -> lumToYV12 = rgbaf16beToY_c ;
1886
+ break ;
1887
+ case AV_PIX_FMT_RGBAF16LE :
1888
+ c -> lumToYV12 = rgbaf16leToY_c ;
1889
+ break ;
1766
1890
}
1767
1891
if (c -> needAlpha ) {
1768
1892
if (is16BPS (srcFormat ) || isNBPS (srcFormat )) {
@@ -1782,6 +1906,12 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
1782
1906
case AV_PIX_FMT_ARGB :
1783
1907
c -> alpToYV12 = abgrToA_c ;
1784
1908
break ;
1909
+ case AV_PIX_FMT_RGBAF16BE :
1910
+ c -> alpToYV12 = rgbaf16beToA_c ;
1911
+ break ;
1912
+ case AV_PIX_FMT_RGBAF16LE :
1913
+ c -> alpToYV12 = rgbaf16leToA_c ;
1914
+ break ;
1785
1915
case AV_PIX_FMT_YA8 :
1786
1916
c -> alpToYV12 = uyvyToY_c ;
1787
1917
break ;
0 commit comments