mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-27 22:28:22 +01:00
Merge "Move DitherCombine8x8 to dsp/dec.c"
This commit is contained in:
commit
0b8ae8520f
@ -316,6 +316,9 @@ static void PrecomputeFilterStrengths(VP8Decoder* const dec) {
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Dithering
|
// Dithering
|
||||||
|
|
||||||
|
// minimal amp that will provide a non-zero dithering effect
|
||||||
|
#define MIN_DITHER_AMP 4
|
||||||
|
|
||||||
#define DITHER_AMP_TAB_SIZE 12
|
#define DITHER_AMP_TAB_SIZE 12
|
||||||
static const int kQuantToDitherAmp[DITHER_AMP_TAB_SIZE] = {
|
static const int kQuantToDitherAmp[DITHER_AMP_TAB_SIZE] = {
|
||||||
// roughly, it's dqm->uv_mat_[1]
|
// roughly, it's dqm->uv_mat_[1]
|
||||||
@ -356,27 +359,14 @@ void VP8InitDithering(const WebPDecoderOptions* const options,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// minimal amp that will provide a non-zero dithering effect
|
// Convert to range: [-2,2] for dither=50, [-4,4] for dither=100
|
||||||
#define MIN_DITHER_AMP 4
|
|
||||||
#define DITHER_DESCALE 4
|
|
||||||
#define DITHER_DESCALE_ROUNDER (1 << (DITHER_DESCALE - 1))
|
|
||||||
#define DITHER_AMP_BITS 8
|
|
||||||
#define DITHER_AMP_CENTER (1 << DITHER_AMP_BITS)
|
|
||||||
|
|
||||||
static void Dither8x8(VP8Random* const rg, uint8_t* dst, int bps, int amp) {
|
static void Dither8x8(VP8Random* const rg, uint8_t* dst, int bps, int amp) {
|
||||||
int i, j;
|
uint8_t dither[64];
|
||||||
for (j = 0; j < 8; ++j) {
|
int i;
|
||||||
for (i = 0; i < 8; ++i) {
|
for (i = 0; i < 8 * 8; ++i) {
|
||||||
// TODO: could be made faster with SSE2
|
dither[i] = VP8RandomBits2(rg, VP8_DITHER_AMP_BITS + 1, amp);
|
||||||
const int bits =
|
|
||||||
VP8RandomBits2(rg, DITHER_AMP_BITS + 1, amp) - DITHER_AMP_CENTER;
|
|
||||||
// Convert to range: [-2,2] for dither=50, [-4,4] for dither=100
|
|
||||||
const int delta = (bits + DITHER_DESCALE_ROUNDER) >> DITHER_DESCALE;
|
|
||||||
const int v = (int)dst[i] + delta;
|
|
||||||
dst[i] = (v < 0) ? 0 : (v > 255) ? 255u : (uint8_t)v;
|
|
||||||
}
|
|
||||||
dst += bps;
|
|
||||||
}
|
}
|
||||||
|
VP8DitherCombine8x8(dither, dst, bps);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DitherRow(VP8Decoder* const dec) {
|
static void DitherRow(VP8Decoder* const dec) {
|
||||||
|
@ -655,6 +655,23 @@ static void HFilter8i(uint8_t* u, uint8_t* v, int stride,
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static void DitherCombine8x8(const uint8_t* dither, uint8_t* dst,
|
||||||
|
int dst_stride) {
|
||||||
|
int i, j;
|
||||||
|
for (j = 0; j < 8; ++j) {
|
||||||
|
for (i = 0; i < 8; ++i) {
|
||||||
|
const int delta0 = dither[i] - VP8_DITHER_AMP_CENTER;
|
||||||
|
const int delta1 =
|
||||||
|
(delta0 + VP8_DITHER_DESCALE_ROUNDER) >> VP8_DITHER_DESCALE;
|
||||||
|
dst[i] = clip_8b((int)dst[i] + delta1);
|
||||||
|
}
|
||||||
|
dst += dst_stride;
|
||||||
|
dither += 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
VP8DecIdct2 VP8Transform;
|
VP8DecIdct2 VP8Transform;
|
||||||
VP8DecIdct VP8TransformAC3;
|
VP8DecIdct VP8TransformAC3;
|
||||||
VP8DecIdct VP8TransformUV;
|
VP8DecIdct VP8TransformUV;
|
||||||
@ -674,6 +691,9 @@ VP8SimpleFilterFunc VP8SimpleHFilter16;
|
|||||||
VP8SimpleFilterFunc VP8SimpleVFilter16i;
|
VP8SimpleFilterFunc VP8SimpleVFilter16i;
|
||||||
VP8SimpleFilterFunc VP8SimpleHFilter16i;
|
VP8SimpleFilterFunc VP8SimpleHFilter16i;
|
||||||
|
|
||||||
|
void (*VP8DitherCombine8x8)(const uint8_t* dither, uint8_t* dst,
|
||||||
|
int dst_stride);
|
||||||
|
|
||||||
extern void VP8DspInitSSE2(void);
|
extern void VP8DspInitSSE2(void);
|
||||||
extern void VP8DspInitSSE41(void);
|
extern void VP8DspInitSSE41(void);
|
||||||
extern void VP8DspInitNEON(void);
|
extern void VP8DspInitNEON(void);
|
||||||
@ -735,6 +755,8 @@ WEBP_TSAN_IGNORE_FUNCTION void VP8DspInit(void) {
|
|||||||
VP8PredChroma8[5] = DC8uvNoLeft;
|
VP8PredChroma8[5] = DC8uvNoLeft;
|
||||||
VP8PredChroma8[6] = DC8uvNoTopLeft;
|
VP8PredChroma8[6] = DC8uvNoTopLeft;
|
||||||
|
|
||||||
|
VP8DitherCombine8x8 = DitherCombine8x8;
|
||||||
|
|
||||||
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
|
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
|
||||||
if (VP8GetCPUInfo != NULL) {
|
if (VP8GetCPUInfo != NULL) {
|
||||||
#if defined(WEBP_USE_SSE2)
|
#if defined(WEBP_USE_SSE2)
|
||||||
|
@ -321,6 +321,15 @@ extern VP8LumaFilterFunc VP8HFilter16i;
|
|||||||
extern VP8ChromaFilterFunc VP8VFilter8i; // filtering u and v altogether
|
extern VP8ChromaFilterFunc VP8VFilter8i; // filtering u and v altogether
|
||||||
extern VP8ChromaFilterFunc VP8HFilter8i;
|
extern VP8ChromaFilterFunc VP8HFilter8i;
|
||||||
|
|
||||||
|
// Dithering. Combines dithering values (centered around 128) with dst[],
|
||||||
|
// according to: dst[] = clip(dst[] + (((dither[]-128) + 8) >> 4)
|
||||||
|
#define VP8_DITHER_DESCALE 4
|
||||||
|
#define VP8_DITHER_DESCALE_ROUNDER (1 << (VP8_DITHER_DESCALE - 1))
|
||||||
|
#define VP8_DITHER_AMP_BITS 7
|
||||||
|
#define VP8_DITHER_AMP_CENTER (1 << VP8_DITHER_AMP_BITS)
|
||||||
|
extern void (*VP8DitherCombine8x8)(const uint8_t* dither, uint8_t* dst,
|
||||||
|
int dst_stride);
|
||||||
|
|
||||||
// must be called before anything using the above
|
// must be called before anything using the above
|
||||||
void VP8DspInit(void);
|
void VP8DspInit(void);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user