mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avcodec/webp: add optimization: use local palette with extra padding
for big enough pictures. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
e81eca0ce5
commit
19fb476841
@ -1061,15 +1061,31 @@ static int apply_color_indexing_transform(WebPContext *s)
|
||||
av_free(line);
|
||||
}
|
||||
|
||||
for (y = 0; y < img->frame->height; y++) {
|
||||
for (x = 0; x < img->frame->width; x++) {
|
||||
p = GET_PIXEL(img->frame, x, y);
|
||||
i = p[2];
|
||||
if (i >= pal->frame->width) {
|
||||
AV_WB32(p, 0x00000000);
|
||||
} else {
|
||||
const uint8_t *pi = GET_PIXEL(pal->frame, i, 0);
|
||||
AV_COPY32(p, pi);
|
||||
// switch to local palette if it's worth initializing it
|
||||
if (img->frame->height * img->frame->width > 300) {
|
||||
uint8_t palette[256 * 4];
|
||||
const int size = pal->frame->width * 4;
|
||||
memcpy(palette, GET_PIXEL(pal->frame, 0, 0), size); // copy palette
|
||||
// set extra entries to transparent black
|
||||
memset(palette + size, 0, 256 * 4 - size);
|
||||
for (y = 0; y < img->frame->height; y++) {
|
||||
for (x = 0; x < img->frame->width; x++) {
|
||||
p = GET_PIXEL(img->frame, x, y);
|
||||
i = p[2];
|
||||
AV_COPY32(p, &palette[i * 4]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (y = 0; y < img->frame->height; y++) {
|
||||
for (x = 0; x < img->frame->width; x++) {
|
||||
p = GET_PIXEL(img->frame, x, y);
|
||||
i = p[2];
|
||||
if (i >= pal->frame->width) {
|
||||
AV_WB32(p, 0x00000000);
|
||||
} else {
|
||||
const uint8_t *pi = GET_PIXEL(pal->frame, i, 0);
|
||||
AV_COPY32(p, pi);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user