Go to the documentation of this file.
24 #define _DEFAULT_SOURCE
25 #define _SVID_SOURCE // needed for MAP_ANONYMOUS
26 #define _DARWIN_C_SOURCE // needed for MAP_ANON
33 #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
34 #define MAP_ANONYMOUS MAP_ANON
76 int flags,
const double *param)
97 int filterSize, int16_t *
filter,
106 if ((
c->srcBpc == 8) && (
c->dstBpc <= 14)) {
107 int16_t *filterCopy =
NULL;
108 if (filterSize > 4) {
112 memcpy(filterCopy,
filter, dstW * filterSize *
sizeof(int16_t));
116 for (
i = 0;
i + 16 <= dstW;
i += 16) {
117 FFSWAP(
int, filterPos[
i + 2], filterPos[
i + 4]);
118 FFSWAP(
int, filterPos[
i + 3], filterPos[
i + 5]);
119 FFSWAP(
int, filterPos[
i + 10], filterPos[
i + 12]);
120 FFSWAP(
int, filterPos[
i + 11], filterPos[
i + 13]);
122 if (filterSize > 4) {
124 for (
i = 0;
i + 16 <= dstW;
i += 16) {
126 for (k = 0; k + 4 <= filterSize; k += 4) {
127 for (j = 0; j < 16; ++j) {
128 int from = (
i + j) * filterSize + k;
129 int to =
i * filterSize + j * 4 + k * 16;
130 memcpy(&
filter[
to], &filterCopy[
from], 4 *
sizeof(int16_t));
135 for (;
i < dstW;
i += 4) {
137 int rem = dstW -
i >= 4 ? 4 : dstW -
i;
138 for (k = 0; k + 4 <= filterSize; k += 4) {
139 for (j = 0; j < rem; ++j) {
140 int from = (
i + j) * filterSize + k;
141 int to =
i * filterSize + j * 4 + k * 4;
142 memcpy(&
filter[
to], &filterCopy[
from], 4 *
sizeof(int16_t));
158 return ((d * dist +
c) * dist +
b) * dist +
a;
161 b + 2.0 *
c + 3.0 * d,
163 -
b - 3.0 *
c - 6.0 * d,
169 if (
pos == -1 ||
pos <= -513) {
170 pos = (128 << chr_subsample) - 128;
173 return pos >> chr_subsample;
190 {
SWS_POINT,
"nearest neighbor / point", -1 },
193 {
SWS_X,
"experimental", 8 },
197 int *outFilterSize,
int xInc,
int srcW,
198 int dstW,
int filterAlign,
int one,
218 if (
FFABS(xInc - 0x10000) < 10 && srcPos == dstPos) {
224 for (
i = 0;
i < dstW;
i++) {
235 xDstInSrc = ((dstPos*(
int64_t)xInc)>>8) - ((srcPos*0x8000LL)>>7);
236 for (
i = 0;
i < dstW;
i++) {
237 int xx = (xDstInSrc - ((filterSize - 1) << 15) + (1 << 15)) >> 16;
239 (*filterPos)[
i] = xx;
243 }
else if ((xInc <= (1 << 16) && (scaler ==
SWS_AREA)) ||
251 xDstInSrc = ((dstPos*(
int64_t)xInc)>>8) - ((srcPos*0x8000LL)>>7);
252 for (
i = 0;
i < dstW;
i++) {
253 int xx = (xDstInSrc - ((filterSize - 1) << 15) + (1 << 15)) >> 16;
256 (*filterPos)[
i] = xx;
258 for (j = 0; j < filterSize; j++) {
281 if (sizeFactor > 50) {
287 filterSize = 1 + sizeFactor;
289 filterSize = 1 + (sizeFactor * srcW + dstW - 1) / dstW;
291 filterSize =
FFMIN(filterSize, srcW - 2);
292 filterSize =
FFMAX(filterSize, 1);
297 xDstInSrc = ((dstPos*(
int64_t)xInc)>>7) - ((srcPos*0x10000LL)>>7);
298 for (
i = 0;
i < dstW;
i++) {
299 int xx = (xDstInSrc - (filterSize - 2) * (1LL<<16)) / (1 << 17);
301 (*filterPos)[
i] = xx;
302 for (j = 0; j < filterSize; j++) {
309 floatd = d * (1.0 / (1 << 30));
315 if (d >= 1LL << 31) {
322 coeff = (12 * (1 << 24) - 9 *
B - 6 *
C) * ddd +
323 (-18 * (1 << 24) + 12 *
B + 6 *
C) * dd +
324 (6 * (1 << 24) - 2 *
B) * (1 << 30);
327 (6 *
B + 30 *
C) * dd +
328 (-12 *
B - 48 *
C) * d +
329 (8 *
B + 24 *
C) * (1 << 30);
331 coeff /= (1LL<<54)/fone;
332 }
else if (scaler ==
SWS_X) {
337 c = cos(floatd *
M_PI);
344 coeff = (
c * 0.5 + 0.5) * fone;
347 if (d2 * xInc < -(1LL << (29 + 16)))
348 coeff = 1.0 * (1LL << (30 + 16));
349 else if (d2 * xInc < (1LL << (29 + 16)))
350 coeff = -d2 * xInc + (1LL << (29 + 16));
353 coeff *= fone >> (30 + 16);
358 coeff = (d ? sin(floatd *
M_PI) / (floatd *
M_PI) : 1.0) * fone;
362 (floatd * floatd *
M_PI *
M_PI /
p) : 1.0) * fone;
366 coeff = (1 << 30) - d;
371 double p = -2.196152422706632;
380 xDstInSrc += 2LL * xInc;
388 filter2Size = filterSize;
390 filter2Size += srcFilter->
length - 1;
392 filter2Size += dstFilter->
length - 1;
394 filter2 =
av_calloc(dstW, filter2Size *
sizeof(*filter2));
397 for (
i = 0;
i < dstW;
i++) {
401 for (k = 0; k < srcFilter->
length; k++) {
402 for (j = 0; j < filterSize; j++)
403 filter2[
i * filter2Size + k + j] +=
407 for (j = 0; j < filterSize; j++)
408 filter2[
i * filter2Size + j] =
filter[
i * filterSize + j];
412 (*filterPos)[
i] += (filterSize - 1) / 2 - (filter2Size - 1) / 2;
419 for (
i = dstW - 1;
i >= 0;
i--) {
420 int min = filter2Size;
425 for (j = 0; j < filter2Size; j++) {
427 cutOff +=
FFABS(filter2[
i * filter2Size]);
434 if (
i < dstW - 1 && (*filterPos)[
i] >= (*filterPos)[
i + 1])
438 for (k = 1; k < filter2Size; k++)
439 filter2[
i * filter2Size + k - 1] = filter2[
i * filter2Size + k];
440 filter2[
i * filter2Size + k - 1] = 0;
446 for (j = filter2Size - 1; j > 0; j--) {
447 cutOff +=
FFABS(filter2[
i * filter2Size + j]);
454 if (
min > minFilterSize)
460 if (minFilterSize < 5)
466 if (minFilterSize < 3)
472 if (minFilterSize == 1 && filterAlign == 2)
477 int reNum = minFilterSize & (0x07);
479 if (minFilterSize < 5)
486 filterSize = (minFilterSize + (filterAlign - 1)) & (~(filterAlign - 1));
496 *outFilterSize = filterSize;
500 "SwScaler: reducing / aligning filtersize %d -> %d\n",
501 filter2Size, filterSize);
503 for (
i = 0;
i < dstW;
i++) {
506 for (j = 0; j < filterSize; j++) {
507 if (j >= filter2Size)
508 filter[
i * filterSize + j] = 0;
510 filter[
i * filterSize + j] = filter2[
i * filter2Size + j];
512 filter[
i * filterSize + j] = 0;
519 for (
i = 0;
i < dstW;
i++) {
521 if ((*filterPos)[
i] < 0) {
523 for (j = 1; j < filterSize; j++) {
526 filter[
i * filterSize + j] = 0;
531 if ((*filterPos)[
i] + filterSize > srcW) {
532 int shift = (*filterPos)[
i] +
FFMIN(filterSize - srcW, 0);
535 for (j = filterSize - 1; j >= 0; j--) {
536 if ((*filterPos)[
i] + j >= srcW) {
537 acc +=
filter[
i * filterSize + j];
538 filter[
i * filterSize + j] = 0;
541 for (j = filterSize - 1; j >= 0; j--) {
543 filter[
i * filterSize + j] = 0;
550 filter[
i * filterSize + srcW - 1 - (*filterPos)[
i]] += acc;
554 if ((*filterPos)[
i] + filterSize > srcW) {
555 for (j = 0; j < filterSize; j++) {
563 *outFilter =
av_calloc(dstW + 3, *outFilterSize *
sizeof(**outFilter));
568 for (
i = 0;
i < dstW;
i++) {
573 for (j = 0; j < filterSize; j++) {
574 sum +=
filter[
i * filterSize + j];
576 sum = (sum + one / 2) / one;
581 for (j = 0; j < *outFilterSize; j++) {
584 (*outFilter)[
i * (*outFilterSize) + j] = intV;
585 error = v - intV * sum;
589 (*filterPos)[dstW + 0] =
590 (*filterPos)[dstW + 1] =
591 (*filterPos)[dstW + 2] = (*filterPos)[dstW - 1];
593 for (
i = 0;
i < *outFilterSize;
i++) {
594 int k = (dstW - 1) * (*outFilterSize) +
i;
595 (*outFilter)[k + 1 * (*outFilterSize)] =
596 (*outFilter)[k + 2 * (*outFilterSize)] =
597 (*outFilter)[k + 3 * (*outFilterSize)] = (*outFilter)[k];
622 uint8_t *
p = (uint8_t*)
c->input_rgb2yuv_table;
624 static const int8_t
map[] = {
649 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
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 ,
722 for (
int i = 0;
i < 4096;
i++) {
728 for (
int i = 0;
i < 65536;
i++) {
736 static const int16_t xyz2rgb_matrix[3][3] = {
737 {13270, -6295, -2041},
739 { 228, -835, 4329} };
740 static const int16_t rgb2xyz_matrix[3][3] = {
745 if (
c->xyz2rgb.gamma.in)
748 memcpy(
c->xyz2rgb.mat, xyz2rgb_matrix,
sizeof(
c->xyz2rgb.mat));
749 memcpy(
c->rgb2xyz.mat, rgb2xyz_matrix,
sizeof(
c->rgb2xyz.mat));
752 c->xyz2rgb.gamma.in =
av_malloc(
sizeof(uint16_t) * 2 * (4096 + 65536));
753 if (!
c->xyz2rgb.gamma.in)
755 c->rgb2xyz.gamma.in =
c->xyz2rgb.gamma.in + 4096;
756 c->xyz2rgb.gamma.out =
c->rgb2xyz.gamma.in + 4096;
757 c->rgb2xyz.gamma.out =
c->xyz2rgb.gamma.out + 65536;
759 c->xyz2rgb.gamma.out,
c->rgb2xyz.gamma.in);
837 if (
c->srcXYZ ||
c->dstXYZ)
849 int srcRange,
const int table[4],
int dstRange,
855 int ret, need_reinit = 0;
857 if (
c->nb_slice_ctx) {
859 for (
int i = 0;
i <
c->nb_slice_ctx;
i++) {
861 srcRange,
table, dstRange,
883 c->brightness != brightness ||
884 c->contrast != contrast ||
886 memcmp(
c->srcColorspaceTable, inv_table,
sizeof(
int) * 4) ||
887 memcmp(
c->dstColorspaceTable,
table,
sizeof(
int) * 4)
891 memmove(
c->srcColorspaceTable, inv_table,
sizeof(
int) * 4);
892 memmove(
c->dstColorspaceTable,
table,
sizeof(
int) * 4);
896 c->brightness = brightness;
897 c->contrast = contrast;
908 if (
c->cascaded_context[
c->cascaded_mainindex])
915 if (!
c->cascaded_context[0] &&
916 memcmp(
c->dstColorspaceTable,
c->srcColorspaceTable,
sizeof(
int) * 4) &&
919 int tmp_width, tmp_height;
920 int srcW = sws->
src_w;
921 int srcH = sws->
src_h;
922 int dstW = sws->
dst_w;
923 int dstH = sws->
dst_h;
925 av_log(
c,
AV_LOG_VERBOSE,
"YUV color matrix differs for YUV->YUV, using intermediate RGB to convert\n");
941 if (srcW*srcH > dstW*dstH) {
950 tmp_width, tmp_height, tmp_format, 64);
955 tmp_width, tmp_height, tmp_format,
957 if (!
c->cascaded_context[0])
966 srcRange,
table, dstRange,
969 c->cascaded_context[1] =
alloc_set_opts(tmp_width, tmp_height, tmp_format,
972 if (!
c->cascaded_context[1])
974 c->cascaded_context[1]->src_range = srcRange;
975 c->cascaded_context[1]->dst_range = dstRange;
980 srcRange,
table, dstRange,
981 0, 1 << 16, 1 << 16);
985 if (
c->cascaded_context[0] && memcmp(
c->dstColorspaceTable,
c->srcColorspaceTable,
sizeof(
int) * 4))
1007 int *srcRange,
int **
table,
int *dstRange,
1008 int *brightness,
int *contrast,
int *
saturation)
1014 if (
c->nb_slice_ctx) {
1016 table, dstRange, brightness, contrast,
1020 *inv_table =
c->srcColorspaceTable;
1021 *
table =
c->dstColorspaceTable;
1024 *brightness =
c->brightness;
1025 *contrast =
c->contrast;
1049 tbl = (uint16_t*)
av_malloc(
sizeof(uint16_t) * 1 << 16);
1053 for (
i = 0;
i < 65536; ++
i) {
1054 tbl[
i] = pow(
i / 65535.0, e) * 65535.0;
1140 int usesVFilter, usesHFilter;
1144 int srcW = sws->
src_w;
1145 int srcH = sws->
src_h;
1146 int dstW = sws->
dst_w;
1147 int dstH = sws->
dst_h;
1148 int dst_stride =
FFALIGN(dstW *
sizeof(int16_t) + 66, 16);
1155 static const float float_mult = 1.0f / 255.0f;
1161 unscaled = (srcW == dstW && srcH == dstH);
1163 if (!
c->contrast && !
c->saturation && !
c->dstFormatBpp)
1209 if (dstW < srcW && dstH < srcH)
1211 else if (dstW > srcW && dstH > srcH)
1217 }
else if (
i & (
i - 1)) {
1219 "Exactly one scaler algorithm must be chosen, got %X\n",
i);
1224 if (srcW < 8 || dstW <= 8) {
1236 if (srcW < 1 || srcH < 1 || dstW < 1 || dstH < 1) {
1240 srcW, srcH, dstW, dstH);
1245 dstFilter = &dummyFilter;
1247 srcFilter = &dummyFilter;
1253 c->vRounder = 4 * 0x0001000100010001ULL;
1255 usesVFilter = (srcFilter->
lumV && srcFilter->
lumV->
length > 1) ||
1259 usesHFilter = (srcFilter->
lumH && srcFilter->
lumH->
length > 1) ||
1267 c->dst_slice_align = 1 <<
c->chrDstVSubSample;
1276 if (
c->chrSrcHSubSample == 0
1277 &&
c->chrSrcVSubSample == 0
1281 av_log(
c,
AV_LOG_DEBUG,
"Forcing full internal H chroma due to input having non subsampled chroma\n");
1301 "Desired dithering only supported in full chroma interpolation for destination format '%s'\n",
1310 "Ordered dither is not supported in full chroma interpolation for destination format '%s'\n",
1319 "%s output is not supported with half chroma resolution, switching to full\n",
1353 "full chroma interpolation for destination format '%s' not yet implemented\n",
1359 c->chrDstHSubSample = 1;
1364 c->chrSrcVSubSample +=
c->vChrDrop;
1387 ((dstW >>
c->chrDstHSubSample) <= (srcW >> 1) ||
1389 c->chrSrcHSubSample = 1;
1408 if (
c->dstBpc == 16)
1412 c->canMMXEXTBeUsed = dstW >= srcW && (dstW & 31) == 0 &&
1413 c->chrDstW >=
c->chrSrcW &&
1415 if (!
c->canMMXEXTBeUsed && dstW >= srcW &&
c->chrDstW >=
c->chrSrcW && (srcW & 15) == 0
1420 "output width is not a multiple of 32 -> no MMXEXT scaler\n");
1423 c->canMMXEXTBeUsed = 0;
1425 c->canMMXEXTBeUsed = 0;
1427 int64_t chrXInc = (((
int64_t)
c->chrSrcW << 16) + (
c->chrDstW >> 1)) /
c->chrDstW;
1428 int64_t chrYInc = (((
int64_t)
c->chrSrcH << 16) + (
c->chrDstH >> 1)) /
c->chrDstH;
1438 if (
c->canMMXEXTBeUsed) {
1444 lumXInc = ((
int64_t)(srcW - 2) << 16) / (dstW - 2) - 20;
1445 chrXInc = ((
int64_t)(
c->chrSrcW - 2) << 16) / (
c->chrDstW - 2) - 20;
1448 if (chrXInc < 10 || chrXInc > INT_MAX ||
1449 chrYInc < 10 || chrYInc > INT_MAX ||
1450 lumXInc < 10 || lumXInc > INT_MAX ||
1451 lumYInc < 10 || lumYInc > INT_MAX)
1454 c->lumXInc = lumXInc;
1455 c->lumYInc = lumYInc;
1456 c->chrXInc = chrXInc;
1457 c->chrYInc = chrYInc;
1461 c->gamma_value = 2.2;
1464 if (!unscaled && sws->
gamma_flag && (srcFormat != tmpFmt || dstFormat != tmpFmt)) {
1466 c->cascaded_context[0] =
NULL;
1469 srcW, srcH, tmpFmt, 64);
1477 if (!
c->cascaded_context[0]) {
1483 flags, srcFilter, dstFilter,
1486 if (!
c->cascaded_context[1])
1490 c2->is_internal_gamma = 1;
1493 if (!
c2->gamma || !
c2->inv_gamma)
1502 c->cascaded_context[1] =
NULL;
1506 c->cascaded_context[2] =
NULL;
1507 if (dstFormat != tmpFmt) {
1509 dstW, dstH, tmpFmt, 64);
1514 dstW, dstH, dstFormat,
1517 if (!
c->cascaded_context[2])
1530 srcW, srcH, tmpFormat, 64);
1535 srcW, srcH, tmpFormat,
1538 if (!
c->cascaded_context[0])
1542 dstW, dstH, dstFormat,
1545 if (!
c->cascaded_context[1])
1552 for (
i = 0;
i < 256; ++
i){
1553 c->uint2float_lut[
i] = (
float)
i * float_mult;
1559 (!unscaled || unscaled && dstFormat != srcFormat && (srcFormat !=
AV_PIX_FMT_GRAYF32 ||
1564 if (CONFIG_SWSCALE_ALPHA &&
isALPHA(srcFormat) && !
isALPHA(dstFormat)) {
1569 dstFormat != tmpFormat ||
1570 usesHFilter || usesVFilter ||
1573 c->cascaded_mainindex = 1;
1575 srcW, srcH, tmpFormat, 64);
1580 srcW, srcH, tmpFormat,
1582 if (!
c->cascaded_context[0])
1584 c->cascaded_context[0]->alpha_blend = sws->
alpha_blend;
1590 dstW, dstH, dstFormat,
1592 if (!
c->cascaded_context[1])
1595 c->cascaded_context[1]->src_range = sws->
src_range;
1596 c->cascaded_context[1]->dst_range = sws->
dst_range;
1607 if (unscaled && !usesHFilter && !usesVFilter &&
1617 "using alpha blendaway %s -> %s special converter\n",
1623 if (unscaled && !usesHFilter && !usesVFilter &&
1629 if (
c->convert_unscaled) {
1632 "using unscaled %s -> %s special converter\n",
1638 #if HAVE_MMAP && HAVE_MPROTECT && defined(MAP_ANONYMOUS)
1646 #if HAVE_MMXEXT_INLINE
1655 c->lumMmxextFilterCode = mmap(
NULL,
c->lumMmxextFilterCodeSize,
1656 PROT_READ | PROT_WRITE,
1657 MAP_PRIVATE | MAP_ANONYMOUS,
1659 c->chrMmxextFilterCode = mmap(
NULL,
c->chrMmxextFilterCodeSize,
1660 PROT_READ | PROT_WRITE,
1661 MAP_PRIVATE | MAP_ANONYMOUS,
1663 #elif HAVE_VIRTUALALLOC
1664 c->lumMmxextFilterCode = VirtualAlloc(
NULL,
1665 c->lumMmxextFilterCodeSize,
1667 PAGE_EXECUTE_READWRITE);
1668 c->chrMmxextFilterCode = VirtualAlloc(
NULL,
1669 c->chrMmxextFilterCodeSize,
1671 PAGE_EXECUTE_READWRITE);
1673 c->lumMmxextFilterCode =
av_malloc(
c->lumMmxextFilterCodeSize);
1674 c->chrMmxextFilterCode =
av_malloc(
c->chrMmxextFilterCodeSize);
1677 #ifdef MAP_ANONYMOUS
1678 if (
c->lumMmxextFilterCode == MAP_FAILED ||
c->chrMmxextFilterCode == MAP_FAILED)
1680 if (!
c->lumMmxextFilterCode || !
c->chrMmxextFilterCode)
1694 c->hLumFilter, (uint32_t*)
c->hLumFilterPos, 8);
1696 c->hChrFilter, (uint32_t*)
c->hChrFilterPos, 4);
1699 if ( mprotect(
c->lumMmxextFilterCode,
c->lumMmxextFilterCodeSize, PROT_EXEC | PROT_READ) == -1
1700 || mprotect(
c->chrMmxextFilterCode,
c->chrMmxextFilterCodeSize, PROT_EXEC | PROT_READ) == -1) {
1716 &
c->hLumFilterSize,
c->lumXInc,
1717 srcW, dstW, filterAlign, 1 << 14,
1727 &
c->hChrFilterSize,
c->chrXInc,
1728 c->chrSrcW,
c->chrDstW, filterAlign, 1 << 14,
1747 c->lumYInc, srcH, dstH, filterAlign, (1 << 12),
1754 if (
ret < 0 && !usecascade)
1756 if ((
ret =
initFilter(&
c->vChrFilter, &
c->vChrFilterPos, &
c->vChrFilterSize,
1757 c->chrYInc,
c->chrSrcH,
c->chrDstH,
1758 filterAlign, (1 << 12),
1778 for (
i = 0;
i < 4;
i++)
1785 c->uv_off = (dst_stride>>1) + 64 / (
c->dstBpc &~ 7);
1786 c->uv_offx2 = dst_stride + 16;
1791 const char *scaler =
NULL, *cpucaps;
1800 scaler =
"ehh flags invalid?!";
1815 cpucaps =
"AltiVec";
1823 "lum srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n",
1826 "chr srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n",
1827 c->chrSrcW,
c->chrSrcH,
c->chrDstW,
c->chrDstH,
1828 c->chrXInc,
c->chrYInc);
1838 int tmpW = sqrt(srcW * (
int64_t)dstW);
1839 int tmpH = sqrt(srcH * (
int64_t)dstH);
1845 if (srcW*(
int64_t)srcH <= 4LL*dstW*dstH)
1849 tmpW, tmpH, tmpFormat, 64);
1854 tmpW, tmpH, tmpFormat,
1857 if (!
c->cascaded_context[0])
1861 dstW, dstH, dstFormat,
1864 if (!
c->cascaded_context[1])
1887 c->slice_ctx =
av_calloc(sws->threads,
sizeof(*
c->slice_ctx));
1888 c->slice_err =
av_calloc(sws->threads,
sizeof(*
c->slice_err));
1889 if (!
c->slice_ctx || !
c->slice_err)
1892 for (
int i = 0;
i < sws->threads;
i++) {
1911 "Error-diffusion dither is in use, scaling will be single-threaded.");
1927 c->is_legacy_init = 1;
1930 if (!
c->frame_src || !
c->frame_dst)
1946 if (ret < 0 || sws->threads > 1)
1957 SwsFilter *dstFilter,
const double *param)
1962 dstW, dstH, dstFormat,
1978 for (
i=0;
i<
a->length;
i++)
1987 for (
i=0;
i<
a->length;
i++)
1995 if(length <= 0 || length > INT_MAX/
sizeof(
double))
2010 const int length = (int)(variance *
quality + 0.5) | 1;
2012 double middle = (length - 1) * 0.5;
2015 if(variance < 0 ||
quality < 0)
2023 for (
i = 0;
i < length;
i++) {
2024 double dist =
i - middle;
2025 vec->
coeff[
i] =
exp(-dist * dist / (2 * variance * variance)) /
2026 sqrt(2 * variance *
M_PI);
2047 for (
i = 0;
i < length;
i++)
2068 for (
i = 0;
i <
a->length;
i++)
2078 for (
i = 0;
i <
a->length;
i++)
2079 a->coeff[
i] *= scalar;
2089 int length =
FFMAX(
a->length,
b->length);
2096 for (
i = 0;
i <
a->length;
i++)
2097 vec->
coeff[
i + (length - 1) / 2 - (
a->length - 1) / 2] +=
a->coeff[
i];
2098 for (
i = 0;
i <
b->length;
i++)
2099 vec->
coeff[
i + (length - 1) / 2 - (
b->length - 1) / 2] +=
b->coeff[
i];
2114 for (
i = 0;
i <
a->length;
i++) {
2115 vec->
coeff[
i + (length - 1) / 2 -
2116 (
a->length - 1) / 2 -
shift] =
a->coeff[
i];
2131 a->coeff = shifted->
coeff;
2162 for (
i = 0;
i <
a->length;
i++)
2163 if (
a->coeff[
i] >
max)
2166 for (
i = 0;
i <
a->length;
i++)
2167 if (
a->coeff[
i] <
min)
2172 for (
i = 0;
i <
a->length;
i++) {
2173 int x = (int)((
a->coeff[
i] -
min) * 60.0 /
range + 0.5);
2174 av_log(log_ctx, log_level,
"%1.3f ",
a->coeff[
i]);
2176 av_log(log_ctx, log_level,
" ");
2177 av_log(log_ctx, log_level,
"|\n");
2203 float lumaSharpen,
float chromaSharpen,
2204 float chromaHShift,
float chromaVShift,
2211 if (lumaGBlur != 0.0) {
2219 if (chromaGBlur != 0.0) {
2230 if (chromaSharpen != 0.0) {
2241 if (lumaSharpen != 0.0) {
2252 if (chromaHShift != 0.0)
2255 if (chromaVShift != 0.0)
2297 for (
i = 0;
i <
c->nb_slice_ctx;
i++)
2304 for (
i = 0;
i < 4;
i++)
2327 if (
c->lumMmxextFilterCode)
2328 munmap(
c->lumMmxextFilterCode,
c->lumMmxextFilterCodeSize);
2329 if (
c->chrMmxextFilterCode)
2330 munmap(
c->chrMmxextFilterCode,
c->chrMmxextFilterCodeSize);
2331 #elif HAVE_VIRTUALALLOC
2332 if (
c->lumMmxextFilterCode)
2333 VirtualFree(
c->lumMmxextFilterCode, 0, MEM_RELEASE);
2334 if (
c->chrMmxextFilterCode)
2335 VirtualFree(
c->chrMmxextFilterCode, 0, MEM_RELEASE);
2340 c->lumMmxextFilterCode =
NULL;
2341 c->chrMmxextFilterCode =
NULL;
2350 memset(
c->cascaded_context, 0,
sizeof(
c->cascaded_context));
2384 const double *param)
2391 param = default_param;
2393 if (prev && (prev->
src_w == srcW &&
2394 prev->
src_h == srcH &&
2396 prev->
dst_w == dstW &&
2397 prev->
dst_h == dstH &&
2437 for (idx = 0; idx < rl->
nb_ranges; idx++)
2444 if (prev->
start + prev->
len > start)
2447 if (idx < rl->nb_ranges) {
2477 if (idx < rl->nb_ranges - 1) {
#define FF_ALLOCZ_TYPED_ARRAY(p, nelem)
static void error(const char *err)
static av_always_inline int isBayer(enum AVPixelFormat pix_fmt)
#define INLINE_MMX(flags)
@ 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...
enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt)
Utility function to swap the endianness of a pixel format.
int sws_setColorspaceDetails(SwsContext *sws, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation)
#define AV_LOG_WARNING
Something somehow does not look correct.
@ AV_PIX_FMT_GRAY10BE
Y , 10bpp, big-endian.
AVPixelFormat
Pixel format.
@ 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...
static av_always_inline int isPlanarRGB(enum AVPixelFormat pix_fmt)
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
@ 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...
static SwsVector * sws_getIdentityVec(void)
Allocate and return a vector with just one coefficient, with value 1.0.
#define sws_isSupportedOutput(x)
@ AV_PIX_FMT_RGB444LE
packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_GBRP16BE
planar GBR 4:4:4 48bpp, big-endian
@ AV_PIX_FMT_GBRP10BE
planar GBR 4:4:4 30bpp, big-endian
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
int src_w
Deprecated frame property overrides, for the legacy API only.
@ SWS_SCALE_BILINEAR
bilinear filtering
static IPT saturation(const CmsCtx *ctx, IPT ipt)
void sws_freeContext(SwsContext *sws)
Free the swscaler context swsContext.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define EXTERNAL_AVX2_FAST(flags)
@ AV_PIX_FMT_YUVA444P10BE
planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
static enum AVPixelFormat alphaless_fmt(enum AVPixelFormat fmt)
@ 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_GBRAPF32LE
IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian.
static av_always_inline int isGray(enum AVPixelFormat pix_fmt)
#define SWSINTERNAL_ADDITIONAL_ASM_SIZE
@ AV_PIX_FMT_GBRPF32BE
IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian.
int depth
Number of bits in the component.
@ SWS_BILINEAR
bilinear filtering
static const uint16_t table[]
#define AV_PIX_FMT_YUV420P10
unsigned flags
Bitmask of SWS_*.
#define AV_LOG_VERBOSE
Detailed information.
void(* filter)(uint8_t *src, int stride, int qscale)
@ AV_PIX_FMT_GBRP14BE
planar GBR 4:4:4 42bpp, big-endian
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
Return the number of bits per pixel used by the pixel format described by pixdesc.
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
@ AV_PIX_FMT_YUVA444P9BE
planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
static SwsVector * sws_getShiftedVec(SwsVector *a, int shift)
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
@ SWS_BICUBLIN
bicubic luma, bilinear chroma
static atomic_int cpu_flags
@ AV_PIX_FMT_GRAY10LE
Y , 10bpp, little-endian.
@ AV_PIX_FMT_GRAYF32LE
IEEE-754 single precision Y, 32bpp, little-endian.
@ AV_PIX_FMT_GBRAP14BE
planar GBR 4:4:4:4 56bpp, big-endian
static int scaler_flag(SwsScaler scaler, int fallback)
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about quality
void sws_freeVec(SwsVector *a)
static int isnan_vec(SwsVector *a)
@ AV_PIX_FMT_GBRAP12LE
planar GBR 4:4:4:4 48bpp, little-endian
@ SWS_FAST_BILINEAR
Scaler selection options.
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)
av_cold int ff_sws_fill_xyztables(SwsInternal *c)
@ AV_PIX_FMT_GRAY16BE
Y , 16bpp, big-endian.
static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_GBRP14
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
@ SWS_FULL_CHR_H_INP
Perform full chroma interpolation when downscaling RGB sources.
int avpriv_slicethread_create(AVSliceThread **pctx, void *priv, void(*worker_func)(void *priv, int jobnr, int threadnr, int nb_jobs, int nb_threads), void(*main_func)(void *priv), int nb_threads)
Create slice threading context.
int src_v_chr_pos
Source vertical chroma position in luma grid / 256.
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_YUV422P9
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.
@ AV_PIX_FMT_GRAY9LE
Y , 9bpp, little-endian.
av_cold int sws_init_context(SwsContext *sws, SwsFilter *srcFilter, SwsFilter *dstFilter)
Initialize the swscaler context sws_context.
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[])
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.
static av_always_inline int isNBPS(enum AVPixelFormat pix_fmt)
#define FF_ALLOC_TYPED_ARRAY(p, nelem)
#define AV_PIX_FMT_GRAY16
@ AV_PIX_FMT_YUVA444P16BE
planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
static uint16_t xyzgammainv_tab[65536]
#define AV_CPU_FLAG_SLOW_GATHER
CPU has slow gathers.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_PIX_FMT_YUV444P10
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s your new playground is ready Some little details about what s going which in turn will define variables for the build system and the C
@ SWS_SCALE_BICUBIC
2-tap cubic BC-spline
@ AV_PIX_FMT_BGR8
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
static __device__ float ceil(float a)
static int handle_jpeg(int *format)
static int ff_thread_once(char *control, void(*routine)(void))
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define FF_ARRAY_ELEMS(a)
#define AV_PIX_FMT_YUV422P16
SwsDither dither
Dither mode.
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
#define SWS_MAX_REDUCE_CUTOFF
int ff_range_add(RangeList *rl, unsigned int start, unsigned int len)
@ AV_PIX_FMT_GBRAP16BE
planar GBRA 4:4:4:4 64bpp, big-endian
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.
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.
@ AV_PIX_FMT_GBRP16LE
planar GBR 4:4:4 48bpp, little-endian
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
int threads
How many threads to use for processing, or 0 for automatic selection.
#define AV_PIX_FMT_YUV444P16
#define AV_CEIL_RSHIFT(a, b)
@ SWS_SCALE_LANCZOS
3-tap sinc/sinc
int length
number of coefficients in the vector
SwsVector * sws_allocVec(int length)
Allocate and return an uninitialized vector with length coefficients.
@ AV_PIX_FMT_GBRP12LE
planar GBR 4:4:4 36bpp, little-endian
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int ff_yuv2rgb_c_init_tables(SwsInternal *c, const int inv_table[4], int fullRange, int brightness, int contrast, int saturation)
#define AV_PIX_FMT_YUV420P9
@ AV_PIX_FMT_YUVA420P16BE
planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_PIX_FMT_YUV420P16
void ff_get_unscaled_swscale(SwsInternal *c)
Set c->convert_unscaled to an unscaled converter if one exists for the specific source and destinatio...
av_cold void ff_yuv2rgb_init_tables_ppc(SwsInternal *c, const int inv_table[4], int brightness, int contrast, int saturation)
static AVFormatContext * ctx
static const ScaleAlgorithm scale_algorithms[]
int flag
flag associated to the algorithm
@ 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_GBRP10LE
planar GBR 4:4:4 30bpp, little-endian
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
SwsVector * sws_getGaussianVec(double variance, double quality)
Return a normalized Gaussian curve used to filter stuff quality = 3 is high quality,...
@ AV_PIX_FMT_GBRAPF16LE
IEEE-754 half precision planar GBRA 4:4:4:4, 64bpp, little-endian.
#define AV_PIX_FMT_GRAYF32
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
int ff_init_hscaler_mmxext(int dstW, int xInc, uint8_t *filterCode, int16_t *filter, int32_t *filterPos, int numSplits)
@ AV_PIX_FMT_YUVA422P10LE
planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
@ AV_PIX_FMT_GBRP10MSBLE
planar GBR 4:4:4 30bpp, lowest bits zero, little-endian
static uint16_t * alloc_gamma_tbl(double e)
#define AV_PIX_FMT_GBRP16
#define SWS_SRC_V_CHR_DROP_SHIFT
Describe the class of an AVClass context structure.
int ff_free_filters(SwsInternal *c)
@ AV_PIX_FMT_GBRAPF32BE
IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian.
@ AV_PIX_FMT_GBRAP12BE
planar GBR 4:4:4:4 48bpp, big-endian
#define RETCODE_USE_CASCADE
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
New swscale design to change SwsGraph is what coordinates multiple passes These can include cascaded scaling error diffusion and so on Or we could have separate passes for the vertical and horizontal scaling In between each SwsPass lies a fully allocated image buffer Graph passes may have different levels of e g we can have a single threaded error diffusion pass following a multi threaded scaling pass SwsGraph is internally recreated whenever the image format
@ AV_PIX_FMT_GBRAPF16BE
IEEE-754 half precision planar GBRA 4:4:4:4, 64bpp, big-endian.
@ SWS_BICUBIC
2-tap cubic B-spline
int gamma_flag
Use gamma correct scaling.
@ 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_YA16LE
16 bits gray, 16 bits alpha (little-endian)
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
SwsFilter * sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, float lumaSharpen, float chromaSharpen, float chromaHShift, float chromaVShift, int verbose)
#define ROUNDED_DIV(a, b)
static uint16_t rgbgamma_tab[65536]
@ 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...
static void makenan_vec(SwsVector *a)
@ AV_PIX_FMT_YUVA444P9LE
planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
int src_range
Source is full range.
@ AV_PIX_FMT_YUVA420P16LE
planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
@ AV_PIX_FMT_RGB8
packed RGB 3:3:2, 8bpp, (msb)3R 3G 2B(lsb)
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
av_cold void ff_sws_rgb2rgb_init(void)
@ 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 ...
#define AV_PIX_FMT_YUV422P10
av_cold void ff_sws_init_range_convert(SwsInternal *c)
static void sws_addVec(SwsVector *a, SwsVector *b)
double * coeff
pointer to the list of coefficients
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
static int range_override_needed(enum AVPixelFormat format)
@ 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_GBRP12MSBLE
planar GBR 4:4:4 36bpp, lowest bits zero, little-endian
const AVClass ff_sws_context_class
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
int dst_h_chr_pos
Destination horizontal chroma position.
void sws_scaleVec(SwsVector *a, double scalar)
Scale all the coefficients of a by the scalar value.
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static SwsVector * sws_getConstVec(double c, int length)
Allocate and return a vector with length coefficients, all with the same value c.
@ AV_PIX_FMT_BGR4_BYTE
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
int av_opt_copy(void *dst, const void *src)
Copy options from src object into dest object.
@ SWS_SCALE_SINC
unwindowed sinc
@ AV_PIX_FMT_X2RGB10LE
packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined
#define SWS_PARAM_DEFAULT
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 ff_sws_graph_free(SwsGraph **pgraph)
Uninitialize any state associate with this filter graph and free it.
void ff_sws_slice_worker(void *priv, int jobnr, int threadnr, int nb_jobs, int nb_threads)
static int handle_0alpha(int *format)
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
#define PPC_ALTIVEC(flags)
@ AV_PIX_FMT_GBRP10MSBBE
planar GBR 4:4:4 30bpp, lowest bits zero, big-endian
SwsContext * sws_alloc_context(void)
Allocate an empty SwsContext and set its fields to default values.
static int shift(int a, int b)
av_cold int ff_sws_init_single_context(SwsContext *sws, SwsFilter *srcFilter, SwsFilter *dstFilter)
#define i(width, name, range_min, range_max)
static av_always_inline int isAnyRGB(enum AVPixelFormat pix_fmt)
@ AV_PIX_FMT_RGB444BE
packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined
@ AV_PIX_FMT_YA16BE
16 bits gray, 16 bits alpha (big-endian)
@ SWS_POINT
nearest neighbor
SwsAlphaBlend alpha_blend
Alpha blending mode.
@ AV_PIX_FMT_GRAY12LE
Y , 12bpp, little-endian.
#define AV_PIX_FMT_BGR555
@ SWS_SPLINE
unwindowed natural cubic spline
static av_always_inline int isYUV(enum AVPixelFormat pix_fmt)
int src_h
Width and height of the source frame.
@ AV_PIX_FMT_GBRP9BE
planar GBR 4:4:4 27bpp, big-endian
@ AV_PIX_FMT_GBRP12MSBBE
planar GBR 4:4:4 36bpp, lowest bits zero, big-endian
int ff_shuffle_filter_coefficients(SwsInternal *c, int *filterPos, int filterSize, int16_t *filter, int dstW)
int sws_getColorspaceDetails(SwsContext *sws, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation)
@ AV_PIX_FMT_BGR444BE
packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined
@ AV_PIX_FMT_GBRP9LE
planar GBR 4:4:4 27bpp, little-endian
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
@ AV_PIX_FMT_GBRAP10LE
planar GBR 4:4:4:4 40bpp, little-endian
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
int dst_format
Destination pixel format.
#define sws_isSupportedInput(x)
@ AV_PIX_FMT_YUVA420P10LE
planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
#define AV_LOG_INFO
Standard information.
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
@ 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_YUVA422P10BE
planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
static int handle_xyz(int *format)
@ AV_PIX_FMT_YUVA422P9BE
planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian
@ SWS_SCALE_POINT
nearest neighbor (point sampling)
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define AV_PIX_FMT_BGRA64
int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt)
@ 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...
const int32_t ff_yuv2rgb_coeffs[11][4]
static void sws_shiftVec(SwsVector *a, int shift)
void ff_sws_init_scale(SwsInternal *c)
#define AV_PIX_FMT_GBRP12
#define av_malloc_array(a, b)
@ AV_PIX_FMT_GRAY9BE
Y , 9bpp, big-endian.
SwsScaler scaler
Scaling filter.
static double getSplineCoeff(double a, double b, double c, double d, double dist)
@ 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_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...
SwsScaler scaler_sub
Scaler used specifically for up/downsampling subsampled (chroma) planes.
#define AV_PIX_FMT_BGR565
int dst_h
Width and height of the destination frame.
@ AV_PIX_FMT_RGB4_BYTE
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
@ AV_PIX_FMT_GBRPF32LE
IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian.
void * av_calloc(size_t nmemb, size_t size)
#define AV_PIX_FMT_YUV444P9
int ff_sws_init_altivec_bufs(SwsInternal *c)
void sws_freeFilter(SwsFilter *filter)
static av_always_inline int isFloat(enum AVPixelFormat pix_fmt)
@ SWS_SCALE_GAUSSIAN
2-tap gaussian approximation
@ AV_PIX_FMT_GBRAP16LE
planar GBRA 4:4:4:4 64bpp, little-endian
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
@ AV_PIX_FMT_GRAY12BE
Y , 12bpp, big-endian.
@ AV_PIX_FMT_0BGR
packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
#define FFSWAP(type, a, b)
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
@ AV_PIX_FMT_GRAYF32BE
IEEE-754 single precision Y, 32bpp, big-endian.
static uint16_t rgbgammainv_tab[4096]
@ SWS_FULL_CHR_H_INT
Perform full chroma upsampling when upscaling to RGB.
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.
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
@ AV_PIX_FMT_GBRP12BE
planar GBR 4:4:4 36bpp, big-endian
static av_cold void init_xyz_tables(void)
#define AV_CPU_FLAG_MMX
standard MMX
#define SWS_NUM_SCALER_PARAMS
Extra parameters for fine-tuning certain scalers.
static void fill_rgb2yuv_table(SwsInternal *c, const int table[4], int dstRange)
@ SWS_PRINT_INFO
Emit verbose log of scaling parameters.
@ SWS_SCALE_SPLINE
unwindowned natural cubic spline
@ SWS_ERROR_DIFFUSION
Set SwsContext.dither instead.
@ SWS_GAUSS
gaussian approximation
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
const char * description
human-readable description
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
#define INLINE_MMXEXT(flags)
@ AV_PIX_FMT_YUVA420P10BE
planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
@ AV_PIX_FMT_GRAY16LE
Y , 16bpp, little-endian.
@ AV_PIX_FMT_X2BGR10LE
packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), little-endian, X=unused/undefined
static av_always_inline int isBayer16BPS(enum AVPixelFormat pix_fmt)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
int ff_init_filters(SwsInternal *c)
@ AV_PIX_FMT_YUVA444P10LE
planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
int src_format
Source pixel format.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
const VDPAUPixFmtMap * map
int size_factor
size factor used when initing the filters
int dst_range
Destination is full range.
@ AV_PIX_FMT_GRAY14LE
Y , 14bpp, little-endian.
static SwsVector * sws_sumVec(SwsVector *a, SwsVector *b)
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
@ AV_PIX_FMT_GRAY14BE
Y , 14bpp, 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_YUVA422P16LE
planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
void sws_free_context(SwsContext **pctx)
Free the context and everything associated with it, and write NULL to the provided pointer.
@ AV_PIX_FMT_GBRP14LE
planar GBR 4:4:4 42bpp, little-endian
void ff_sws_free_altivec_bufs(SwsInternal *c)
@ AV_PIX_FMT_0RGB
packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
void avpriv_slicethread_free(AVSliceThread **pctx)
Destroy slice threading context.
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 const double coeff[2][5]
int src_h_chr_pos
Source horizontal chroma position.
@ SWS_SCALE_AREA
area averaging
static SwsInternal * sws_internal(const SwsContext *sws)
@ AV_PIX_FMT_GBRAP10BE
planar GBR 4:4:4:4 40bpp, big-endian
@ SWS_ACCURATE_RND
Force bit-exact output.
@ SWS_LANCZOS
3-tap sinc/sinc
#define atomic_init(obj, value)
@ AV_PIX_FMT_YUVA444P16LE
planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
@ AV_PIX_FMT_GBRPF16BE
IEEE-754 half precision planer GBR 4:4:4, 48bpp, big-endian.
int dst_v_chr_pos
Destination vertical chroma position.
@ SWS_SINC
unwindowed sinc
Main external API structure.
@ AV_PIX_FMT_BGR444LE
packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined
static int handle_formats(SwsContext *sws)
#define SWS_SRC_V_CHR_DROP_MASK
static double sws_dcVec(SwsVector *a)
void sws_normalizeVec(SwsVector *a, double height)
Scale all the coefficients of a so that their sum equals height.
@ AV_PIX_FMT_YUVA420P9BE
planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian
static uint16_t xyzgamma_tab[4096]
double scaler_params[SWS_NUM_SCALER_PARAMS]
static av_cold int get_local_pos(SwsInternal *s, int chr_subsample, int pos, int dir)
@ AV_PIX_FMT_GBRAP14LE
planar GBR 4:4:4:4 56bpp, little-endian
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
@ AV_PIX_FMT_GBRPF16LE
IEEE-754 half precision planer GBR 4:4:4, 48bpp, little-endian.
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.
static av_always_inline int isALPHA(enum AVPixelFormat pix_fmt)
@ 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_YUVA422P9LE
planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian
static int context_init_threaded(SwsContext *sws, SwsFilter *src_filter, SwsFilter *dst_filter)