24#define _DEFAULT_SOURCE
77 int flags,
const double *param)
98 int filterSize, int16_t *
filter,
107 if ((
c->srcBpc == 8) && (
c->dstBpc <= 14)) {
108 int16_t *filterCopy =
NULL;
109 if (filterSize > 4) {
113 memcpy(filterCopy,
filter, dstW * filterSize *
sizeof(int16_t));
117 for (
i = 0;
i + 16 <= dstW;
i += 16) {
118 FFSWAP(
int, filterPos[
i + 2], filterPos[
i + 4]);
119 FFSWAP(
int, filterPos[
i + 3], filterPos[
i + 5]);
120 FFSWAP(
int, filterPos[
i + 10], filterPos[
i + 12]);
121 FFSWAP(
int, filterPos[
i + 11], filterPos[
i + 13]);
123 if (filterSize > 4) {
125 for (
i = 0;
i + 16 <= dstW;
i += 16) {
127 for (k = 0; k + 4 <= filterSize; k += 4) {
128 for (j = 0; j < 16; ++j) {
129 int from = (
i + j) * filterSize + k;
130 int to =
i * filterSize + j * 4 + k * 16;
131 memcpy(&
filter[
to], &filterCopy[
from], 4 *
sizeof(int16_t));
136 for (;
i < dstW;
i += 4) {
138 int rem = dstW -
i >= 4 ? 4 : dstW -
i;
139 for (k = 0; k + 4 <= filterSize; k += 4) {
140 for (j = 0; j < rem; ++j) {
141 int from = (
i + j) * filterSize + k;
142 int to =
i * filterSize + j * 4 + k * 4;
143 memcpy(&
filter[
to], &filterCopy[
from], 4 *
sizeof(int16_t));
159 return ((d * dist +
c) * dist +
b) * dist +
a;
162 b + 2.0 *
c + 3.0 * d,
164 -
b - 3.0 *
c - 6.0 * d,
170 if (
pos == -1 ||
pos <= -513) {
171 pos = (128 << chr_subsample) - 128;
174 return pos >> chr_subsample;
191 {
SWS_POINT,
"nearest neighbor / point", -1 },
194 {
SWS_X,
"experimental", 8 },
198 int *outFilterSize,
int xInc,
int srcW,
199 int dstW,
int filterAlign,
int one,
219 if (
FFABS(xInc - 0x10000) < 10 && srcPos == dstPos) {
225 for (
i = 0;
i < dstW;
i++) {
236 xDstInSrc = ((dstPos*(
int64_t)xInc)>>8) - ((srcPos*0x8000LL)>>7);
237 for (
i = 0;
i < dstW;
i++) {
238 int xx = (xDstInSrc - ((filterSize - 1) << 15) + (1 << 15)) >> 16;
240 (*filterPos)[
i] = xx;
244 }
else if ((xInc <= (1 << 16) && (scaler ==
SWS_AREA)) ||
252 xDstInSrc = ((dstPos*(
int64_t)xInc)>>8) - ((srcPos*0x8000LL)>>7);
253 for (
i = 0;
i < dstW;
i++) {
254 int xx = (xDstInSrc - ((filterSize - 1) << 15) + (1 << 15)) >> 16;
257 (*filterPos)[
i] = xx;
259 for (j = 0; j < filterSize; j++) {
282 if (sizeFactor > 50) {
288 filterSize = 1 + sizeFactor;
290 filterSize = 1 + (sizeFactor * srcW + dstW - 1) / dstW;
292 filterSize =
FFMIN(filterSize, srcW - 2);
293 filterSize =
FFMAX(filterSize, 1);
298 xDstInSrc = ((dstPos*(
int64_t)xInc)>>7) - ((srcPos*0x10000LL)>>7);
299 for (
i = 0;
i < dstW;
i++) {
300 int xx = (xDstInSrc - (filterSize - 2) * (1LL<<16)) / (1 << 17);
302 (*filterPos)[
i] = xx;
303 for (j = 0; j < filterSize; j++) {
310 floatd = d * (1.0 / (1 << 30));
316 if (d >= 1LL << 31) {
323 coeff = (12 * (1 << 24) - 9 *
B - 6 *
C) * ddd +
324 (-18 * (1 << 24) + 12 *
B + 6 *
C) * dd +
325 (6 * (1 << 24) - 2 *
B) * (1 << 30);
328 (6 *
B + 30 *
C) * dd +
329 (-12 *
B - 48 *
C) * d +
330 (8 *
B + 24 *
C) * (1 << 30);
332 coeff /= (1LL<<54)/fone;
333 }
else if (scaler ==
SWS_X) {
338 c = cos(floatd *
M_PI);
345 coeff = (
c * 0.5 + 0.5) * fone;
348 if (d2 * xInc < -(1LL << (29 + 16)))
349 coeff = 1.0 * (1LL << (30 + 16));
350 else if (d2 * xInc < (1LL << (29 + 16)))
351 coeff = -d2 * xInc + (1LL << (29 + 16));
354 coeff *= fone >> (30 + 16);
357 coeff =
exp2(-p * floatd * floatd) * fone;
359 coeff = (d ? sin(floatd *
M_PI) / (floatd *
M_PI) : 1.0) * fone;
363 (floatd * floatd *
M_PI *
M_PI / p) : 1.0) * fone;
367 coeff = (1 << 30) - d;
372 double p = -2.196152422706632;
381 xDstInSrc += 2LL * xInc;
389 filter2Size = filterSize;
391 filter2Size += srcFilter->
length - 1;
393 filter2Size += dstFilter->
length - 1;
395 filter2 =
av_calloc(dstW, filter2Size *
sizeof(*filter2));
398 for (
i = 0;
i < dstW;
i++) {
402 for (k = 0; k < srcFilter->
length; k++) {
403 for (j = 0; j < filterSize; j++)
404 filter2[
i * filter2Size + k + j] +=
408 for (j = 0; j < filterSize; j++)
409 filter2[
i * filter2Size + j] =
filter[
i * filterSize + j];
413 (*filterPos)[
i] += (filterSize - 1) / 2 - (filter2Size - 1) / 2;
420 for (
i = dstW - 1;
i >= 0;
i--) {
421 int min = filter2Size;
426 for (j = 0; j < filter2Size; j++) {
428 cutOff +=
FFABS(filter2[
i * filter2Size]);
435 if (
i < dstW - 1 && (*filterPos)[
i] >= (*filterPos)[
i + 1])
439 for (k = 1; k < filter2Size; k++)
440 filter2[
i * filter2Size + k - 1] = filter2[
i * filter2Size + k];
441 filter2[
i * filter2Size + k - 1] = 0;
447 for (j = filter2Size - 1; j > 0; j--) {
448 cutOff +=
FFABS(filter2[
i * filter2Size + j]);
455 if (
min > minFilterSize)
461 if (minFilterSize < 5)
467 if (minFilterSize < 3)
473 if (minFilterSize == 1 && filterAlign == 2)
478 int reNum = minFilterSize & (0x07);
480 if (minFilterSize < 5)
487 filterSize = (minFilterSize + (filterAlign - 1)) & (~(filterAlign - 1));
497 *outFilterSize = filterSize;
501 "SwScaler: reducing / aligning filtersize %d -> %d\n",
502 filter2Size, filterSize);
504 for (
i = 0;
i < dstW;
i++) {
507 for (j = 0; j < filterSize; j++) {
508 if (j >= filter2Size)
509 filter[
i * filterSize + j] = 0;
511 filter[
i * filterSize + j] = filter2[
i * filter2Size + j];
513 filter[
i * filterSize + j] = 0;
520 for (
i = 0;
i < dstW;
i++) {
522 if ((*filterPos)[
i] < 0) {
524 for (j = 1; j < filterSize; j++) {
527 filter[
i * filterSize + j] = 0;
532 if ((*filterPos)[
i] + filterSize > srcW) {
533 int shift = (*filterPos)[
i] +
FFMIN(filterSize - srcW, 0);
536 for (j = filterSize - 1; j >= 0; j--) {
537 if ((*filterPos)[
i] + j >= srcW) {
538 acc +=
filter[
i * filterSize + j];
539 filter[
i * filterSize + j] = 0;
542 for (j = filterSize - 1; j >= 0; j--) {
544 filter[
i * filterSize + j] = 0;
551 filter[
i * filterSize + srcW - 1 - (*filterPos)[
i]] += acc;
555 if ((*filterPos)[
i] + filterSize > srcW) {
556 for (j = 0; j < filterSize; j++) {
564 *outFilter =
av_calloc(dstW + 3, *outFilterSize *
sizeof(**outFilter));
569 for (
i = 0;
i < dstW;
i++) {
574 for (j = 0; j < filterSize; j++) {
575 sum +=
filter[
i * filterSize + j];
577 sum = (sum + one / 2) / one;
582 for (j = 0; j < *outFilterSize; j++) {
585 (*outFilter)[
i * (*outFilterSize) + j] = intV;
586 error = v - intV * sum;
590 (*filterPos)[dstW + 0] =
591 (*filterPos)[dstW + 1] =
592 (*filterPos)[dstW + 2] = (*filterPos)[dstW - 1];
594 for (
i = 0;
i < *outFilterSize;
i++) {
595 int k = (dstW - 1) * (*outFilterSize) +
i;
596 (*outFilter)[k + 1 * (*outFilterSize)] =
597 (*outFilter)[k + 2 * (*outFilterSize)] =
598 (*outFilter)[k + 3 * (*outFilterSize)] = (*outFilter)[k];
623 uint8_t *p = (uint8_t*)
c->input_rgb2yuv_table;
625 static const int8_t
map[] = {
650 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
651 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
652 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
653 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
654 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
655 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
656 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
657 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
723 for (
int i = 0;
i < 4096;
i++) {
729 for (
int i = 0;
i < 65536;
i++) {
737 static const int16_t xyz2rgb_matrix[3][3] = {
738 {13270, -6295, -2041},
740 { 228, -835, 4329} };
741 static const int16_t rgb2xyz_matrix[3][3] = {
746 if (
c->xyz2rgb.gamma.in)
749 memcpy(
c->xyz2rgb.mat, xyz2rgb_matrix,
sizeof(
c->xyz2rgb.mat));
750 memcpy(
c->rgb2xyz.mat, rgb2xyz_matrix,
sizeof(
c->rgb2xyz.mat));
753 c->xyz2rgb.gamma.in =
av_malloc(
sizeof(uint16_t) * 2 * (4096 + 65536));
754 if (!
c->xyz2rgb.gamma.in)
756 c->rgb2xyz.gamma.in =
c->xyz2rgb.gamma.in + 4096;
757 c->xyz2rgb.gamma.out =
c->rgb2xyz.gamma.in + 4096;
758 c->rgb2xyz.gamma.out =
c->xyz2rgb.gamma.out + 65536;
760 c->xyz2rgb.gamma.out,
c->rgb2xyz.gamma.in);
838 if (
c->srcXYZ ||
c->dstXYZ)
850 int srcRange,
const int table[4],
int dstRange,
856 int ret, need_reinit = 0;
858 if (
c->nb_slice_ctx) {
860 for (
int i = 0;
i <
c->nb_slice_ctx;
i++) {
862 srcRange,
table, dstRange,
884 c->brightness != brightness ||
885 c->contrast != contrast ||
887 memcmp(
c->srcColorspaceTable, inv_table,
sizeof(
int) * 4) ||
888 memcmp(
c->dstColorspaceTable,
table,
sizeof(
int) * 4)
892 memmove(
c->srcColorspaceTable, inv_table,
sizeof(
int) * 4);
893 memmove(
c->dstColorspaceTable,
table,
sizeof(
int) * 4);
897 c->brightness = brightness;
898 c->contrast = contrast;
909 if (
c->cascaded_context[
c->cascaded_mainindex])
916 if (!
c->cascaded_context[0] &&
917 memcmp(
c->dstColorspaceTable,
c->srcColorspaceTable,
sizeof(
int) * 4) &&
920 int tmp_width, tmp_height;
921 int srcW = sws->
src_w;
922 int srcH = sws->
src_h;
923 int dstW = sws->
dst_w;
924 int dstH = sws->
dst_h;
926 av_log(
c,
AV_LOG_VERBOSE,
"YUV color matrix differs for YUV->YUV, using intermediate RGB to convert\n");
942 if (srcW*srcH > dstW*dstH) {
951 tmp_width, tmp_height, tmp_format, 64);
956 tmp_width, tmp_height, tmp_format,
958 if (!
c->cascaded_context[0])
967 srcRange,
table, dstRange,
970 c->cascaded_context[1] =
alloc_set_opts(tmp_width, tmp_height, tmp_format,
973 if (!
c->cascaded_context[1])
975 c->cascaded_context[1]->src_range = srcRange;
976 c->cascaded_context[1]->dst_range = dstRange;
981 srcRange,
table, dstRange,
982 0, 1 << 16, 1 << 16);
986 if (
c->cascaded_context[0] && memcmp(
c->dstColorspaceTable,
c->srcColorspaceTable,
sizeof(
int) * 4))
1008 int *srcRange,
int **
table,
int *dstRange,
1009 int *brightness,
int *contrast,
int *
saturation)
1015 if (
c->nb_slice_ctx) {
1017 table, dstRange, brightness, contrast,
1021 *inv_table =
c->srcColorspaceTable;
1022 *
table =
c->dstColorspaceTable;
1025 *brightness =
c->brightness;
1026 *contrast =
c->contrast;
1050 tbl = (uint16_t*)
av_malloc(
sizeof(uint16_t) * 1 << 16);
1054 for (
i = 0;
i < 65536; ++
i) {
1055 tbl[
i] = pow(
i / 65535.0, e) * 65535.0;
1141 int usesVFilter, usesHFilter;
1145 int srcW = sws->
src_w;
1146 int srcH = sws->
src_h;
1147 int dstW = sws->
dst_w;
1148 int dstH = sws->
dst_h;
1149 int dst_stride =
FFALIGN(dstW *
sizeof(int16_t) + 66, 16);
1156 static const float float_mult = 1.0f / 255.0f;
1162 unscaled = (srcW == dstW && srcH == dstH);
1164 if (!
c->contrast && !
c->saturation && !
c->dstFormatBpp)
1210 if (dstW < srcW && dstH < srcH)
1212 else if (dstW > srcW && dstH > srcH)
1218 }
else if (
i & (
i - 1)) {
1220 "Exactly one scaler algorithm must be chosen, got %X\n",
i);
1225 if (srcW < 8 || dstW <= 8) {
1240 if (srcW < 1 || srcH < 1 || dstW < 1 || dstH < 1) {
1244 srcW, srcH, dstW, dstH);
1249 dstFilter = &dummyFilter;
1251 srcFilter = &dummyFilter;
1257 c->vRounder = 4 * 0x0001000100010001ULL;
1259 usesVFilter = (srcFilter->
lumV && srcFilter->
lumV->
length > 1) ||
1263 usesHFilter = (srcFilter->
lumH && srcFilter->
lumH->
length > 1) ||
1271 c->dst_slice_align = 1 <<
c->chrDstVSubSample;
1280 if (
c->chrSrcHSubSample == 0
1281 &&
c->chrSrcVSubSample == 0
1285 av_log(
c,
AV_LOG_DEBUG,
"Forcing full internal H chroma due to input having non subsampled chroma\n");
1305 "Desired dithering only supported in full chroma interpolation for destination format '%s'\n",
1314 "Ordered dither is not supported in full chroma interpolation for destination format '%s'\n",
1323 "%s output is not supported with half chroma resolution, switching to full\n",
1357 "full chroma interpolation for destination format '%s' not yet implemented\n",
1363 c->chrDstHSubSample = 1;
1368 c->chrSrcVSubSample +=
c->vChrDrop;
1391 ((dstW >>
c->chrDstHSubSample) <= (srcW >> 1) ||
1393 c->chrSrcHSubSample = 1;
1412 if (
c->dstBpc == 16)
1416 c->canMMXEXTBeUsed = dstW >= srcW && (dstW & 31) == 0 &&
1417 c->chrDstW >=
c->chrSrcW &&
1419 if (!
c->canMMXEXTBeUsed && dstW >= srcW &&
c->chrDstW >=
c->chrSrcW && (srcW & 15) == 0
1424 "output width is not a multiple of 32 -> no MMXEXT scaler\n");
1427 c->canMMXEXTBeUsed = 0;
1429 c->canMMXEXTBeUsed = 0;
1431 int64_t chrXInc = (((
int64_t)
c->chrSrcW << 16) + (
c->chrDstW >> 1)) /
c->chrDstW;
1432 int64_t chrYInc = (((
int64_t)
c->chrSrcH << 16) + (
c->chrDstH >> 1)) /
c->chrDstH;
1442 if (
c->canMMXEXTBeUsed) {
1448 lumXInc = ((
int64_t)(srcW - 2) << 16) / (dstW - 2) - 20;
1449 chrXInc = ((
int64_t)(
c->chrSrcW - 2) << 16) / (
c->chrDstW - 2) - 20;
1452 if (chrXInc < 10 || chrXInc > INT_MAX ||
1453 chrYInc < 10 || chrYInc > INT_MAX ||
1454 lumXInc < 10 || lumXInc > INT_MAX ||
1455 lumYInc < 10 || lumYInc > INT_MAX)
1458 c->lumXInc = lumXInc;
1459 c->lumYInc = lumYInc;
1460 c->chrXInc = chrXInc;
1461 c->chrYInc = chrYInc;
1465 c->gamma_value = 2.2;
1468 if (!unscaled && sws->
gamma_flag && (srcFormat != tmpFmt || dstFormat != tmpFmt)) {
1470 c->cascaded_context[0] =
NULL;
1473 srcW, srcH, tmpFmt, 64);
1481 if (!
c->cascaded_context[0]) {
1487 flags, srcFilter, dstFilter,
1490 if (!
c->cascaded_context[1])
1494 c2->is_internal_gamma = 1;
1497 if (!
c2->gamma || !
c2->inv_gamma)
1506 c->cascaded_context[1] =
NULL;
1510 c->cascaded_context[2] =
NULL;
1511 if (dstFormat != tmpFmt) {
1513 dstW, dstH, tmpFmt, 64);
1518 dstW, dstH, dstFormat,
1521 if (!
c->cascaded_context[2])
1534 srcW, srcH, tmpFormat, 64);
1539 srcW, srcH, tmpFormat,
1542 if (!
c->cascaded_context[0])
1546 dstW, dstH, dstFormat,
1549 if (!
c->cascaded_context[1])
1556 for (
i = 0;
i < 256; ++
i){
1557 c->uint2float_lut[
i] = (
float)
i * float_mult;
1563 (!unscaled || unscaled && dstFormat != srcFormat && (srcFormat !=
AV_PIX_FMT_GRAYF32 ||
1568 if (CONFIG_SWSCALE_ALPHA &&
isALPHA(srcFormat) && !
isALPHA(dstFormat)) {
1573 dstFormat != tmpFormat ||
1574 usesHFilter || usesVFilter ||
1577 c->cascaded_mainindex = 1;
1579 srcW, srcH, tmpFormat, 64);
1584 srcW, srcH, tmpFormat,
1586 if (!
c->cascaded_context[0])
1588 c->cascaded_context[0]->alpha_blend = sws->
alpha_blend;
1594 dstW, dstH, dstFormat,
1596 if (!
c->cascaded_context[1])
1599 c->cascaded_context[1]->src_range = sws->
src_range;
1600 c->cascaded_context[1]->dst_range = sws->
dst_range;
1611 if (unscaled && !usesHFilter && !usesVFilter &&
1621 "using alpha blendaway %s -> %s special converter\n",
1627 if (unscaled && !usesHFilter && !usesVFilter &&
1633 if (
c->convert_unscaled) {
1636 "using unscaled %s -> %s special converter\n",
1644#if HAVE_MMXEXT_INLINE
1654 if (!
c->lumMmxextFilterCode || !
c->chrMmxextFilterCode) {
1666 c->hLumFilter, (uint32_t*)
c->hLumFilterPos, 8);
1668 c->hChrFilter, (uint32_t*)
c->hChrFilterPos, 4);
1684 if ((ret =
initFilter(&
c->hLumFilter, &
c->hLumFilterPos,
1685 &
c->hLumFilterSize,
c->lumXInc,
1686 srcW, dstW, filterAlign, 1 << 14,
1695 if ((ret =
initFilter(&
c->hChrFilter, &
c->hChrFilterPos,
1696 &
c->hChrFilterSize,
c->chrXInc,
1697 c->chrSrcW,
c->chrDstW, filterAlign, 1 << 14,
1715 ret =
initFilter(&
c->vLumFilter, &
c->vLumFilterPos, &
c->vLumFilterSize,
1716 c->lumYInc, srcH, dstH, filterAlign, (1 << 12),
1723 if (ret < 0 && !usecascade)
1725 if ((ret =
initFilter(&
c->vChrFilter, &
c->vChrFilterPos, &
c->vChrFilterSize,
1726 c->chrYInc,
c->chrSrcH,
c->chrDstH,
1727 filterAlign, (1 << 12),
1747 for (
i = 0;
i < 4;
i++)
1754 c->uv_off = (dst_stride>>1) + 64 / (
c->dstBpc &~ 7);
1755 c->uv_offx2 = dst_stride + 16;
1760 const char *scaler =
NULL, *cpucaps;
1769 scaler =
"ehh flags invalid?!";
1784 cpucaps =
"AltiVec";
1792 "lum srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n",
1795 "chr srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n",
1796 c->chrSrcW,
c->chrSrcH,
c->chrDstW,
c->chrDstH,
1797 c->chrXInc,
c->chrYInc);
1807 int tmpW = sqrt(srcW * (
int64_t)dstW);
1808 int tmpH = sqrt(srcH * (
int64_t)dstH);
1814 if (srcW*(
int64_t)srcH <= 4LL*dstW*dstH)
1818 tmpW, tmpH, tmpFormat, 64);
1823 tmpW, tmpH, tmpFormat,
1826 if (!
c->cascaded_context[0])
1830 dstW, dstH, dstFormat,
1833 if (!
c->cascaded_context[1])
1879 "Error-diffusion dither is in use, scaling will be single-threaded.");
1895 c->is_legacy_init = 1;
1898 if (!
c->frame_src || !
c->frame_dst)
1914 if (ret < 0 || sws->threads > 1)
1925 SwsFilter *dstFilter,
const double *param)
1930 dstW, dstH, dstFormat,
1946 for (
i=0;
i<
a->length;
i++)
1955 for (
i=0;
i<
a->length;
i++)
1963 if(length <= 0 || length > INT_MAX/
sizeof(
double))
1978 const int length = (int)(variance *
quality + 0.5) | 1;
1980 double middle = (length - 1) * 0.5;
1983 if(variance < 0 ||
quality < 0)
1991 for (
i = 0;
i < length;
i++) {
1992 double dist =
i - middle;
1993 vec->
coeff[
i] =
exp(-dist * dist / (2 * variance * variance)) /
1994 sqrt(2 * variance *
M_PI);
2015 for (
i = 0;
i < length;
i++)
2036 for (
i = 0;
i <
a->length;
i++)
2046 for (
i = 0;
i <
a->length;
i++)
2047 a->coeff[
i] *= scalar;
2057 int length =
FFMAX(
a->length,
b->length);
2064 for (
i = 0;
i <
a->length;
i++)
2065 vec->
coeff[
i + (length - 1) / 2 - (
a->length - 1) / 2] +=
a->coeff[
i];
2066 for (
i = 0;
i <
b->length;
i++)
2067 vec->
coeff[
i + (length - 1) / 2 - (
b->length - 1) / 2] +=
b->coeff[
i];
2082 for (
i = 0;
i <
a->length;
i++) {
2083 vec->
coeff[
i + (length - 1) / 2 -
2084 (
a->length - 1) / 2 -
shift] =
a->coeff[
i];
2099 a->coeff = shifted->
coeff;
2130 for (
i = 0;
i <
a->length;
i++)
2131 if (
a->coeff[
i] >
max)
2134 for (
i = 0;
i <
a->length;
i++)
2135 if (
a->coeff[
i] <
min)
2140 for (
i = 0;
i <
a->length;
i++) {
2141 int x = (int)((
a->coeff[
i] -
min) * 60.0 /
range + 0.5);
2142 av_log(log_ctx, log_level,
"%1.3f ",
a->coeff[
i]);
2144 av_log(log_ctx, log_level,
" ");
2145 av_log(log_ctx, log_level,
"|\n");
2171 float lumaSharpen,
float chromaSharpen,
2172 float chromaHShift,
float chromaVShift,
2179 if (lumaGBlur != 0.0) {
2187 if (chromaGBlur != 0.0) {
2198 if (chromaSharpen != 0.0) {
2209 if (lumaSharpen != 0.0) {
2220 if (chromaHShift != 0.0)
2223 if (chromaVShift != 0.0)
2266 for (
i = 0;
i <
c->nb_slice_ctx;
i++)
2272 for (
i = 0;
i < 4;
i++)
2296 c->lumMmxextFilterCode =
NULL;
2297 c->chrMmxextFilterCode =
NULL;
2306 memset(
c->cascaded_context, 0,
sizeof(
c->cascaded_context));
2340 const double *param)
2347 param = default_param;
2349 if (prev && (prev->
src_w == srcW &&
2350 prev->
src_h == srcH &&
2352 prev->
dst_w == dstW &&
2353 prev->
dst_h == dstH &&
2393 for (idx = 0; idx < rl->
nb_ranges; idx++)
2400 if (prev->
start + prev->
len > start)
2403 if (idx < rl->nb_ranges) {
2433 if (idx < rl->nb_ranges - 1) {
2448 int (*
func)(
void *priv,
int jobnr,
int threadnr,
int nb_jobs,
int nb_threads),
2449 int nb_threads,
int nb_jobs)
2455 for (
int i = 0;
i < nb_jobs;
i++) {
2456 int ret =
func(priv,
i, 0, nb_jobs, 1);
2461 }
else if (ret < 0) {
static const char *const format[]
int ff_sws_alphablendaway(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
static AVFormatContext * ctx
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
static IPT saturation(const CmsCtx *ctx, IPT ipt)
#define AV_CEIL_RSHIFT(a, b)
#define ROUNDED_DIV(a, b)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Colorspace value utility functions for libavutil.
static __device__ float ceil(float a)
#define atomic_init(obj, value)
void ff_sws_graph_free(SwsGraph **pgraph)
Uninitialize any state associate with this filter graph and free it.
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
int av_image_alloc(uint8_t *pointers[4], int linesizes[4], int w, int h, enum AVPixelFormat pix_fmt, int align)
Allocate an image with size w and h and pixel format pix_fmt, and fill pointers and linesizes accordi...
void sws_freeFilter(SwsFilter *filter)
int sws_getColorspaceDetails(SwsContext *sws, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation)
av_cold int sws_init_context(SwsContext *sws, SwsFilter *srcFilter, SwsFilter *dstFilter)
Initialize the swscaler context sws_context.
#define SWS_SRC_V_CHR_DROP_MASK
void sws_freeVec(SwsVector *a)
SwsFilter * sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, float lumaSharpen, float chromaSharpen, float chromaHShift, float chromaVShift, int verbose)
int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt)
SwsContext * sws_alloc_context(void)
Allocate an empty SwsContext and set its fields to default values.
void sws_free_context(SwsContext **pctx)
Free the context and everything associated with it, and write NULL to the provided pointer.
#define SWS_SRC_V_CHR_DROP_SHIFT
SwsVector * sws_allocVec(int length)
Allocate and return an uninitialized vector with length coefficients.
SwsVector * sws_getGaussianVec(double variance, double quality)
Return a normalized Gaussian curve used to filter stuff quality = 3 is high quality,...
SwsContext * sws_getCachedContext(SwsContext *prev, int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW, int dstH, enum AVPixelFormat dstFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param)
Check if context can be reused, otherwise reallocate a new one.
void sws_normalizeVec(SwsVector *a, double height)
Scale all the coefficients of a so that their sum equals height.
#define SWS_MAX_REDUCE_CUTOFF
Filter kernel cut-off value.
SwsContext * sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW, int dstH, enum AVPixelFormat dstFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param)
Allocate and return an SwsContext.
#define SWS_PARAM_DEFAULT
void sws_freeContext(SwsContext *sws)
Free the swscaler context swsContext.
void sws_scaleVec(SwsVector *a, double scalar)
Scale all the coefficients of a by the scalar value.
int sws_setColorspaceDetails(SwsContext *sws, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation)
@ SWS_SCALE_SPLINE
unwindowned natural cubic spline
@ SWS_SCALE_POINT
nearest neighbor (point sampling)
@ SWS_SCALE_LANCZOS
3-tap sinc/sinc
@ SWS_SCALE_BILINEAR
bilinear filtering
@ SWS_SCALE_GAUSSIAN
2-tap gaussian approximation
@ SWS_SCALE_BICUBIC
2-tap cubic BC-spline
@ SWS_SCALE_AREA
area averaging
@ SWS_SCALE_SINC
unwindowed sinc
@ SWS_PRINT_INFO
Emit verbose log of scaling parameters.
@ SWS_SPLINE
unwindowed natural cubic spline
@ SWS_BICUBIC
2-tap cubic B-spline
@ SWS_BICUBLIN
bicubic luma, bilinear chroma
@ SWS_ERROR_DIFFUSION
Set SwsContext.dither instead.
@ SWS_BILINEAR
bilinear filtering
@ SWS_UNSTABLE
Allow/prefer using experimental new code paths.
@ SWS_FULL_CHR_H_INP
Perform full chroma interpolation when downscaling RGB sources.
@ SWS_SINC
unwindowed sinc
@ SWS_LANCZOS
3-tap sinc/sinc
@ SWS_GAUSS
gaussian approximation
@ SWS_FAST_BILINEAR
Scaler selection options.
@ SWS_ACCURATE_RND
Force bit-exact output.
@ SWS_POINT
nearest neighbor
@ SWS_FULL_CHR_H_INT
Perform full chroma upsampling when upscaling to RGB.
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
int av_opt_copy(void *dst, const void *src)
Copy options from src object into dest object.
const VDPAUPixFmtMap * map
void * ff_sws_jit_alloc(size_t size)
void ff_sws_jit_free(void *ptr, size_t size)
int ff_sws_jit_protect(void *ptr, size_t size)
static int shift(int a, int b)
int(* func)(AVBPrint *dst, const char *in, const char *arg)
av_cold void ff_frame_pool_uninit(FFFramePool *pool)
Deallocate the frame pool.
Macro definitions for various function/variable attributes.
static atomic_int cpu_flags
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
#define AV_CPU_FLAG_SLOW_GATHER
CPU has slow gathers.
#define AV_CPU_FLAG_MMX
standard MMX
#define FF_ALLOC_TYPED_ARRAY(p, nelem)
#define FF_ALLOCZ_TYPED_ARRAY(p, nelem)
#define PPC_ALTIVEC(flags)
static int ff_thread_once(char *control, void(*routine)(void))
#define EXTERNAL_AVX2_FAST(flags)
#define INLINE_MMXEXT(flags)
#define INLINE_MMX(flags)
Replacements for frequently missing libm functions.
const AVClass ff_sws_context_class
static SwsVector * sws_getConstVec(double c, int length)
Allocate and return a vector with length coefficients, all with the same value c.
static int handle_0alpha(int *format)
static int handle_xyz(int *format)
static SwsVector * sws_getIdentityVec(void)
Allocate and return a vector with just one coefficient, with value 1.0.
static enum AVPixelFormat alphaless_fmt(enum AVPixelFormat fmt)
static SwsVector * sws_sumVec(SwsVector *a, SwsVector *b)
int ff_shuffle_filter_coefficients(SwsInternal *c, int *filterPos, int filterSize, int16_t *filter, int dstW)
av_cold int ff_sws_init_single_context(SwsContext *sws, SwsFilter *srcFilter, SwsFilter *dstFilter)
static SwsContext * alloc_set_opts(int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW, int dstH, enum AVPixelFormat dstFormat, int flags, const double *param)
Allocate and return an SwsContext without performing initialization.
static uint16_t * alloc_gamma_tbl(double e)
static av_cold void init_xyz_tables(void)
static const ScaleAlgorithm scale_algorithms[]
static int context_init_threaded(SwsContext *sws, SwsFilter *src_filter, SwsFilter *dst_filter)
static void sws_addVec(SwsVector *a, SwsVector *b)
static int handle_formats(SwsContext *sws)
static double getSplineCoeff(double a, double b, double c, double d, double dist)
static av_cold int initFilter(int16_t **outFilter, int32_t **filterPos, int *outFilterSize, int xInc, int srcW, int dstW, int filterAlign, int one, int scaler, int flags, int cpu_flags, SwsVector *srcFilter, SwsVector *dstFilter, double param[SWS_NUM_SCALER_PARAMS], int srcPos, int dstPos)
SwsBackend ff_sws_enabled_backends(const SwsContext *ctx)
static uint16_t xyzgammainv_tab[65536]
int ff_sws_thread_exec(void *priv, int(*func)(void *priv, int jobnr, int threadnr, int nb_jobs, int nb_threads), int nb_threads, int nb_jobs)
Helper for dispatching a single function across multiple threads.
static uint16_t xyzgamma_tab[4096]
static int handle_jpeg(int *format)
static void makenan_vec(SwsVector *a)
static double sws_dcVec(SwsVector *a)
static int isnan_vec(SwsVector *a)
static void sws_shiftVec(SwsVector *a, int shift)
static av_cold int get_local_pos(SwsInternal *s, int chr_subsample, int pos, int dir)
av_cold int ff_sws_fill_xyztables(SwsInternal *c)
static uint16_t rgbgammainv_tab[4096]
static int scaler_flag(SwsScaler scaler, int fallback)
int ff_range_add(RangeList *rl, unsigned int start, unsigned int len)
static SwsVector * sws_getShiftedVec(SwsVector *a, int shift)
static void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level)
Print with av_log() a textual representation of the vector a if log_level <= av_log_level.
static uint16_t rgbgamma_tab[65536]
static void fill_rgb2yuv_table(SwsInternal *c, const int table[4], int dstRange)
static int range_override_needed(enum AVPixelFormat format)
#define FFSWAP(type, a, b)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
#define sws_isSupportedOutput(x)
#define sws_isSupportedInput(x)
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
Return the number of bits per pixel used by the pixel format described by pixdesc.
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt)
Utility function to swap the endianness of a pixel format.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_BGR555
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_GRAYF32
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_GRAY16BE
Y , 16bpp, big-endian.
@ AV_PIX_FMT_XYZ12LE
packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as lit...
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
@ AV_PIX_FMT_GRAY10LE
Y , 10bpp, little-endian.
@ AV_PIX_FMT_GBRP10BE
planar GBR 4:4:4 30bpp, big-endian
@ AV_PIX_FMT_YA16BE
16 bits gray, 16 bits alpha (big-endian)
@ AV_PIX_FMT_YUVA420P9BE
planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
@ AV_PIX_FMT_GBRPF16BE
IEEE-754 half precision planer GBR 4:4:4, 48bpp, big-endian.
@ AV_PIX_FMT_GBRPF32BE
IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian.
@ AV_PIX_FMT_YUVA444P9LE
planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
@ AV_PIX_FMT_YUVA444P10LE
planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
@ AV_PIX_FMT_GBRP9LE
planar GBR 4:4:4 27bpp, little-endian
@ AV_PIX_FMT_GBRP10MSBBE
planar GBR 4:4:4 30bpp, lowest bits zero, big-endian
@ AV_PIX_FMT_YUVA420P10BE
planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
@ AV_PIX_FMT_GBRP12BE
planar GBR 4:4:4 36bpp, big-endian
@ AV_PIX_FMT_YUVA422P9LE
planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian
@ AV_PIX_FMT_GRAY12LE
Y , 12bpp, little-endian.
@ AV_PIX_FMT_GBRAP12BE
planar GBR 4:4:4:4 48bpp, big-endian
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
@ AV_PIX_FMT_GRAY12BE
Y , 12bpp, big-endian.
@ AV_PIX_FMT_X2BGR10LE
packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_BGR48BE
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big...
@ AV_PIX_FMT_YA16LE
16 bits gray, 16 bits alpha (little-endian)
@ AV_PIX_FMT_YUVA420P10LE
planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
@ AV_PIX_FMT_GRAY14LE
Y , 14bpp, little-endian.
@ AV_PIX_FMT_RGB48BE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big...
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
@ AV_PIX_FMT_YUVA422P10LE
planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
@ AV_PIX_FMT_GBRPF16LE
IEEE-754 half precision planer GBR 4:4:4, 48bpp, little-endian.
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
@ AV_PIX_FMT_RGBA64BE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
@ AV_PIX_FMT_RGB8
packed RGB 3:3:2, 8bpp, (msb)3R 3G 2B(lsb)
@ AV_PIX_FMT_GBRAP14BE
planar GBR 4:4:4:4 56bpp, big-endian
@ AV_PIX_FMT_RGBA64LE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
@ AV_PIX_FMT_0BGR
packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
@ AV_PIX_FMT_GBRAP16BE
planar GBRA 4:4:4:4 64bpp, big-endian
@ AV_PIX_FMT_GBRPF32LE
IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian.
@ AV_PIX_FMT_YUVA444P9BE
planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
@ AV_PIX_FMT_BGR8
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
@ AV_PIX_FMT_RGB444LE
packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_GBRP10MSBLE
planar GBR 4:4:4 30bpp, lowest bits zero, little-endian
@ AV_PIX_FMT_RGB4_BYTE
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
@ AV_PIX_FMT_BGR4_BYTE
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
@ AV_PIX_FMT_YUVA420P9LE
planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_XYZ12BE
packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big...
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
@ AV_PIX_FMT_GBRP12LE
planar GBR 4:4:4 36bpp, little-endian
@ AV_PIX_FMT_GRAY9BE
Y , 9bpp, big-endian.
@ AV_PIX_FMT_YUVA444P16LE
planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
@ AV_PIX_FMT_YUVA422P10BE
planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
@ AV_PIX_FMT_YUVA422P16BE
planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
@ AV_PIX_FMT_BGRA64BE
packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is st...
@ AV_PIX_FMT_GBRP16BE
planar GBR 4:4:4 48bpp, big-endian
@ AV_PIX_FMT_GBRAP12LE
planar GBR 4:4:4:4 48bpp, little-endian
@ AV_PIX_FMT_GBRP9BE
planar GBR 4:4:4 27bpp, big-endian
@ AV_PIX_FMT_YUVA420P16LE
planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
@ AV_PIX_FMT_BGR444BE
packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined
@ AV_PIX_FMT_RGB48LE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as lit...
@ AV_PIX_FMT_GBRAPF32BE
IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian.
@ AV_PIX_FMT_GBRP12MSBLE
planar GBR 4:4:4 36bpp, lowest bits zero, little-endian
@ AV_PIX_FMT_BGR444LE
packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_YUVA420P16BE
planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
@ AV_PIX_FMT_X2RGB10LE
packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
@ AV_PIX_FMT_GBRAPF32LE
IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian.
@ AV_PIX_FMT_GBRAP14LE
planar GBR 4:4:4:4 56bpp, little-endian
@ AV_PIX_FMT_RGB444BE
packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined
@ AV_PIX_FMT_BGR48LE
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as lit...
@ AV_PIX_FMT_GBRP14LE
planar GBR 4:4:4 42bpp, little-endian
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
@ AV_PIX_FMT_GRAY16LE
Y , 16bpp, little-endian.
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
@ AV_PIX_FMT_GBRP10LE
planar GBR 4:4:4 30bpp, little-endian
@ AV_PIX_FMT_GBRAP10BE
planar GBR 4:4:4:4 40bpp, big-endian
@ AV_PIX_FMT_GBRAPF16BE
IEEE-754 half precision planar GBRA 4:4:4:4, 64bpp, big-endian.
@ AV_PIX_FMT_BGRA64LE
packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is st...
@ AV_PIX_FMT_GBRAP10LE
planar GBR 4:4:4:4 40bpp, little-endian
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
@ AV_PIX_FMT_GRAY9LE
Y , 9bpp, little-endian.
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
@ AV_PIX_FMT_GBRAP16LE
planar GBRA 4:4:4:4 64bpp, little-endian
@ AV_PIX_FMT_GBRAPF16LE
IEEE-754 half precision planar GBRA 4:4:4:4, 64bpp, little-endian.
@ AV_PIX_FMT_GRAY10BE
Y , 10bpp, big-endian.
@ AV_PIX_FMT_YUVA444P10BE
planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
@ AV_PIX_FMT_0RGB
packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
@ AV_PIX_FMT_GRAY14BE
Y , 14bpp, big-endian.
@ AV_PIX_FMT_GBRP14BE
planar GBR 4:4:4 42bpp, big-endian
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
@ AV_PIX_FMT_YUVA444P16BE
planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
@ AV_PIX_FMT_YUVA422P16LE
planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
@ AV_PIX_FMT_GBRP16LE
planar GBR 4:4:4 48bpp, little-endian
@ AV_PIX_FMT_YUVA422P9BE
planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian
@ AV_PIX_FMT_RGB4
packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in ...
@ AV_PIX_FMT_BGR4
packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in ...
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
@ AV_PIX_FMT_GBRP12MSBBE
planar GBR 4:4:4 36bpp, lowest bits zero, big-endian
#define AV_PIX_FMT_BGR565
#define AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_BGRA64
#define AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P10
static const uint16_t table[]
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
av_cold void ff_sws_rgb2rgb_init(void)
#define FF_ARRAY_ELEMS(a)
int ff_free_filters(SwsInternal *c)
int ff_init_filters(SwsInternal *c)
void avpriv_slicethread_free(AVSliceThread **pctx)
Destroy slice threading context.
int avpriv_slicethread_execute2(AVSliceThread *ctx, int nb_jobs, int execute_main)
Execute slice threading.
int avpriv_slicethread_create2(AVSliceThread **pctx, void *priv, int(*worker_func)(void *priv, int jobnr, int threadnr, int nb_jobs, int nb_threads), int(*main_func)(void *priv), int nb_threads)
Create slice threading context.
struct AVSliceThread AVSliceThread
Describe the class of an AVClass context structure.
int depth
Number of bits in the component.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
int flag
flag associated to the algorithm
int size_factor
size factor used when initing the filters
const char * description
human-readable description
Main external API structure.
int src_h
Width and height of the source frame.
int dst_format
Destination pixel format.
int gamma_flag
Use gamma correct scaling.
int threads
How many threads to use for processing, or 0 for automatic selection.
SwsScaler scaler
Scaling filter.
int dst_h
Width and height of the destination frame.
SwsAlphaBlend alpha_blend
Alpha blending mode.
double scaler_params[SWS_NUM_SCALER_PARAMS]
int dst_h_chr_pos
Destination horizontal chroma position.
SwsScaler scaler_sub
Scaler used specifically for up/downsampling subsampled (chroma) planes.
int src_w
Deprecated frame property overrides, for the legacy API only.
int src_format
Source pixel format.
int src_v_chr_pos
Source vertical chroma position in luma grid / 256.
int dst_v_chr_pos
Destination vertical chroma position.
SwsDither dither
Dither mode.
int dst_range
Destination is full range.
unsigned flags
Bitmask of SWS_*.
int src_range
Source is full range.
int src_h_chr_pos
Source horizontal chroma position.
double * coeff
pointer to the list of coefficients
int length
number of coefficients in the vector
void ff_sws_init_scale(SwsInternal *c)
int ff_sws_slice_worker(void *priv, int jobnr, int threadnr, int nb_jobs, int nb_threads)
av_cold void ff_sws_init_range_convert(SwsInternal *c)
#define SWS_NUM_SCALER_PARAMS
Extra parameters for fine-tuning certain scalers.
#define SWSINTERNAL_ADDITIONAL_ASM_SIZE
static av_always_inline int isBayer(enum AVPixelFormat pix_fmt)
int ff_init_hscaler_mmxext(int dstW, int xInc, uint8_t *filterCode, int16_t *filter, int32_t *filterPos, int numSplits)
static av_always_inline int isFloat(enum AVPixelFormat pix_fmt)
static av_always_inline int isAnyRGB(enum AVPixelFormat pix_fmt)
static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
#define RETCODE_USE_CASCADE
static av_always_inline int isGray(enum AVPixelFormat pix_fmt)
static SwsInternal * sws_internal(const SwsContext *sws)
void ff_get_unscaled_swscale(SwsInternal *c)
Set c->convert_unscaled to an unscaled converter if one exists for the specific source and destinatio...
int ff_sws_init_altivec_bufs(SwsInternal *c)
void ff_sws_free_altivec_bufs(SwsInternal *c)
static av_always_inline int isALPHA(enum AVPixelFormat pix_fmt)
static av_always_inline int isPlanarRGB(enum AVPixelFormat pix_fmt)
int ff_yuv2rgb_c_init_tables(SwsInternal *c, const int inv_table[4], int fullRange, int brightness, int contrast, int saturation)
static av_always_inline int isBayer16BPS(enum AVPixelFormat pix_fmt)
static av_always_inline int isNBPS(enum AVPixelFormat pix_fmt)
const int32_t ff_yuv2rgb_coeffs[11][4]
static av_always_inline int isYUV(enum AVPixelFormat pix_fmt)
#define av_malloc_array(a, b)
static void error(const char *err)
void(* filter)(uint8_t *src, ptrdiff_t stride, int qscale)
static const double coeff[2][5]
static const uint8_t quality[]
av_cold void ff_yuv2rgb_init_tables_ppc(SwsInternal *c, const int inv_table[4], int brightness, int contrast, int saturation)