166
166
[AV_PIX_FMT_RGB444BE] = { 1, 1 },
167
167
[AV_PIX_FMT_BGR444LE] = { 1, 1 },
168
168
[AV_PIX_FMT_BGR444BE] = { 1, 1 },
169
[AV_PIX_FMT_YA8] = { 1, 0 },
169
[AV_PIX_FMT_YA8] = { 1, 1 },
170
170
[AV_PIX_FMT_YA16BE] = { 1, 0 },
171
171
[AV_PIX_FMT_YA16LE] = { 1, 0 },
172
172
[AV_PIX_FMT_BGR48BE] = { 1, 1 },
854
855
if (need_reinit && (c->srcBpc == 8 || !isYUV(c->srcFormat)))
855
856
ff_sws_init_range_convert(c);
857
if ((isYUV(c->dstFormat) || isGray(c->dstFormat)) && (isYUV(c->srcFormat) || isGray(c->srcFormat)))
860
858
c->dstFormatBpp = av_get_bits_per_pixel(desc_dst);
861
859
c->srcFormatBpp = av_get_bits_per_pixel(desc_src);
861
if (c->cascaded_context[0])
862
return sws_setColorspaceDetails(c->cascaded_context[0],inv_table, srcRange,table, dstRange, brightness, contrast, saturation);
864
if ((isYUV(c->dstFormat) || isGray(c->dstFormat)) && (isYUV(c->srcFormat) || isGray(c->srcFormat))) {
865
if (!c->cascaded_context[0] &&
866
memcmp(c->dstColorspaceTable, c->srcColorspaceTable, sizeof(int) * 4) &&
867
c->srcW && c->srcH && c->dstW && c->dstH) {
868
enum AVPixelFormat tmp_format;
869
int tmp_width, tmp_height;
875
av_log(c, AV_LOG_VERBOSE, "YUV color matrix differs for YUV->YUV, using intermediate RGB to convert\n");
877
if (isNBPS(c->dstFormat) || is16BPS(c->dstFormat)) {
878
if (isALPHA(c->srcFormat) && isALPHA(c->dstFormat)) {
879
tmp_format = AV_PIX_FMT_BGRA64;
881
tmp_format = AV_PIX_FMT_BGR48;
884
if (isALPHA(c->srcFormat) && isALPHA(c->dstFormat)) {
885
tmp_format = AV_PIX_FMT_BGRA;
887
tmp_format = AV_PIX_FMT_BGR24;
891
if (srcW*srcH > dstW*dstH) {
899
ret = av_image_alloc(c->cascaded_tmp, c->cascaded_tmpStride,
900
tmp_width, tmp_height, tmp_format, 64);
904
c->cascaded_context[0] = sws_alloc_set_opts(srcW, srcH, c->srcFormat,
905
tmp_width, tmp_height, tmp_format,
907
if (!c->cascaded_context[0])
910
c->cascaded_context[0]->alphablend = c->alphablend;
911
ret = sws_init_context(c->cascaded_context[0], NULL , NULL);
914
//we set both src and dst depending on that the RGB side will be ignored
915
sws_setColorspaceDetails(c->cascaded_context[0], inv_table,
916
srcRange, table, dstRange,
917
brightness, contrast, saturation);
919
c->cascaded_context[1] = sws_getContext(tmp_width, tmp_height, tmp_format,
920
dstW, dstH, c->dstFormat,
921
c->flags, NULL, NULL, c->param);
922
if (!c->cascaded_context[1])
924
sws_setColorspaceDetails(c->cascaded_context[1], inv_table,
925
srcRange, table, dstRange,
926
0, 1 << 16, 1 << 16);
863
932
if (!isYUV(c->dstFormat) && !isGray(c->dstFormat)) {
864
933
ff_yuv2rgb_c_init_tables(c, inv_table, srcRange, brightness,
865
934
contrast, saturation);
1050
static enum AVPixelFormat alphaless_fmt(enum AVPixelFormat fmt)
1053
case AV_PIX_FMT_ARGB: return AV_PIX_FMT_RGB24;
1054
case AV_PIX_FMT_RGBA: return AV_PIX_FMT_RGB24;
1055
case AV_PIX_FMT_ABGR: return AV_PIX_FMT_BGR24;
1056
case AV_PIX_FMT_BGRA: return AV_PIX_FMT_BGR24;
1057
case AV_PIX_FMT_YA8: return AV_PIX_FMT_GRAY8;
1059
case AV_PIX_FMT_YUVA420P: return AV_PIX_FMT_YUV420P;
1060
case AV_PIX_FMT_YUVA422P: return AV_PIX_FMT_YUV422P;
1061
case AV_PIX_FMT_YUVA444P: return AV_PIX_FMT_YUV444P;
1063
case AV_PIX_FMT_GBRAP: return AV_PIX_FMT_GBRP;
1065
case AV_PIX_FMT_GBRAP16LE: return AV_PIX_FMT_GBRP16;
1066
case AV_PIX_FMT_GBRAP16BE: return AV_PIX_FMT_GBRP16;
1068
case AV_PIX_FMT_RGBA64LE: return AV_PIX_FMT_RGB48;
1069
case AV_PIX_FMT_RGBA64BE: return AV_PIX_FMT_RGB48;
1070
case AV_PIX_FMT_BGRA64LE: return AV_PIX_FMT_BGR48;
1071
case AV_PIX_FMT_BGRA64BE: return AV_PIX_FMT_BGR48;
1073
case AV_PIX_FMT_YA16BE: return AV_PIX_FMT_GRAY16;
1074
case AV_PIX_FMT_YA16LE: return AV_PIX_FMT_GRAY16;
1076
case AV_PIX_FMT_YUVA420P9BE: return AV_PIX_FMT_YUV420P9;
1077
case AV_PIX_FMT_YUVA422P9BE: return AV_PIX_FMT_YUV422P9;
1078
case AV_PIX_FMT_YUVA444P9BE: return AV_PIX_FMT_YUV444P9;
1079
case AV_PIX_FMT_YUVA420P9LE: return AV_PIX_FMT_YUV420P9;
1080
case AV_PIX_FMT_YUVA422P9LE: return AV_PIX_FMT_YUV422P9;
1081
case AV_PIX_FMT_YUVA444P9LE: return AV_PIX_FMT_YUV444P9;
1082
case AV_PIX_FMT_YUVA420P10BE: return AV_PIX_FMT_YUV420P10;
1083
case AV_PIX_FMT_YUVA422P10BE: return AV_PIX_FMT_YUV422P10;
1084
case AV_PIX_FMT_YUVA444P10BE: return AV_PIX_FMT_YUV444P10;
1085
case AV_PIX_FMT_YUVA420P10LE: return AV_PIX_FMT_YUV420P10;
1086
case AV_PIX_FMT_YUVA422P10LE: return AV_PIX_FMT_YUV422P10;
1087
case AV_PIX_FMT_YUVA444P10LE: return AV_PIX_FMT_YUV444P10;
1088
case AV_PIX_FMT_YUVA420P16BE: return AV_PIX_FMT_YUV420P16;
1089
case AV_PIX_FMT_YUVA422P16BE: return AV_PIX_FMT_YUV422P16;
1090
case AV_PIX_FMT_YUVA444P16BE: return AV_PIX_FMT_YUV444P16;
1091
case AV_PIX_FMT_YUVA420P16LE: return AV_PIX_FMT_YUV420P16;
1092
case AV_PIX_FMT_YUVA422P16LE: return AV_PIX_FMT_YUV422P16;
1093
case AV_PIX_FMT_YUVA444P16LE: return AV_PIX_FMT_YUV444P16;
1095
// case AV_PIX_FMT_AYUV64LE:
1096
// case AV_PIX_FMT_AYUV64BE:
1097
// case AV_PIX_FMT_PAL8:
1098
default: return AV_PIX_FMT_NONE;
981
1102
av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter,
982
1103
SwsFilter *dstFilter)
1157
1279
if (flags & SWS_FULL_CHR_H_INT &&
1158
1280
isAnyRGB(dstFormat) &&
1159
1281
!isPlanarRGB(dstFormat) &&
1282
dstFormat != AV_PIX_FMT_RGBA64LE &&
1283
dstFormat != AV_PIX_FMT_RGBA64BE &&
1284
dstFormat != AV_PIX_FMT_BGRA64LE &&
1285
dstFormat != AV_PIX_FMT_BGRA64BE &&
1286
dstFormat != AV_PIX_FMT_RGB48LE &&
1287
dstFormat != AV_PIX_FMT_RGB48BE &&
1288
dstFormat != AV_PIX_FMT_BGR48LE &&
1289
dstFormat != AV_PIX_FMT_BGR48BE &&
1160
1290
dstFormat != AV_PIX_FMT_RGBA &&
1161
1291
dstFormat != AV_PIX_FMT_ARGB &&
1162
1292
dstFormat != AV_PIX_FMT_BGRA &&
1472
if (CONFIG_SWSCALE_ALPHA && isALPHA(srcFormat) && !isALPHA(dstFormat)) {
1473
enum AVPixelFormat tmpFormat = alphaless_fmt(srcFormat);
1475
if (tmpFormat != AV_PIX_FMT_NONE && c->alphablend != SWS_ALPHA_BLEND_NONE)
1477
dstFormat != tmpFormat ||
1478
usesHFilter || usesVFilter ||
1479
c->srcRange != c->dstRange
1481
ret = av_image_alloc(c->cascaded_tmp, c->cascaded_tmpStride,
1482
srcW, srcH, tmpFormat, 64);
1486
c->cascaded_context[0] = sws_alloc_set_opts(srcW, srcH, srcFormat,
1487
srcW, srcH, tmpFormat,
1489
if (!c->cascaded_context[0])
1491
c->cascaded_context[0]->alphablend = c->alphablend;
1492
ret = sws_init_context(c->cascaded_context[0], NULL , NULL);
1496
c->cascaded_context[1] = sws_getContext(srcW, srcH, tmpFormat,
1497
dstW, dstH, dstFormat,
1498
flags, srcFilter, dstFilter, c->param);
1499
if (!c->cascaded_context[1])
1333
1505
#define USE_MMAP (HAVE_MMAP && HAVE_MPROTECT && defined MAP_ANONYMOUS)
1335
1507
/* precalculate horizontal scaler filter coefficients */
1576
1748
c->chrXInc, c->chrYInc);
1751
/* alpha blend special case, note this has been split via cascaded contexts if its scaled */
1752
if (unscaled && !usesHFilter && !usesVFilter &&
1753
c->alphablend != SWS_ALPHA_BLEND_NONE &&
1754
isALPHA(srcFormat) &&
1755
(c->srcRange == c->dstRange || isAnyRGB(dstFormat)) &&
1756
alphaless_fmt(srcFormat) == dstFormat
1758
c->swscale = ff_sws_alphablendaway;
1760
if (flags & SWS_PRINT_INFO)
1761
av_log(c, AV_LOG_INFO,
1762
"using alpha blendaway %s -> %s special converter\n",
1763
av_get_pix_fmt_name(srcFormat), av_get_pix_fmt_name(dstFormat));
1579
1767
/* unscaled special cases */
1580
1768
if (unscaled && !usesHFilter && !usesVFilter &&
1581
1769
(c->srcRange == c->dstRange || isAnyRGB(dstFormat))) {
1625
SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
1626
int dstW, int dstH, enum AVPixelFormat dstFormat,
1627
int flags, SwsFilter *srcFilter,
1628
SwsFilter *dstFilter, const double *param)
1813
SwsContext *sws_alloc_set_opts(int srcW, int srcH, enum AVPixelFormat srcFormat,
1814
int dstW, int dstH, enum AVPixelFormat dstFormat,
1815
int flags, const double *param)
1645
1832
c->param[1] = param[1];
1838
SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
1839
int dstW, int dstH, enum AVPixelFormat dstFormat,
1840
int flags, SwsFilter *srcFilter,
1841
SwsFilter *dstFilter, const double *param)
1845
c = sws_alloc_set_opts(srcW, srcH, srcFormat,
1846
dstW, dstH, dstFormat,
1648
1851
if (sws_init_context(c, srcFilter, dstFilter) < 0) {
1649
1852
sws_freeContext(c);
1859
static int isnan_vec(SwsVector *a)
1862
for (i=0; i<a->length; i++)
1863
if (isnan(a->coeff[i]))
1868
static void makenan_vec(SwsVector *a)
1871
for (i=0; i<a->length; i++)
1656
1875
SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur,
1657
1876
float lumaSharpen, float chromaSharpen,
1658
1877
float chromaHShift, float chromaVShift,