Split out yuv2yuv1 luma and chroma in order to make them generic DSP functions
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
parent
9abc98737f
commit
34e8d147b3
@ -386,34 +386,14 @@ static void yuv2yuvX_c(SwsContext *c, const int16_t *lumFilter,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void yuv2yuv1_c(SwsContext *c, const int16_t *lumSrc,
|
static void yuv2yuv1_c(const int16_t *src, uint8_t *dest, int dstW,
|
||||||
const int16_t *chrUSrc, const int16_t *chrVSrc,
|
const uint8_t *dither, int offset)
|
||||||
const int16_t *alpSrc,
|
|
||||||
uint8_t *dest[4], int dstW, int chrDstW)
|
|
||||||
{
|
{
|
||||||
uint8_t *yDest = dest[0], *uDest = dest[1], *vDest = dest[2],
|
|
||||||
*aDest = CONFIG_SWSCALE_ALPHA ? dest[3] : NULL;
|
|
||||||
int i;
|
int i;
|
||||||
const uint8_t *lumDither = c->lumDither8, *chrDither = c->chrDither8;
|
|
||||||
|
|
||||||
for (i=0; i<dstW; i++) {
|
for (i=0; i<dstW; i++) {
|
||||||
int val = (lumSrc[i]+ lumDither[i & 7]) >> 7;
|
int val = (src[i] + dither[(i + offset) & 7]) >> 7;
|
||||||
yDest[i]= av_clip_uint8(val);
|
dest[i]= av_clip_uint8(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uDest)
|
|
||||||
for (i=0; i<chrDstW; i++) {
|
|
||||||
int u = (chrUSrc[i] + chrDither[i & 7]) >> 7;
|
|
||||||
int v = (chrVSrc[i] + chrDither[(i + 3) & 7]) >> 7;
|
|
||||||
uDest[i]= av_clip_uint8(u);
|
|
||||||
vDest[i]= av_clip_uint8(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CONFIG_SWSCALE_ALPHA && aDest)
|
|
||||||
for (i=0; i<dstW; i++) {
|
|
||||||
int val = (alpSrc[i] + lumDither[i & 7]) >> 7;
|
|
||||||
aDest[i]= av_clip_uint8(val);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void yuv2nv12X_c(SwsContext *c, const int16_t *lumFilter,
|
static void yuv2nv12X_c(SwsContext *c, const int16_t *lumFilter,
|
||||||
@ -2582,10 +2562,18 @@ static int swScale(SwsContext *c, const uint8_t* src[],
|
|||||||
const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
|
const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
|
||||||
if ((dstY&chrSkipMask) || isGray(dstFormat))
|
if ((dstY&chrSkipMask) || isGray(dstFormat))
|
||||||
dest[1] = dest[2] = NULL; //FIXME split functions in lumi / chromi
|
dest[1] = dest[2] = NULL; //FIXME split functions in lumi / chromi
|
||||||
|
const int16_t *alpBuf= (CONFIG_SWSCALE_ALPHA && alpPixBuf) ? alpSrcPtr[0] : NULL;
|
||||||
|
|
||||||
if (c->yuv2yuv1 && vLumFilterSize == 1 && vChrFilterSize == 1) { // unscaled YV12
|
if (c->yuv2yuv1 && vLumFilterSize == 1 && vChrFilterSize == 1) { // unscaled YV12
|
||||||
const int16_t *alpBuf= (CONFIG_SWSCALE_ALPHA && alpPixBuf) ? alpSrcPtr[0] : NULL;
|
yuv2yuv1(lumSrcPtr[0], dest[0], dstW, c->lumDither8, 0);
|
||||||
yuv2yuv1(c, lumSrcPtr[0], chrUSrcPtr[0], chrVSrcPtr[0], alpBuf,
|
|
||||||
dest, dstW, chrDstW);
|
if (dest[1]){
|
||||||
|
yuv2yuv1(chrUSrcPtr[0], dest[1], chrDstW, c->chrDither8, 0);
|
||||||
|
yuv2yuv1(chrVSrcPtr[0], dest[2], chrDstW, c->chrDither8, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alpBuf && dest[3])
|
||||||
|
yuv2yuv1(alpBuf, dest[3], dstW, c->lumDither8, 0);
|
||||||
} else { //General YV12
|
} else { //General YV12
|
||||||
yuv2yuvX(c, vLumFilter + dstY * vLumFilterSize,
|
yuv2yuvX(c, vLumFilter + dstY * vLumFilterSize,
|
||||||
lumSrcPtr, vLumFilterSize,
|
lumSrcPtr, vLumFilterSize,
|
||||||
|
@ -59,28 +59,22 @@ typedef int (*SwsFunc)(struct SwsContext *context, const uint8_t* src[],
|
|||||||
int srcStride[], int srcSliceY, int srcSliceH,
|
int srcStride[], int srcSliceY, int srcSliceH,
|
||||||
uint8_t* dst[], int dstStride[]);
|
uint8_t* dst[], int dstStride[]);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write one line of horizontally scaled Y/U/V/A to planar output
|
* Write one line of horizontally scaled data to planar output
|
||||||
* without any additional vertical scaling (or point-scaling).
|
* without any additional vertical scaling (or point-scaling).
|
||||||
*
|
*
|
||||||
* @param c SWS scaling context
|
* @param src scaled source data, 15bit for 8-10bit output,
|
||||||
* @param lumSrc scaled luma (Y) source data, 15bit for 8-10bit output,
|
|
||||||
* 19-bit for 16bit output (in int32_t)
|
* 19-bit for 16bit output (in int32_t)
|
||||||
* @param chrUSrc scaled chroma (U) source data, 15bit for 8-10bit output,
|
* @param dest pointer to the output plane. For >8bit
|
||||||
* 19-bit for 16bit output (in int32_t)
|
|
||||||
* @param chrVSrc scaled chroma (V) source data, 15bit for 8-10bit output,
|
|
||||||
* 19-bit for 16bit output (in int32_t)
|
|
||||||
* @param alpSrc scaled alpha (A) source data, 15bit for 8-10bit output,
|
|
||||||
* 19-bit for 16bit output (in int32_t)
|
|
||||||
* @param dest pointer to the 4 output planes (Y/U/V/A). For >8bit
|
|
||||||
* output, this is in uint16_t
|
* output, this is in uint16_t
|
||||||
* @param dstW width of dest[0], dest[3], lumSrc and alpSrc in pixels
|
* @param dstW width of destination in pixels
|
||||||
* @param chrDstW width of dest[1], dest[2], chrUSrc and chrVSrc
|
* @param dither ordered dither array of type int16_t and size 8
|
||||||
|
* @param offset Dither offset
|
||||||
*/
|
*/
|
||||||
typedef void (*yuv2planar1_fn) (struct SwsContext *c,
|
typedef void (*yuv2planar1_fn) (const int16_t *src, uint8_t *dest, int dstW,
|
||||||
const int16_t *lumSrc, const int16_t *chrUSrc,
|
const uint8_t *dither, int offset);
|
||||||
const int16_t *chrVSrc, const int16_t *alpSrc,
|
|
||||||
uint8_t *dest[4], int dstW, int chrDstW);
|
|
||||||
/**
|
/**
|
||||||
* Write one line of horizontally scaled Y/U/V/A to planar output
|
* Write one line of horizontally scaled Y/U/V/A to planar output
|
||||||
* with multi-point vertical scaling between input pixels.
|
* with multi-point vertical scaling between input pixels.
|
||||||
|
@ -2103,8 +2103,8 @@ static av_cold void RENAME(sws_init_swScale)(SwsContext *c)
|
|||||||
dstFormat != PIX_FMT_NV12 && dstFormat != PIX_FMT_NV21) {
|
dstFormat != PIX_FMT_NV12 && dstFormat != PIX_FMT_NV21) {
|
||||||
if (!(c->flags & SWS_BITEXACT)) {
|
if (!(c->flags & SWS_BITEXACT)) {
|
||||||
if (c->flags & SWS_ACCURATE_RND) {
|
if (c->flags & SWS_ACCURATE_RND) {
|
||||||
c->yuv2yuv1 = RENAME(yuv2yuv1_ar );
|
//c->yuv2yuv1 = RENAME(yuv2yuv1_ar );
|
||||||
c->yuv2yuvX = RENAME(yuv2yuvX_ar );
|
//c->yuv2yuvX = RENAME(yuv2yuvX_ar );
|
||||||
if (!(c->flags & SWS_FULL_CHR_H_INT)) {
|
if (!(c->flags & SWS_FULL_CHR_H_INT)) {
|
||||||
switch (c->dstFormat) {
|
switch (c->dstFormat) {
|
||||||
case PIX_FMT_RGB32: c->yuv2packedX = RENAME(yuv2rgb32_X_ar); break;
|
case PIX_FMT_RGB32: c->yuv2packedX = RENAME(yuv2rgb32_X_ar); break;
|
||||||
@ -2116,8 +2116,8 @@ static av_cold void RENAME(sws_init_swScale)(SwsContext *c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
c->yuv2yuv1 = RENAME(yuv2yuv1 );
|
//c->yuv2yuv1 = RENAME(yuv2yuv1 );
|
||||||
c->yuv2yuvX = RENAME(yuv2yuvX );
|
//c->yuv2yuvX = RENAME(yuv2yuvX );
|
||||||
if (!(c->flags & SWS_FULL_CHR_H_INT)) {
|
if (!(c->flags & SWS_FULL_CHR_H_INT)) {
|
||||||
switch (c->dstFormat) {
|
switch (c->dstFormat) {
|
||||||
case PIX_FMT_RGB32: c->yuv2packedX = RENAME(yuv2rgb32_X); break;
|
case PIX_FMT_RGB32: c->yuv2packedX = RENAME(yuv2rgb32_X); break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user