Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.2-rc1
| @@ -680,26 +680,7 @@ static int left_prediction(HYuvContext *s, uint8_t *dst, const uint8_t *src, int | |||||
| if (s->bps <= 8) { | if (s->bps <= 8) { | ||||
| return s->dsp.add_hfyu_left_prediction(dst, src, w, acc); | return s->dsp.add_hfyu_left_prediction(dst, src, w, acc); | ||||
| } else { | } else { | ||||
| //FIXME optimize | |||||
| unsigned mask = s->n-1; | |||||
| int i; | |||||
| const uint16_t *src16 = (const uint16_t *)src; | |||||
| uint16_t *dst16 = ( uint16_t *)dst; | |||||
| for(i=0; i<w-1; i++){ | |||||
| acc+= src16[i]; | |||||
| dst16[i]= acc & mask; | |||||
| i++; | |||||
| acc+= src16[i]; | |||||
| dst16[i]= acc & mask; | |||||
| } | |||||
| for(; i<w; i++){ | |||||
| acc+= src16[i]; | |||||
| dst16[i]= acc & mask; | |||||
| } | |||||
| return acc; | |||||
| return s->llviddsp.add_hfyu_left_prediction_int16(( uint16_t *)dst, (const uint16_t *)src, s->n-1, w, acc); | |||||
| } | } | ||||
| } | } | ||||
| @@ -59,10 +59,31 @@ static void diff_int16_c(uint16_t *dst, const uint16_t *src1, const uint16_t *sr | |||||
| dst[i] = (src1[i] - src2[i]) & mask; | dst[i] = (src1[i] - src2[i]) & mask; | ||||
| } | } | ||||
| static int add_hfyu_left_prediction_int16_c(uint16_t *dst, const uint16_t *src, unsigned mask, int w, int acc){ | |||||
| int i; | |||||
| for(i=0; i<w-1; i++){ | |||||
| acc+= src[i]; | |||||
| dst[i]= acc & mask; | |||||
| i++; | |||||
| acc+= src[i]; | |||||
| dst[i]= acc & mask; | |||||
| } | |||||
| for(; i<w; i++){ | |||||
| acc+= src[i]; | |||||
| dst[i]= acc & mask; | |||||
| } | |||||
| return acc; | |||||
| } | |||||
| void ff_llviddsp_init(LLVidDSPContext *c) | void ff_llviddsp_init(LLVidDSPContext *c) | ||||
| { | { | ||||
| c->add_int16 = add_int16_c; | c->add_int16 = add_int16_c; | ||||
| c->diff_int16= diff_int16_c; | c->diff_int16= diff_int16_c; | ||||
| c->add_hfyu_left_prediction_int16 = add_hfyu_left_prediction_int16_c; | |||||
| if (ARCH_X86) | if (ARCH_X86) | ||||
| ff_llviddsp_init_x86(c); | ff_llviddsp_init_x86(c); | ||||
| @@ -28,6 +28,7 @@ | |||||
| typedef struct LLVidDSPContext { | typedef struct LLVidDSPContext { | ||||
| void (*add_int16)(uint16_t *dst/*align 16*/, const uint16_t *src/*align 16*/, unsigned mask, int w); | void (*add_int16)(uint16_t *dst/*align 16*/, const uint16_t *src/*align 16*/, unsigned mask, int w); | ||||
| void (*diff_int16)(uint16_t *dst/*align 16*/, const uint16_t *src1/*align 16*/, const uint16_t *src2/*align 1*/, unsigned mask, int w); | void (*diff_int16)(uint16_t *dst/*align 16*/, const uint16_t *src1/*align 16*/, const uint16_t *src2/*align 1*/, unsigned mask, int w); | ||||
| int (*add_hfyu_left_prediction_int16)(uint16_t *dst, const uint16_t *src, unsigned mask, int w, int left); | |||||
| } LLVidDSPContext; | } LLVidDSPContext; | ||||
| void ff_llviddsp_init(LLVidDSPContext *llviddsp); | void ff_llviddsp_init(LLVidDSPContext *llviddsp); | ||||