|
|
|
@ -1807,6 +1807,91 @@ static void rgb24ToUV_half_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void planar_rgb_to_y(uint8_t *dst, const uint8_t *src[4], int width) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
for (i = 0; i < width; i++) { |
|
|
|
|
int g = src[0][i]; |
|
|
|
|
int b = src[1][i]; |
|
|
|
|
int r = src[2][i]; |
|
|
|
|
|
|
|
|
|
dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void planar_rgb16le_to_y(uint8_t *_dst, const uint8_t *_src[4], int width) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
const uint16_t **src = (const uint16_t **) _src; |
|
|
|
|
uint16_t *dst = (uint16_t *) _dst; |
|
|
|
|
for (i = 0; i < width; i++) { |
|
|
|
|
int g = AV_RL16(src[0] + i); |
|
|
|
|
int b = AV_RL16(src[1] + i); |
|
|
|
|
int r = AV_RL16(src[2] + i); |
|
|
|
|
|
|
|
|
|
dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void planar_rgb16be_to_y(uint8_t *_dst, const uint8_t *_src[4], int width) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
const uint16_t **src = (const uint16_t **) _src; |
|
|
|
|
uint16_t *dst = (uint16_t *) _dst; |
|
|
|
|
for (i = 0; i < width; i++) { |
|
|
|
|
int g = AV_RB16(src[0] + i); |
|
|
|
|
int b = AV_RB16(src[1] + i); |
|
|
|
|
int r = AV_RB16(src[2] + i); |
|
|
|
|
|
|
|
|
|
dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void planar_rgb_to_uv(uint8_t *dstU, uint8_t *dstV, const uint8_t *src[4], int width) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
for (i = 0; i < width; i++) { |
|
|
|
|
int g = src[0][i]; |
|
|
|
|
int b = src[1][i]; |
|
|
|
|
int r = src[2][i]; |
|
|
|
|
|
|
|
|
|
dstU[i] = (RU * r + GU * g + BU * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1); |
|
|
|
|
dstV[i] = (RV * r + GV * g + BV * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void planar_rgb16le_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src[4], int width) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
const uint16_t **src = (const uint16_t **) _src; |
|
|
|
|
uint16_t *dstU = (uint16_t *) _dstU; |
|
|
|
|
uint16_t *dstV = (uint16_t *) _dstV; |
|
|
|
|
for (i = 0; i < width; i++) { |
|
|
|
|
int g = AV_RL16(src[0] + i); |
|
|
|
|
int b = AV_RL16(src[1] + i); |
|
|
|
|
int r = AV_RL16(src[2] + i); |
|
|
|
|
|
|
|
|
|
dstU[i] = (RU * r + GU * g + BU * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1); |
|
|
|
|
dstV[i] = (RV * r + GV * g + BV * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void planar_rgb16be_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src[4], int width) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
const uint16_t **src = (const uint16_t **) _src; |
|
|
|
|
uint16_t *dstU = (uint16_t *) _dstU; |
|
|
|
|
uint16_t *dstV = (uint16_t *) _dstV; |
|
|
|
|
for (i = 0; i < width; i++) { |
|
|
|
|
int g = AV_RB16(src[0] + i); |
|
|
|
|
int b = AV_RB16(src[1] + i); |
|
|
|
|
int r = AV_RB16(src[2] + i); |
|
|
|
|
|
|
|
|
|
dstU[i] = (RU * r + GU * g + BU * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1); |
|
|
|
|
dstV[i] = (RV * r + GV * g + BV * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void hScale16To19_c(SwsContext *c, int16_t *_dst, int dstW, const uint8_t *_src, |
|
|
|
|
const int16_t *filter, |
|
|
|
|
const int16_t *filterPos, int filterSize) |
|
|
|
@ -1970,7 +2055,7 @@ static void hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth, |
|
|
|
|
|
|
|
|
|
// *** horizontal scale Y line to temp buffer
|
|
|
|
|
static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth, |
|
|
|
|
const uint8_t *src, int srcW, int xInc, |
|
|
|
|
const uint8_t *src_in[4], int srcW, int xInc, |
|
|
|
|
const int16_t *hLumFilter, |
|
|
|
|
const int16_t *hLumFilterPos, int hLumFilterSize, |
|
|
|
|
uint8_t *formatConvBuffer, |
|
|
|
@ -1978,10 +2063,14 @@ static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth, |
|
|
|
|
{ |
|
|
|
|
void (*toYV12)(uint8_t *, const uint8_t *, int, uint32_t *) = isAlpha ? c->alpToYV12 : c->lumToYV12; |
|
|
|
|
void (*convertRange)(int16_t *, int) = isAlpha ? NULL : c->lumConvertRange; |
|
|
|
|
const uint8_t *src = src_in[isAlpha ? 3 : 0]; |
|
|
|
|
|
|
|
|
|
if (toYV12) { |
|
|
|
|
toYV12(formatConvBuffer, src, srcW, pal); |
|
|
|
|
src= formatConvBuffer; |
|
|
|
|
} else if (c->readLumPlanar && !isAlpha) { |
|
|
|
|
c->readLumPlanar(formatConvBuffer, src_in, srcW); |
|
|
|
|
src = formatConvBuffer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!c->hyscale_fast) { |
|
|
|
@ -2010,16 +2099,22 @@ static void hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static av_always_inline void hcscale(SwsContext *c, int16_t *dst1, int16_t *dst2, int dstWidth, |
|
|
|
|
const uint8_t *src1, const uint8_t *src2, |
|
|
|
|
const uint8_t *src_in[4], |
|
|
|
|
int srcW, int xInc, const int16_t *hChrFilter, |
|
|
|
|
const int16_t *hChrFilterPos, int hChrFilterSize, |
|
|
|
|
uint8_t *formatConvBuffer, uint32_t *pal) |
|
|
|
|
{ |
|
|
|
|
const uint8_t *src1 = src_in[1], *src2 = src_in[2]; |
|
|
|
|
if (c->chrToYV12) { |
|
|
|
|
uint8_t *buf2 = formatConvBuffer + FFALIGN(srcW * FFALIGN(c->srcBpc, 8) >> 3, 16); |
|
|
|
|
c->chrToYV12(formatConvBuffer, buf2, src1, src2, srcW, pal); |
|
|
|
|
src1= formatConvBuffer; |
|
|
|
|
src2= buf2; |
|
|
|
|
} else if (c->readChrPlanar) { |
|
|
|
|
uint8_t *buf2 = formatConvBuffer + FFALIGN(srcW * FFALIGN(c->srcBpc, 8) >> 3, 16); |
|
|
|
|
c->readChrPlanar(formatConvBuffer, buf2, src_in, srcW); |
|
|
|
|
src1= formatConvBuffer; |
|
|
|
|
src2= buf2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!c->hcscale_fast) { |
|
|
|
@ -2420,8 +2515,12 @@ static int swScale(SwsContext *c, const uint8_t* src[], |
|
|
|
|
|
|
|
|
|
//Do horizontal scaling
|
|
|
|
|
while(lastInLumBuf < lastLumSrcY) { |
|
|
|
|
const uint8_t *src1= src[0]+(lastInLumBuf + 1 - srcSliceY)*srcStride[0]; |
|
|
|
|
const uint8_t *src2= src[3]+(lastInLumBuf + 1 - srcSliceY)*srcStride[3]; |
|
|
|
|
const uint8_t *src1[4] = { |
|
|
|
|
src[0] + (lastInLumBuf + 1 - srcSliceY) * srcStride[0], |
|
|
|
|
src[1] + (lastInLumBuf + 1 - srcSliceY) * srcStride[1], |
|
|
|
|
src[2] + (lastInLumBuf + 1 - srcSliceY) * srcStride[2], |
|
|
|
|
src[3] + (lastInLumBuf + 1 - srcSliceY) * srcStride[3], |
|
|
|
|
}; |
|
|
|
|
lumBufIndex++; |
|
|
|
|
assert(lumBufIndex < 2*vLumBufSize); |
|
|
|
|
assert(lastInLumBuf + 1 - srcSliceY < srcSliceH); |
|
|
|
@ -2431,7 +2530,7 @@ static int swScale(SwsContext *c, const uint8_t* src[], |
|
|
|
|
formatConvBuffer, |
|
|
|
|
pal, 0); |
|
|
|
|
if (CONFIG_SWSCALE_ALPHA && alpPixBuf) |
|
|
|
|
hyscale(c, alpPixBuf[ lumBufIndex ], dstW, src2, srcW, |
|
|
|
|
hyscale(c, alpPixBuf[ lumBufIndex ], dstW, src1, srcW, |
|
|
|
|
lumXInc, hLumFilter, hLumFilterPos, hLumFilterSize, |
|
|
|
|
formatConvBuffer, |
|
|
|
|
pal, 1); |
|
|
|
@ -2440,8 +2539,12 @@ static int swScale(SwsContext *c, const uint8_t* src[], |
|
|
|
|
lumBufIndex, lastInLumBuf); |
|
|
|
|
} |
|
|
|
|
while(lastInChrBuf < lastChrSrcY) { |
|
|
|
|
const uint8_t *src1= src[1]+(lastInChrBuf + 1 - chrSrcSliceY)*srcStride[1]; |
|
|
|
|
const uint8_t *src2= src[2]+(lastInChrBuf + 1 - chrSrcSliceY)*srcStride[2]; |
|
|
|
|
const uint8_t *src1[4] = { |
|
|
|
|
src[0] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[0], |
|
|
|
|
src[1] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[1], |
|
|
|
|
src[2] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[2], |
|
|
|
|
src[3] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[3], |
|
|
|
|
}; |
|
|
|
|
chrBufIndex++; |
|
|
|
|
assert(chrBufIndex < 2*vChrBufSize); |
|
|
|
|
assert(lastInChrBuf + 1 - chrSrcSliceY < (chrSrcSliceH)); |
|
|
|
@ -2450,7 +2553,7 @@ static int swScale(SwsContext *c, const uint8_t* src[], |
|
|
|
|
|
|
|
|
|
if (c->needs_hcscale) |
|
|
|
|
hcscale(c, chrUPixBuf[chrBufIndex], chrVPixBuf[chrBufIndex], |
|
|
|
|
chrDstW, src1, src2, chrSrcW, chrXInc, |
|
|
|
|
chrDstW, src1, chrSrcW, chrXInc, |
|
|
|
|
hChrFilter, hChrFilterPos, hChrFilterSize, |
|
|
|
|
formatConvBuffer, pal); |
|
|
|
|
lastInChrBuf++; |
|
|
|
@ -2580,6 +2683,13 @@ static av_cold void sws_init_swScale_c(SwsContext *c) |
|
|
|
|
case PIX_FMT_PAL8 : |
|
|
|
|
case PIX_FMT_BGR4_BYTE: |
|
|
|
|
case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV_c; break; |
|
|
|
|
case PIX_FMT_GBRP9LE: |
|
|
|
|
case PIX_FMT_GBRP10LE: |
|
|
|
|
case PIX_FMT_GBRP16LE: c->readChrPlanar = planar_rgb16le_to_uv; break; |
|
|
|
|
case PIX_FMT_GBRP9BE: |
|
|
|
|
case PIX_FMT_GBRP10BE: |
|
|
|
|
case PIX_FMT_GBRP16BE: c->readChrPlanar = planar_rgb16be_to_uv; break; |
|
|
|
|
case PIX_FMT_GBRP: c->readChrPlanar = planar_rgb_to_uv; break; |
|
|
|
|
#if HAVE_BIGENDIAN |
|
|
|
|
case PIX_FMT_YUV444P9LE: |
|
|
|
|
case PIX_FMT_YUV422P9LE: |
|
|
|
@ -2649,6 +2759,13 @@ static av_cold void sws_init_swScale_c(SwsContext *c) |
|
|
|
|
c->lumToYV12 = NULL; |
|
|
|
|
c->alpToYV12 = NULL; |
|
|
|
|
switch (srcFormat) { |
|
|
|
|
case PIX_FMT_GBRP9LE: |
|
|
|
|
case PIX_FMT_GBRP10LE: |
|
|
|
|
case PIX_FMT_GBRP16LE: c->readLumPlanar = planar_rgb16le_to_y; break; |
|
|
|
|
case PIX_FMT_GBRP9BE: |
|
|
|
|
case PIX_FMT_GBRP10BE: |
|
|
|
|
case PIX_FMT_GBRP16BE: c->readLumPlanar = planar_rgb16be_to_y; break; |
|
|
|
|
case PIX_FMT_GBRP: c->readLumPlanar = planar_rgb_to_y; break; |
|
|
|
|
#if HAVE_BIGENDIAN |
|
|
|
|
case PIX_FMT_YUV444P9LE: |
|
|
|
|
case PIX_FMT_YUV422P9LE: |
|
|
|
|