X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fhuffyuvdsp.c;h=759ffda0b82aff8f215caa42138d0da6d016611f;hb=4fcdc9f3597289942de993f86caaf1d1b17057d9;hp=e8a05f6592a6d444eafad75dbfe24a016b9d7c28;hpb=575e8d11f1ebba9f3d9076862b099b7f94e4eb4a;p=ffmpeg diff --git a/libavcodec/huffyuvdsp.c b/libavcodec/huffyuvdsp.c index e8a05f6592a..759ffda0b82 100644 --- a/libavcodec/huffyuvdsp.c +++ b/libavcodec/huffyuvdsp.c @@ -23,36 +23,29 @@ #include "mathops.h" #include "huffyuvdsp.h" -// 0x7f7f7f7f or 0x7f7f7f7f7f7f7f7f or whatever, depending on the cpu's native arithmetic size -#define pb_7f (~0UL / 255 * 0x7f) -#define pb_80 (~0UL / 255 * 0x80) - -static void add_bytes_c(uint8_t *dst, uint8_t *src, intptr_t w) -{ +static void add_int16_c(uint16_t *dst, const uint16_t *src, unsigned mask, int w){ long i; - - for (i = 0; i <= w - (int) sizeof(long); i += sizeof(long)) { - long a = *(long *) (src + i); - long b = *(long *) (dst + i); - *(long *) (dst + i) = ((a & pb_7f) + (b & pb_7f)) ^ ((a ^ b) & pb_80); + unsigned long pw_lsb = (mask >> 1) * 0x0001000100010001ULL; + unsigned long pw_msb = pw_lsb + 0x0001000100010001ULL; + for (i = 0; i <= w - (int)sizeof(long)/2; i += sizeof(long)/2) { + long a = *(long*)(src+i); + long b = *(long*)(dst+i); + *(long*)(dst+i) = ((a&pw_lsb) + (b&pw_lsb)) ^ ((a^b)&pw_msb); } - for (; i < w; i++) - dst[i + 0] += src[i + 0]; + for(; iadd_bytes = add_bytes_c; - c->add_hfyu_median_pred = add_hfyu_median_pred_c; - c->add_hfyu_left_pred = add_hfyu_left_pred_c; + c->add_int16 = add_int16_c; + c->add_hfyu_median_pred_int16 = add_hfyu_median_pred_int16_c; c->add_hfyu_left_pred_bgr32 = add_hfyu_left_pred_bgr32_c; if (ARCH_X86) - ff_huffyuvdsp_init_x86(c); + ff_huffyuvdsp_init_x86(c, avctx); }