mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-23 04:24:35 +02:00
sws: factor out updating the palette
This commit is contained in:
parent
f8c21ccbfc
commit
27acca1af0
@ -736,6 +736,81 @@ static void rgb48Toxyz12(struct SwsContext *c, uint16_t *dst,
|
||||
}
|
||||
}
|
||||
|
||||
static void update_palette(SwsContext *c, const uint32_t *pal)
|
||||
{
|
||||
for (int i = 0; i < 256; i++) {
|
||||
int r, g, b, y, u, v, a = 0xff;
|
||||
if (c->srcFormat == AV_PIX_FMT_PAL8) {
|
||||
uint32_t p = pal[i];
|
||||
a = (p >> 24) & 0xFF;
|
||||
r = (p >> 16) & 0xFF;
|
||||
g = (p >> 8) & 0xFF;
|
||||
b = p & 0xFF;
|
||||
} else if (c->srcFormat == AV_PIX_FMT_RGB8) {
|
||||
r = ( i >> 5 ) * 36;
|
||||
g = ((i >> 2) & 7) * 36;
|
||||
b = ( i & 3) * 85;
|
||||
} else if (c->srcFormat == AV_PIX_FMT_BGR8) {
|
||||
b = ( i >> 6 ) * 85;
|
||||
g = ((i >> 3) & 7) * 36;
|
||||
r = ( i & 7) * 36;
|
||||
} else if (c->srcFormat == AV_PIX_FMT_RGB4_BYTE) {
|
||||
r = ( i >> 3 ) * 255;
|
||||
g = ((i >> 1) & 3) * 85;
|
||||
b = ( i & 1) * 255;
|
||||
} else if (c->srcFormat == AV_PIX_FMT_GRAY8 || c->srcFormat == AV_PIX_FMT_GRAY8A) {
|
||||
r = g = b = i;
|
||||
} else {
|
||||
av_assert1(c->srcFormat == AV_PIX_FMT_BGR4_BYTE);
|
||||
b = ( i >> 3 ) * 255;
|
||||
g = ((i >> 1) & 3) * 85;
|
||||
r = ( i & 1) * 255;
|
||||
}
|
||||
#define RGB2YUV_SHIFT 15
|
||||
#define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
|
||||
y = av_clip_uint8((RY * r + GY * g + BY * b + ( 33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
|
||||
u = av_clip_uint8((RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
|
||||
v = av_clip_uint8((RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
|
||||
c->pal_yuv[i]= y + (u<<8) + (v<<16) + ((unsigned)a<<24);
|
||||
|
||||
switch (c->dstFormat) {
|
||||
case AV_PIX_FMT_BGR32:
|
||||
#if !HAVE_BIGENDIAN
|
||||
case AV_PIX_FMT_RGB24:
|
||||
#endif
|
||||
c->pal_rgb[i]= r + (g<<8) + (b<<16) + ((unsigned)a<<24);
|
||||
break;
|
||||
case AV_PIX_FMT_BGR32_1:
|
||||
#if HAVE_BIGENDIAN
|
||||
case AV_PIX_FMT_BGR24:
|
||||
#endif
|
||||
c->pal_rgb[i]= a + (r<<8) + (g<<16) + ((unsigned)b<<24);
|
||||
break;
|
||||
case AV_PIX_FMT_RGB32_1:
|
||||
#if HAVE_BIGENDIAN
|
||||
case AV_PIX_FMT_RGB24:
|
||||
#endif
|
||||
c->pal_rgb[i]= a + (b<<8) + (g<<16) + ((unsigned)r<<24);
|
||||
break;
|
||||
case AV_PIX_FMT_RGB32:
|
||||
#if !HAVE_BIGENDIAN
|
||||
case AV_PIX_FMT_BGR24:
|
||||
#endif
|
||||
default:
|
||||
c->pal_rgb[i]= b + (g<<8) + (r<<16) + ((unsigned)a<<24);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* swscale wrapper, so we don't need to export the SwsContext.
|
||||
* Assumes planar YUV to be in YUV order instead of YVU.
|
||||
@ -833,79 +908,8 @@ int attribute_align_arg sws_scale(struct SwsContext *c,
|
||||
if (srcSliceY == 0) c->sliceDir = 1; else c->sliceDir = -1;
|
||||
}
|
||||
|
||||
if (usePal(c->srcFormat)) {
|
||||
for (i = 0; i < 256; i++) {
|
||||
int r, g, b, y, u, v, a = 0xff;
|
||||
if (c->srcFormat == AV_PIX_FMT_PAL8) {
|
||||
uint32_t p = ((const uint32_t *)(srcSlice[1]))[i];
|
||||
a = (p >> 24) & 0xFF;
|
||||
r = (p >> 16) & 0xFF;
|
||||
g = (p >> 8) & 0xFF;
|
||||
b = p & 0xFF;
|
||||
} else if (c->srcFormat == AV_PIX_FMT_RGB8) {
|
||||
r = ( i >> 5 ) * 36;
|
||||
g = ((i >> 2) & 7) * 36;
|
||||
b = ( i & 3) * 85;
|
||||
} else if (c->srcFormat == AV_PIX_FMT_BGR8) {
|
||||
b = ( i >> 6 ) * 85;
|
||||
g = ((i >> 3) & 7) * 36;
|
||||
r = ( i & 7) * 36;
|
||||
} else if (c->srcFormat == AV_PIX_FMT_RGB4_BYTE) {
|
||||
r = ( i >> 3 ) * 255;
|
||||
g = ((i >> 1) & 3) * 85;
|
||||
b = ( i & 1) * 255;
|
||||
} else if (c->srcFormat == AV_PIX_FMT_GRAY8 || c->srcFormat == AV_PIX_FMT_GRAY8A) {
|
||||
r = g = b = i;
|
||||
} else {
|
||||
av_assert1(c->srcFormat == AV_PIX_FMT_BGR4_BYTE);
|
||||
b = ( i >> 3 ) * 255;
|
||||
g = ((i >> 1) & 3) * 85;
|
||||
r = ( i & 1) * 255;
|
||||
}
|
||||
#define RGB2YUV_SHIFT 15
|
||||
#define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
#define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
|
||||
|
||||
y = av_clip_uint8((RY * r + GY * g + BY * b + ( 33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
|
||||
u = av_clip_uint8((RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
|
||||
v = av_clip_uint8((RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
|
||||
c->pal_yuv[i]= y + (u<<8) + (v<<16) + ((unsigned)a<<24);
|
||||
|
||||
switch (c->dstFormat) {
|
||||
case AV_PIX_FMT_BGR32:
|
||||
#if !HAVE_BIGENDIAN
|
||||
case AV_PIX_FMT_RGB24:
|
||||
#endif
|
||||
c->pal_rgb[i]= r + (g<<8) + (b<<16) + ((unsigned)a<<24);
|
||||
break;
|
||||
case AV_PIX_FMT_BGR32_1:
|
||||
#if HAVE_BIGENDIAN
|
||||
case AV_PIX_FMT_BGR24:
|
||||
#endif
|
||||
c->pal_rgb[i]= a + (r<<8) + (g<<16) + ((unsigned)b<<24);
|
||||
break;
|
||||
case AV_PIX_FMT_RGB32_1:
|
||||
#if HAVE_BIGENDIAN
|
||||
case AV_PIX_FMT_RGB24:
|
||||
#endif
|
||||
c->pal_rgb[i]= a + (b<<8) + (g<<16) + ((unsigned)r<<24);
|
||||
break;
|
||||
case AV_PIX_FMT_RGB32:
|
||||
#if !HAVE_BIGENDIAN
|
||||
case AV_PIX_FMT_BGR24:
|
||||
#endif
|
||||
default:
|
||||
c->pal_rgb[i]= b + (g<<8) + (r<<16) + ((unsigned)a<<24);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (usePal(c->srcFormat))
|
||||
update_palette(c, (const uint32_t *)srcSlice[1]);
|
||||
|
||||
if (c->src0Alpha && !c->dst0Alpha && isALPHA(c->dstFormat)) {
|
||||
uint8_t *base;
|
||||
|
Loading…
x
Reference in New Issue
Block a user