📄 dsputil.c
字号:
/* read the pixels */ for(i=0;i<8;i++) { pixels[0] = cm[pixels[0] + block[0]]; pixels[1] = cm[pixels[1] + block[1]]; pixels[2] = cm[pixels[2] + block[2]]; pixels[3] = cm[pixels[3] + block[3]]; pixels[4] = cm[pixels[4] + block[4]]; pixels[5] = cm[pixels[5] + block[5]]; pixels[6] = cm[pixels[6] + block[6]]; pixels[7] = cm[pixels[7] + block[7]]; pixels += line_size; block += 8; }}#if 0#define PIXOP2(OPNAME, OP) \static void OPNAME ## _pixels(uint8_t *block, const uint8_t *pixels, int line_size, int h)\{\ int i;\ for(i=0; i<h; i++){\ OP(*((uint64_t*)block), LD64(pixels));\ pixels+=line_size;\ block +=line_size;\ }\}\\static void OPNAME ## _no_rnd_pixels_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\{\ int i;\ for(i=0; i<h; i++){\ const uint64_t a= LD64(pixels );\ const uint64_t b= LD64(pixels+1);\ OP(*((uint64_t*)block), (a&b) + (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));\ pixels+=line_size;\ block +=line_size;\ }\}\\static void OPNAME ## _pixels_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\{\ int i;\ for(i=0; i<h; i++){\ const uint64_t a= LD64(pixels );\ const uint64_t b= LD64(pixels+1);\ OP(*((uint64_t*)block), (a|b) - (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));\ pixels+=line_size;\ block +=line_size;\ }\}\\static void OPNAME ## _no_rnd_pixels_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\{\ int i;\ for(i=0; i<h; i++){\ const uint64_t a= LD64(pixels );\ const uint64_t b= LD64(pixels+line_size);\ OP(*((uint64_t*)block), (a&b) + (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));\ pixels+=line_size;\ block +=line_size;\ }\}\\static void OPNAME ## _pixels_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\{\ int i;\ for(i=0; i<h; i++){\ const uint64_t a= LD64(pixels );\ const uint64_t b= LD64(pixels+line_size);\ OP(*((uint64_t*)block), (a|b) - (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));\ pixels+=line_size;\ block +=line_size;\ }\}\\static void OPNAME ## _pixels_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\{\ int i;\ const uint64_t a= LD64(pixels );\ const uint64_t b= LD64(pixels+1);\ uint64_t l0= (a&0x0303030303030303ULL)\ + (b&0x0303030303030303ULL)\ + 0x0202020202020202ULL;\ uint64_t h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ uint64_t l1,h1;\\ pixels+=line_size;\ for(i=0; i<h; i+=2){\ uint64_t a= LD64(pixels );\ uint64_t b= LD64(pixels+1);\ l1= (a&0x0303030303030303ULL)\ + (b&0x0303030303030303ULL);\ h1= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));\ pixels+=line_size;\ block +=line_size;\ a= LD64(pixels );\ b= LD64(pixels+1);\ l0= (a&0x0303030303030303ULL)\ + (b&0x0303030303030303ULL)\ + 0x0202020202020202ULL;\ h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));\ pixels+=line_size;\ block +=line_size;\ }\}\\static void OPNAME ## _no_rnd_pixels_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\{\ int i;\ const uint64_t a= LD64(pixels );\ const uint64_t b= LD64(pixels+1);\ uint64_t l0= (a&0x0303030303030303ULL)\ + (b&0x0303030303030303ULL)\ + 0x0101010101010101ULL;\ uint64_t h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ uint64_t l1,h1;\\ pixels+=line_size;\ for(i=0; i<h; i+=2){\ uint64_t a= LD64(pixels );\ uint64_t b= LD64(pixels+1);\ l1= (a&0x0303030303030303ULL)\ + (b&0x0303030303030303ULL);\ h1= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));\ pixels+=line_size;\ block +=line_size;\ a= LD64(pixels );\ b= LD64(pixels+1);\ l0= (a&0x0303030303030303ULL)\ + (b&0x0303030303030303ULL)\ + 0x0101010101010101ULL;\ h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));\ pixels+=line_size;\ block +=line_size;\ }\}\\CALL_2X_PIXELS(OPNAME ## _pixels16_c , OPNAME ## _pixels_c , 8)\CALL_2X_PIXELS(OPNAME ## _pixels16_x2_c , OPNAME ## _pixels_x2_c , 8)\CALL_2X_PIXELS(OPNAME ## _pixels16_y2_c , OPNAME ## _pixels_y2_c , 8)\CALL_2X_PIXELS(OPNAME ## _pixels16_xy2_c, OPNAME ## _pixels_xy2_c, 8)\CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_x2_c , OPNAME ## _no_rnd_pixels_x2_c , 8)\CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_y2_c , OPNAME ## _no_rnd_pixels_y2_c , 8)\CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_xy2_c, OPNAME ## _no_rnd_pixels_xy2_c, 8)#define op_avg(a, b) a = ( ((a)|(b)) - ((((a)^(b))&0xFEFEFEFEFEFEFEFEULL)>>1) )#else // 64 bit variant#define PIXOP2(OPNAME, OP) \static void OPNAME ## _pixels2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ int i;\ for(i=0; i<h; i++){\ OP(*((uint16_t*)(block )), LD16(pixels ));\ pixels+=line_size;\ block +=line_size;\ }\}\static void OPNAME ## _pixels4_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ int i;\ for(i=0; i<h; i++){\ OP(*((uint32_t*)(block )), LD32(pixels ));\ pixels+=line_size;\ block +=line_size;\ }\}\static void OPNAME ## _pixels8_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ int i;\ for(i=0; i<h; i++){\ OP(*((uint32_t*)(block )), LD32(pixels ));\ OP(*((uint32_t*)(block+4)), LD32(pixels+4));\ pixels+=line_size;\ block +=line_size;\ }\}\static inline void OPNAME ## _no_rnd_pixels8_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ OPNAME ## _pixels8_c(block, pixels, line_size, h);\}\\static inline void OPNAME ## _no_rnd_pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ int src_stride1, int src_stride2, int h){\ int i;\ for(i=0; i<h; i++){\ uint32_t a,b;\ a= LD32(&src1[i*src_stride1 ]);\ b= LD32(&src2[i*src_stride2 ]);\ OP(*((uint32_t*)&dst[i*dst_stride ]), no_rnd_avg32(a, b));\ a= LD32(&src1[i*src_stride1+4]);\ b= LD32(&src2[i*src_stride2+4]);\ OP(*((uint32_t*)&dst[i*dst_stride+4]), no_rnd_avg32(a, b));\ }\}\\static inline void OPNAME ## _pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ int src_stride1, int src_stride2, int h){\ int i;\ for(i=0; i<h; i++){\ uint32_t a,b;\ a= LD32(&src1[i*src_stride1 ]);\ b= LD32(&src2[i*src_stride2 ]);\ OP(*((uint32_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\ a= LD32(&src1[i*src_stride1+4]);\ b= LD32(&src2[i*src_stride2+4]);\ OP(*((uint32_t*)&dst[i*dst_stride+4]), rnd_avg32(a, b));\ }\}\\static inline void OPNAME ## _pixels4_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ int src_stride1, int src_stride2, int h){\ int i;\ for(i=0; i<h; i++){\ uint32_t a,b;\ a= LD32(&src1[i*src_stride1 ]);\ b= LD32(&src2[i*src_stride2 ]);\ OP(*((uint32_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\ }\}\\static inline void OPNAME ## _pixels2_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ int src_stride1, int src_stride2, int h){\ int i;\ for(i=0; i<h; i++){\ uint32_t a,b;\ a= LD16(&src1[i*src_stride1 ]);\ b= LD16(&src2[i*src_stride2 ]);\ OP(*((uint16_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\ }\}\\static inline void OPNAME ## _pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ int src_stride1, int src_stride2, int h){\ OPNAME ## _pixels8_l2(dst , src1 , src2 , dst_stride, src_stride1, src_stride2, h);\ OPNAME ## _pixels8_l2(dst+8, src1+8, src2+8, dst_stride, src_stride1, src_stride2, h);\}\\static inline void OPNAME ## _no_rnd_pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ int src_stride1, int src_stride2, int h){\ OPNAME ## _no_rnd_pixels8_l2(dst , src1 , src2 , dst_stride, src_stride1, src_stride2, h);\ OPNAME ## _no_rnd_pixels8_l2(dst+8, src1+8, src2+8, dst_stride, src_stride1, src_stride2, h);\}\\static inline void OPNAME ## _no_rnd_pixels8_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\}\\static inline void OPNAME ## _pixels8_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ OPNAME ## _pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\}\\static inline void OPNAME ## _no_rnd_pixels8_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\}\\static inline void OPNAME ## _pixels8_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ OPNAME ## _pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\}\\static inline void OPNAME ## _pixels8_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\ int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\ int i;\ for(i=0; i<h; i++){\ uint32_t a, b, c, d, l0, l1, h0, h1;\ a= LD32(&src1[i*src_stride1]);\ b= LD32(&src2[i*src_stride2]);\ c= LD32(&src3[i*src_stride3]);\ d= LD32(&src4[i*src_stride4]);\ l0= (a&0x03030303UL)\ + (b&0x03030303UL)\ + 0x02020202UL;\ h0= ((a&0xFCFCFCFCUL)>>2)\ + ((b&0xFCFCFCFCUL)>>2);\ l1= (c&0x03030303UL)\ + (d&0x03030303UL);\ h1= ((c&0xFCFCFCFCUL)>>2)\ + ((d&0xFCFCFCFCUL)>>2);\ OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ a= LD32(&src1[i*src_stride1+4]);\ b= LD32(&src2[i*src_stride2+4]);\ c= LD32(&src3[i*src_stride3+4]);\ d= LD32(&src4[i*src_stride4+4]);\ l0= (a&0x03030303UL)\ + (b&0x03030303UL)\ + 0x02020202UL;\ h0= ((a&0xFCFCFCFCUL)>>2)\ + ((b&0xFCFCFCFCUL)>>2);\ l1= (c&0x03030303UL)\ + (d&0x03030303UL);\ h1= ((c&0xFCFCFCFCUL)>>2)\ + ((d&0xFCFCFCFCUL)>>2);\ OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ }\}\\static inline void OPNAME ## _pixels4_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ OPNAME ## _pixels4_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\}\\static inline void OPNAME ## _pixels4_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ OPNAME ## _pixels4_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\}\\static inline void OPNAME ## _pixels2_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ OPNAME ## _pixels2_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\}\\static inline void OPNAME ## _pixels2_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ OPNAME ## _pixels2_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\}\\static inline void OPNAME ## _no_rnd_pixels8_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\ int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\ int i;\ for(i=0; i<h; i++){\ uint32_t a, b, c, d, l0, l1, h0, h1;\ a= LD32(&src1[i*src_stride1]);\ b= LD32(&src2[i*src_stride2]);\ c= LD32(&src3[i*src_stride3]);\ d= LD32(&src4[i*src_stride4]);\ l0= (a&0x03030303UL)\ + (b&0x03030303UL)\ + 0x01010101UL;\ h0= ((a&0xFCFCFCFCUL)>>2)\ + ((b&0xFCFCFCFCUL)>>2);\ l1= (c&0x03030303UL)\ + (d&0x03030303UL);\ h1= ((c&0xFCFCFCFCUL)>>2)\ + ((d&0xFCFCFCFCUL)>>2);\ OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -