Go to the documentation of this file.
   40     {  36, 68,  60, 92,  34, 66,  58, 90, },
 
   41     { 100,  4, 124, 28,  98,  2, 122, 26, },
 
   42     {  52, 84,  44, 76,  50, 82,  42, 74, },
 
   43     { 116, 20, 108, 12, 114, 18, 106, 10, },
 
   44     {  32, 64,  56, 88,  38, 70,  62, 94, },
 
   45     {  96,  0, 120, 24, 102,  6, 126, 30, },
 
   46     {  48, 80,  40, 72,  54, 86,  46, 78, },
 
   47     { 112, 16, 104,  8, 118, 22, 110, 14, },
 
   48     {  36, 68,  60, 92,  34, 66,  58, 90, },
 
   52     64, 64, 64, 64, 64, 64, 64, 64
 
   68                            const int32_t *filterPos, 
int filterSize)
 
   73     const uint16_t *
src = (
const uint16_t *) _src;
 
   83     for (
i = 0; 
i < dstW; 
i++) {
 
   85         int srcPos = filterPos[
i];
 
   88         for (j = 0; j < filterSize; j++) {
 
   98                            const int32_t *filterPos, 
int filterSize)
 
  102     const uint16_t *
src = (
const uint16_t *) _src;
 
  103     int sh              = 
desc->comp[0].depth - 1;
 
  111     for (
i = 0; 
i < dstW; 
i++) {
 
  113         int srcPos = filterPos[
i];
 
  116         for (j = 0; j < filterSize; j++) {
 
  120         dst[
i] = 
FFMIN(
val >> sh, (1 << 15) - 1);
 
  127                           const int32_t *filterPos, 
int filterSize)
 
  130     for (
i = 0; 
i < dstW; 
i++) {
 
  132         int srcPos = filterPos[
i];
 
  134         for (j = 0; j < filterSize; j++) {
 
  143                           const int32_t *filterPos, 
int filterSize)
 
  147     for (
i = 0; 
i < dstW; 
i++) {
 
  149         int srcPos = filterPos[
i];
 
  151         for (j = 0; j < filterSize; j++) {
 
  164         dstU[
i] = (
FFMIN(dstU[
i], 30775) * 4663 - 9289992) >> 12; 
 
  165         dstV[
i] = (
FFMIN(dstV[
i], 30775) * 4663 - 9289992) >> 12; 
 
  173         dstU[
i] = (dstU[
i] * 1799 + 4081085) >> 11; 
 
  174         dstV[
i] = (dstV[
i] * 1799 + 4081085) >> 11; 
 
  182         dst[
i] = (
FFMIN(dst[
i], 30189) * 19077 - 39057361) >> 14;
 
  189         dst[
i] = (dst[
i] * 14071 + 33561947) >> 14;
 
  198         dstU[
i] = (
FFMIN(dstU[
i], 30775 << 4) * 4663 - (9289992 << 4)) >> 12; 
 
  199         dstV[
i] = (
FFMIN(dstV[
i], 30775 << 4) * 4663 - (9289992 << 4)) >> 12; 
 
  209         dstU[
i] = (dstU[
i] * 1799 + (4081085 << 4)) >> 11; 
 
  210         dstV[
i] = (dstV[
i] * 1799 + (4081085 << 4)) >> 11; 
 
  219         dst[
i] = ((
int)(
FFMIN(dst[
i], 30189 << 4) * 4769
U - (39057361 << 2))) >> 12;
 
  228         dst[
i] = (dst[
i]*(14071/4) + (33561947<<4)/4)>>12;
 
  232 #define DEBUG_SWSCALE_BUFFERS 0 
  233 #define DEBUG_BUFFERS(...)                      \ 
  234     if (DEBUG_SWSCALE_BUFFERS)                  \ 
  235         av_log(c, AV_LOG_DEBUG, __VA_ARGS__) 
  238                    int srcStride[], 
int srcSliceY,
 
  243     const int dstW                   = 
c->dstW;
 
  244     const int dstH                   = 
c->dstH;
 
  247     const int flags                  = 
c->flags;
 
  248     int32_t *vLumFilterPos           = 
c->vLumFilterPos;
 
  249     int32_t *vChrFilterPos           = 
c->vChrFilterPos;
 
  251     const int vLumFilterSize         = 
c->vLumFilterSize;
 
  252     const int vChrFilterSize         = 
c->vChrFilterSize;
 
  261     const int chrSrcSliceY           =                srcSliceY >> 
c->chrSrcVSubSample;
 
  263     int should_dither                = 
isNBPS(
c->srcFormat) ||
 
  269     int lastInLumBuf = 
c->lastInLumBuf;
 
  270     int lastInChrBuf = 
c->lastInChrBuf;
 
  273     int lumEnd = 
c->descIndex[0];
 
  274     int chrStart = lumEnd;
 
  275     int chrEnd = 
c->descIndex[1];
 
  277     int vEnd = 
c->numDesc;
 
  278     SwsSlice *src_slice = &
c->slice[lumStart];
 
  279     SwsSlice *hout_slice = &
c->slice[
c->numSlice-2];
 
  280     SwsSlice *vout_slice = &
c->slice[
c->numSlice-1];
 
  283     int needAlpha = 
c->needAlpha;
 
  294         srcStride[3] = srcStride[0];
 
  296     srcStride[1] *= 1 << 
c->vChrDrop;
 
  297     srcStride[2] *= 1 << 
c->vChrDrop;
 
  299     DEBUG_BUFFERS(
"swscale() %p[%d] %p[%d] %p[%d] %p[%d] -> %p[%d] %p[%d] %p[%d] %p[%d]\n",
 
  300                   src[0], srcStride[0], 
src[1], srcStride[1],
 
  301                   src[2], srcStride[2], 
src[3], srcStride[3],
 
  302                   dst[0], dstStride[0], dst[1], dstStride[1],
 
  303                   dst[2], dstStride[2], dst[3], dstStride[3]);
 
  304     DEBUG_BUFFERS(
"srcSliceY: %d srcSliceH: %d dstY: %d dstH: %d\n",
 
  307                   vLumFilterSize, vChrFilterSize);
 
  309     if (dstStride[0]&15 || dstStride[1]&15 ||
 
  310         dstStride[2]&15 || dstStride[3]&15) {
 
  311         static int warnedAlready = 0; 
 
  314                    "Warning: dstStride is not aligned!\n" 
  315                    "         ->cannot do aligned memory accesses anymore\n");
 
  320     if (   (uintptr_t)dst[0]&15 || (uintptr_t)dst[1]&15 || (uintptr_t)dst[2]&15
 
  321         || (uintptr_t)
src[0]&15 || (uintptr_t)
src[1]&15 || (uintptr_t)
src[2]&15
 
  322         || dstStride[0]&15 || dstStride[1]&15 || dstStride[2]&15 || dstStride[3]&15
 
  323         || srcStride[0]&15 || srcStride[1]&15 || srcStride[2]&15 || srcStride[3]&15
 
  325         static int warnedAlready=0;
 
  336     if (srcSliceY == 0) {
 
  342     if (!should_dither) {
 
  348                    yuv2packed1, yuv2packed2, yuv2packedX, yuv2anyX, 
c->use_mmx_vfilter);
 
  351             srcSliceY, 
srcSliceH, chrSrcSliceY, chrSrcSliceH, 1);
 
  354             dstY, dstH, dstY >> 
c->chrDstVSubSample,
 
  356     if (srcSliceY == 0) {
 
  366         hout_slice->
width = dstW;
 
  369     for (; dstY < dstH; dstY++) {
 
  370         const int chrDstY = dstY >> 
c->chrDstVSubSample;
 
  371         int use_mmx_vfilter= 
c->use_mmx_vfilter;
 
  374         const int firstLumSrcY  = 
FFMAX(1 - vLumFilterSize, vLumFilterPos[dstY]);
 
  375         const int firstLumSrcY2 = 
FFMAX(1 - vLumFilterSize, vLumFilterPos[
FFMIN(dstY | ((1 << 
c->chrDstVSubSample) - 1), dstH - 1)]);
 
  377         const int firstChrSrcY  = 
FFMAX(1 - vChrFilterSize, vChrFilterPos[chrDstY]);
 
  380         int lastLumSrcY  = 
FFMIN(
c->srcH,    firstLumSrcY  + vLumFilterSize) - 1;
 
  381         int lastLumSrcY2 = 
FFMIN(
c->srcH,    firstLumSrcY2 + vLumFilterSize) - 1;
 
  382         int lastChrSrcY  = 
FFMIN(
c->chrSrcH, firstChrSrcY  + vChrFilterSize) - 1;
 
  386         int posY, cPosY, firstPosY, lastPosY, firstCPosY, lastCPosY;
 
  389         if (firstLumSrcY > lastInLumBuf) {
 
  391             hasLumHoles = lastInLumBuf != firstLumSrcY - 1;
 
  399             lastInLumBuf = firstLumSrcY - 1;
 
  401         if (firstChrSrcY > lastInChrBuf) {
 
  403             hasChrHoles = lastInChrBuf != firstChrSrcY - 1;
 
  411             lastInChrBuf = firstChrSrcY - 1;
 
  415         DEBUG_BUFFERS(
"\tfirstLumSrcY: %d lastLumSrcY: %d lastInLumBuf: %d\n",
 
  416                       firstLumSrcY, lastLumSrcY, lastInLumBuf);
 
  417         DEBUG_BUFFERS(
"\tfirstChrSrcY: %d lastChrSrcY: %d lastInChrBuf: %d\n",
 
  418                       firstChrSrcY, lastChrSrcY, lastInChrBuf);
 
  421         enough_lines = lastLumSrcY2 < srcSliceY + 
srcSliceH &&
 
  426             lastChrSrcY = chrSrcSliceY + chrSrcSliceH - 1;
 
  427             DEBUG_BUFFERS(
"buffering slice: lastLumSrcY %d lastChrSrcY %d\n",
 
  428                           lastLumSrcY, lastChrSrcY);
 
  436         if (posY <= lastLumSrcY && !hasLumHoles) {
 
  437             firstPosY = 
FFMAX(firstLumSrcY, posY);
 
  441             lastPosY = lastLumSrcY;
 
  445         if (cPosY <= lastChrSrcY && !hasChrHoles) {
 
  446             firstCPosY = 
FFMAX(firstChrSrcY, cPosY);
 
  450             lastCPosY = lastChrSrcY;
 
  455         if (posY < lastLumSrcY + 1) {
 
  456             for (
i = lumStart; 
i < lumEnd; ++
i)
 
  460         lastInLumBuf = lastLumSrcY;
 
  462         if (cPosY < lastChrSrcY + 1) {
 
  463             for (
i = chrStart; 
i < chrEnd; ++
i)
 
  467         lastInChrBuf = lastChrSrcY;
 
  479         if (dstY >= dstH - 2) {
 
  483                                      &yuv2packed1, &yuv2packed2, &yuv2packedX, &yuv2anyX);
 
  486                            yuv2packed1, yuv2packed2, yuv2packedX, yuv2anyX, use_mmx_vfilter);
 
  490             for (
i = vStart; 
i < vEnd; ++
i)
 
  496         int height = dstY - lastDstY;
 
  501                     1, 
desc->comp[3].depth,
 
  503         } 
else if (
is32BPS(dstFormat)) {
 
  506                     1, 
desc->comp[3].depth,
 
  512 #if HAVE_MMXEXT_INLINE 
  514         __asm__ 
volatile (
"sfence" ::: 
"memory");
 
  520     c->lastInLumBuf = lastInLumBuf;
 
  521     c->lastInChrBuf = lastInChrBuf;
 
  523     return dstY - lastDstY;
 
  528     c->lumConvertRange = 
NULL;
 
  529     c->chrConvertRange = 
NULL;
 
  530     if (
c->srcRange != 
c->dstRange && !
isAnyRGB(
c->dstFormat)) {
 
  531         if (
c->dstBpc <= 14) {
 
  556                              &
c->yuv2nv12cX, &
c->yuv2packed1,
 
  557                              &
c->yuv2packed2, &
c->yuv2packedX, &
c->yuv2anyX);
 
  561     if (
c->srcBpc == 8) {
 
  562         if (
c->dstBpc <= 14) {
 
  580         c->needs_hcscale = 1;
 
  612                                 const int linesizes[4])
 
  619     for (
i = 0; 
i < 4; 
i++) {
 
  620         int plane = 
desc->comp[
i].plane;
 
  621         if (!
data[plane] || !linesizes[plane])
 
  634     for (yp=0; yp<
h; yp++) {
 
  635         for (xp=0; xp+2<
stride; xp+=3) {
 
  636             int x, y, z, 
r, 
g, 
b;
 
  648             x = 
c->xyzgamma[x>>4];
 
  649             y = 
c->xyzgamma[y>>4];
 
  650             z = 
c->xyzgamma[z>>4];
 
  653             r = 
c->xyz2rgb_matrix[0][0] * x +
 
  654                 c->xyz2rgb_matrix[0][1] * y +
 
  655                 c->xyz2rgb_matrix[0][2] * z >> 12;
 
  656             g = 
c->xyz2rgb_matrix[1][0] * x +
 
  657                 c->xyz2rgb_matrix[1][1] * y +
 
  658                 c->xyz2rgb_matrix[1][2] * z >> 12;
 
  659             b = 
c->xyz2rgb_matrix[2][0] * x +
 
  660                 c->xyz2rgb_matrix[2][1] * y +
 
  661                 c->xyz2rgb_matrix[2][2] * z >> 12;
 
  664             r = av_clip_uintp2(
r, 12);
 
  665             g = av_clip_uintp2(
g, 12);
 
  666             b = av_clip_uintp2(
b, 12);
 
  670                 AV_WB16(dst + xp + 0, 
c->rgbgamma[
r] << 4);
 
  671                 AV_WB16(dst + xp + 1, 
c->rgbgamma[
g] << 4);
 
  672                 AV_WB16(dst + xp + 2, 
c->rgbgamma[
b] << 4);
 
  674                 AV_WL16(dst + xp + 0, 
c->rgbgamma[
r] << 4);
 
  675                 AV_WL16(dst + xp + 1, 
c->rgbgamma[
g] << 4);
 
  676                 AV_WL16(dst + xp + 2, 
c->rgbgamma[
b] << 4);
 
  690     for (yp=0; yp<
h; yp++) {
 
  691         for (xp=0; xp+2<
stride; xp+=3) {
 
  692             int x, y, z, 
r, 
g, 
b;
 
  704             r = 
c->rgbgammainv[
r>>4];
 
  705             g = 
c->rgbgammainv[
g>>4];
 
  706             b = 
c->rgbgammainv[
b>>4];
 
  709             x = 
c->rgb2xyz_matrix[0][0] * 
r +
 
  710                 c->rgb2xyz_matrix[0][1] * 
g +
 
  711                 c->rgb2xyz_matrix[0][2] * 
b >> 12;
 
  712             y = 
c->rgb2xyz_matrix[1][0] * 
r +
 
  713                 c->rgb2xyz_matrix[1][1] * 
g +
 
  714                 c->rgb2xyz_matrix[1][2] * 
b >> 12;
 
  715             z = 
c->rgb2xyz_matrix[2][0] * 
r +
 
  716                 c->rgb2xyz_matrix[2][1] * 
g +
 
  717                 c->rgb2xyz_matrix[2][2] * 
b >> 12;
 
  720             x = av_clip_uintp2(x, 12);
 
  721             y = av_clip_uintp2(y, 12);
 
  722             z = av_clip_uintp2(z, 12);
 
  726                 AV_WB16(dst + xp + 0, 
c->xyzgammainv[x] << 4);
 
  727                 AV_WB16(dst + xp + 1, 
c->xyzgammainv[y] << 4);
 
  728                 AV_WB16(dst + xp + 2, 
c->xyzgammainv[z] << 4);
 
  730                 AV_WL16(dst + xp + 0, 
c->xyzgammainv[x] << 4);
 
  731                 AV_WL16(dst + xp + 1, 
c->xyzgammainv[y] << 4);
 
  732                 AV_WL16(dst + xp + 2, 
c->xyzgammainv[z] << 4);
 
  745                                   const uint8_t * 
const srcSlice[],
 
  746                                   const int srcStride[], 
int srcSliceY,
 
  748                                   const int dstStride[])
 
  754     int macro_height = 
isBayer(
c->srcFormat) ? 2 : (1 << 
c->chrSrcVSubSample);
 
  758     int srcSliceY_internal = srcSliceY;
 
  760     if (!srcStride || !dstStride || !dst || !srcSlice) {
 
  761         av_log(
c, 
AV_LOG_ERROR, 
"One of the input parameters to sws_scale() is NULL, please check the calling code\n");
 
  765     for (
i=0; 
i<4; 
i++) {
 
  766         srcStride2[
i] = srcStride[
i];
 
  767         dstStride2[
i] = dstStride[
i];
 
  770     if ((srcSliceY & (macro_height-1)) ||
 
  777     if (
c->gamma_flag && 
c->cascaded_context[0]) {
 
  779                     srcSlice, srcStride, srcSliceY, 
srcSliceH,
 
  780                     c->cascaded_tmp, 
c->cascaded_tmpStride);
 
  785         if (
c->cascaded_context[2])
 
  786             ret = 
sws_scale(
c->cascaded_context[1], (
const uint8_t * 
const *)
c->cascaded_tmp, 
c->cascaded_tmpStride, srcSliceY, 
srcSliceH, 
c->cascaded1_tmp, 
c->cascaded1_tmpStride);
 
  793         if (
c->cascaded_context[2]) {
 
  795                         (
const uint8_t * 
const *)
c->cascaded1_tmp, 
c->cascaded1_tmpStride, 
c->cascaded_context[1]->dstY - 
ret, 
c->cascaded_context[1]->dstY,
 
  801     if (
c->cascaded_context[0] && srcSliceY == 0 && 
srcSliceH == 
c->cascaded_context[0]->srcH) {
 
  803                         srcSlice, srcStride, srcSliceY, 
srcSliceH,
 
  804                         c->cascaded_tmp, 
c->cascaded_tmpStride);
 
  808                         (
const uint8_t * 
const * )
c->cascaded_tmp, 
c->cascaded_tmpStride, 0, 
c->cascaded_context[0]->dstH,
 
  813     memcpy(src2, srcSlice, 
sizeof(src2));
 
  814     memcpy(dst2, dst, 
sizeof(dst2));
 
  829     if (
c->sliceDir == 0 && srcSliceY != 0 && srcSliceY + 
srcSliceH != 
c->srcH) {
 
  833     if (
c->sliceDir == 0) {
 
  834         if (srcSliceY == 0) 
c->sliceDir = 1; 
else c->sliceDir = -1;
 
  838         for (
i = 0; 
i < 256; 
i++) {
 
  839             int r, 
g, 
b, y, 
u, v, 
a = 0xff;
 
  841                 uint32_t p = ((
const uint32_t *)(srcSlice[1]))[
i];
 
  842                 a = (p >> 24) & 0xFF;
 
  843                 r = (p >> 16) & 0xFF;
 
  848                 g = ((
i >> 2) & 7) * 36;
 
  852                 g = ((
i >> 3) & 7) * 36;
 
  855                 r = ( 
i >> 3     ) * 255;
 
  856                 g = ((
i >> 1) & 3) * 85;
 
  862                 b = ( 
i >> 3     ) * 255;
 
  863                 g = ((
i >> 1) & 3) * 85;
 
  866 #define RGB2YUV_SHIFT 15 
  867 #define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 
  868 #define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 
  869 #define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 
  870 #define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 
  871 #define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 
  872 #define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 
  873 #define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 
  874 #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 
  875 #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 
  880             c->pal_yuv[
i]= y + (
u<<8) + (v<<16) + ((unsigned)
a<<24);
 
  882             switch (
c->dstFormat) {
 
  887                 c->pal_rgb[
i]=  
r + (
g<<8) + (
b<<16) + ((unsigned)
a<<24);
 
  893                 c->pal_rgb[
i]= 
a + (
r<<8) + (
g<<16) + ((unsigned)
b<<24);
 
  899                 c->pal_rgb[
i]= 
a + (
b<<8) + (
g<<16) + ((unsigned)
r<<24);
 
  906                 c->pal_rgb[
i]=  
b + (
g<<8) + (
r<<16) + ((unsigned)
a<<24);
 
  911     if (
c->src0Alpha && !
c->dst0Alpha && 
isALPHA(
c->dstFormat)) {
 
  918         base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (
srcSliceH-1) : rgb0_tmp;
 
  920             memcpy(
base + srcStride[0]*y, src2[0] + srcStride[0]*y, 4*
c->srcW);
 
  921             for (x=
c->src0Alpha-1; x<4*c->srcW; x+=4) {
 
  922                 base[ srcStride[0]*y + x] = 0xFF;
 
  928     if (
c->srcXYZ && !(
c->dstXYZ && 
c->srcW==
c->dstW && 
c->srcH==
c->dstH)) {
 
  934         base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (
srcSliceH-1) : rgb0_tmp;
 
  941         for (
i = 0; 
i < 4; 
i++)
 
  942             memset(
c->dither_error[
i], 0, 
sizeof(
c->dither_error[0][0]) * (
c->dstW+2));
 
  944     if (
c->sliceDir != 1) {
 
  946         for (
i=0; 
i<4; 
i++) {
 
  951         src2[0] += (
srcSliceH - 1) * srcStride[0];
 
  953             src2[1] += ((
srcSliceH >> 
c->chrSrcVSubSample) - 1) * srcStride[1];
 
  954         src2[2] += ((
srcSliceH >> 
c->chrSrcVSubSample) - 1) * srcStride[2];
 
  955         src2[3] += (
srcSliceH - 1) * srcStride[3];
 
  956         dst2[0] += ( 
c->dstH                         - 1) * dstStride[0];
 
  957         dst2[1] += ((
c->dstH >> 
c->chrDstVSubSample) - 1) * dstStride[1];
 
  958         dst2[2] += ((
c->dstH >> 
c->chrDstVSubSample) - 1) * dstStride[2];
 
  959         dst2[3] += ( 
c->dstH                         - 1) * dstStride[3];
 
  961         srcSliceY_internal = 
c->srcH-srcSliceY-
srcSliceH;
 
  967     if (srcSliceY_internal + 
srcSliceH == 
c->srcH)
 
  969     ret = 
c->swscale(
c, src2, srcStride2, srcSliceY_internal, 
srcSliceH, dst2, dstStride2);
 
  971     if (
c->dstXYZ && !(
c->srcXYZ && 
c->srcW==
c->dstW && 
c->srcH==
c->dstH)) {
 
  972         int dstY = 
c->dstY ? 
c->dstY : srcSliceY + 
srcSliceH;
 
  973         uint16_t *dst16 = (uint16_t*)(dst2[0] + (dstY - 
ret) * dstStride2[0]);
 
  
static av_always_inline int isBayer(enum AVPixelFormat pix_fmt)
 
void(* yuv2packed2_fn)(struct SwsContext *c, const int16_t *lumSrc[2], const int16_t *chrUSrc[2], const int16_t *chrVSrc[2], const int16_t *alpSrc[2], uint8_t *dest, int dstW, int yalpha, int uvalpha, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output by doing bilinear scalin...
 
void(* yuv2planar1_fn)(const int16_t *src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
Write one line of horizontally scaled data to planar output without any additional vertical scaling (...
 
#define AV_LOG_WARNING
Something somehow does not look correct.
 
static void process(NormalizeContext *s, AVFrame *in, AVFrame *out)
 
void(* yuv2packed1_fn)(struct SwsContext *c, const int16_t *lumSrc, const int16_t *chrUSrc[2], const int16_t *chrVSrc[2], const int16_t *alpSrc, uint8_t *dest, int dstW, int uvalpha, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output without any additional v...
 
AVPixelFormat
Pixel format.
 
int sliceH
number of lines
 
static void hScale16To19_c(SwsContext *c, int16_t *_dst, int dstW, const uint8_t *_src, const int16_t *filter, const int32_t *filterPos, int filterSize)
 
static av_always_inline int isPacked(enum AVPixelFormat pix_fmt)
 
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
 
static void chrRangeFromJpeg16_c(int16_t *_dstU, int16_t *_dstV, int width)
 
#define u(width, name, range_min, range_max)
 
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
 
void ff_hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth, const uint8_t *src, int srcW, int xInc)
 
int ff_rotate_slice(SwsSlice *s, int lum, int chr)
 
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
 
SwsPlane plane[MAX_SLICE_PLANES]
color planes
 
static void hScale8To15_c(SwsContext *c, int16_t *dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
 
void ff_sws_init_input_funcs(SwsContext *c)
 
Struct which holds all necessary data for processing a slice.
 
static void FUNC() yuv2planeX(const int16_t *filter, int filterSize, const int16_t **src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
 
@ AV_PIX_FMT_MONOWHITE
Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb.
 
#define AV_PIX_FMT_RGB32_1
 
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
 
int attribute_align_arg sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
swscale wrapper, so we don't need to export the SwsContext.
 
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
 
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
 
#define DEBUG_BUFFERS(...)
 
static atomic_int cpu_flags
 
static void xyz12Torgb48(struct SwsContext *c, uint16_t *dst, const uint16_t *src, int stride, int h)
 
#define SWS_FAST_BILINEAR
 
static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
 
av_cold void ff_sws_init_swscale_aarch64(SwsContext *c)
 
int(* SwsFunc)(struct SwsContext *context, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
 
void(* yuv2anyX_fn)(struct SwsContext *c, const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, const int16_t *chrFilter, const int16_t **chrUSrc, const int16_t **chrVSrc, int chrFilterSize, const int16_t **alpSrc, uint8_t **dest, int dstW, int y)
Write one line of horizontally scaled Y/U/V/A to YUV/RGB output by doing multi-point vertical scaling...
 
static void hScale8To19_c(SwsContext *c, int16_t *_dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
 
static double val(void *priv, double ch)
 
static av_always_inline int isNBPS(enum AVPixelFormat pix_fmt)
 
@ AV_PIX_FMT_BGR8
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
 
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
 
static av_cold void sws_init_swscale(SwsContext *c)
 
#define AV_CEIL_RSHIFT(a, b)
 
av_cold void ff_sws_init_swscale_arm(SwsContext *c)
 
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 format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
 
int width
Slice line width.
 
#define av_assert0(cond)
assert() equivalent, that is always enabled.
 
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
 
static void lumRangeFromJpeg_c(int16_t *dst, int width)
 
static enum AVPixelFormat pix_fmt
 
void ff_init_vscale_pfn(SwsContext *c, yuv2planar1_fn yuv2plane1, yuv2planarX_fn yuv2planeX, yuv2interleavedX_fn yuv2nv12cX, yuv2packed1_fn yuv2packed1, yuv2packed2_fn yuv2packed2, yuv2packedX_fn yuv2packedX, yuv2anyX_fn yuv2anyX, int use_mmx)
setup vertical scaler functions
 
#define AV_PIX_FMT_BGR32_1
 
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
 
av_cold void ff_sws_init_range_convert(SwsContext *c)
 
@ AV_PIX_FMT_GRAY8A
alias for AV_PIX_FMT_YA8
 
static av_always_inline void fillPlane(uint8_t *plane, int stride, int width, int height, int y, uint8_t val)
 
int available_lines
max number of lines that can be hold by this plane
 
av_cold void ff_sws_init_swscale_x86(SwsContext *c)
 
@ AV_PIX_FMT_MONOBLACK
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb.
 
@ AV_PIX_FMT_RGB8
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
 
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
 
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
 
@ AV_PIX_FMT_BGR4_BYTE
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
 
static void chrRangeToJpeg_c(int16_t *dstU, int16_t *dstV, int width)
 
#define AV_CPU_FLAG_SSE2
PIV SSE2 functions.
 
SwsFunc ff_getSwsFunc(SwsContext *c)
Return function pointer to fastest main scaler path function depending on architecture and available ...
 
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
 
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
 
static void fillPlane16(uint8_t *plane, int stride, int width, int height, int y, int alpha, int bits, const int big_endian)
 
static av_always_inline int usePal(enum AVPixelFormat pix_fmt)
 
static av_always_inline int isAnyRGB(enum AVPixelFormat pix_fmt)
 
static void hScale16To15_c(SwsContext *c, int16_t *dst, int dstW, const uint8_t *_src, const int16_t *filter, const int32_t *filterPos, int filterSize)
 
static void chrRangeToJpeg16_c(int16_t *_dstU, int16_t *_dstV, int width)
 
static int swscale(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
 
static av_always_inline int is32BPS(enum AVPixelFormat pix_fmt)
 
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
 
void ff_hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2, int dstWidth, const uint8_t *src1, const uint8_t *src2, int srcW, int xInc)
 
static void fillPlane32(uint8_t *plane, int stride, int width, int height, int y, int alpha, int bits, const int big_endian, int is_float)
 
#define DECLARE_ALIGNED(n, t, v)
 
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
 
#define i(width, name, range_min, range_max)
 
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
 
static int check_image_pointers(const uint8_t *const data[4], enum AVPixelFormat pix_fmt, const int linesizes[4])
 
#define AV_PIX_FMT_FLAG_BE
Pixel format is big-endian.
 
@ AV_PIX_FMT_RGB4_BYTE
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
 
Struct which defines a slice of an image to be scaled or an output for a scaled slice.
 
int ff_init_slice_from_src(SwsSlice *s, uint8_t *src[4], int stride[4], int srcW, int lumY, int lumH, int chrY, int chrH, int relative)
 
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
 
av_cold void ff_sws_init_output_funcs(SwsContext *c, yuv2planar1_fn *yuv2plane1, yuv2planarX_fn *yuv2planeX, yuv2interleavedX_fn *yuv2nv12cX, yuv2packed1_fn *yuv2packed1, yuv2packed2_fn *yuv2packed2, yuv2packedX_fn *yuv2packedX, yuv2anyX_fn *yuv2anyX)
 
static const uint8_t sws_pb_64[8]
 
av_cold void ff_sws_init_swscale_ppc(SwsContext *c)
 
void(* yuv2planarX_fn)(const int16_t *filter, int filterSize, const int16_t **src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
Write one line of horizontally scaled data to planar output with multi-point vertical scaling between...
 
void(* yuv2interleavedX_fn)(struct SwsContext *c, const int16_t *chrFilter, int chrFilterSize, const int16_t **chrUSrc, const int16_t **chrVSrc, uint8_t *dest, int dstW)
Write one line of horizontally scaled chroma to interleaved output with multi-point vertical scaling ...
 
static void reset_ptr(const uint8_t *src[], enum AVPixelFormat format)
 
void(* yuv2packedX_fn)(struct SwsContext *c, const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, const int16_t *chrFilter, const int16_t **chrUSrc, const int16_t **chrVSrc, int chrFilterSize, const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output by doing multi-point ver...
 
const uint8_t ff_dither_8x8_128[9][8]
 
#define AV_CPU_FLAG_MMXEXT
SSE integer functions or AMD MMX ext.
 
static void lumRangeToJpeg_c(int16_t *dst, int width)
 
static void lumRangeFromJpeg16_c(int16_t *_dst, int width)
 
static void lumRangeToJpeg16_c(int16_t *_dst, int width)
 
int sliceY
index of first line
 
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
 
static void chrRangeFromJpeg_c(int16_t *dstU, int16_t *dstV, int width)
 
#define flags(name, subs,...)
 
void ff_updateMMXDitherTables(SwsContext *c, int dstY)
 
static av_always_inline int isPlanar(enum AVPixelFormat pix_fmt)
 
static void rgb48Toxyz12(struct SwsContext *c, uint16_t *dst, const uint16_t *src, int stride, int h)
 
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16