📄 swscale_template.c
字号:
:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest), "r" (&c->redDither) : "%eax" ); return; case IMGFMT_BGR15: asm volatile( "movl %%esp, "ESP_OFFSET"(%5) \n\t" "movl %4, %%esp \n\t" YSCALEYUV2RGB1(%%eax, %5) /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP "paddusb "MANGLE(b5Dither)", %%mm2\n\t" "paddusb "MANGLE(g5Dither)", %%mm4\n\t" "paddusb "MANGLE(r5Dither)", %%mm5\n\t"#endif WRITEBGR15(%%esp, 8280(%5), %%eax) "movl "ESP_OFFSET"(%5), %%esp \n\t" :: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest), "r" (&c->redDither) : "%eax" ); return; case IMGFMT_BGR16: asm volatile( "movl %%esp, "ESP_OFFSET"(%5) \n\t" "movl %4, %%esp \n\t" YSCALEYUV2RGB1(%%eax, %5) /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP "paddusb "MANGLE(b5Dither)", %%mm2\n\t" "paddusb "MANGLE(g6Dither)", %%mm4\n\t" "paddusb "MANGLE(r5Dither)", %%mm5\n\t"#endif WRITEBGR16(%%esp, 8280(%5), %%eax) "movl "ESP_OFFSET"(%5), %%esp \n\t" :: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest), "r" (&c->redDither) : "%eax" ); return; case IMGFMT_YUY2: asm volatile( "movl %%esp, "ESP_OFFSET"(%5) \n\t" "movl %4, %%esp \n\t" YSCALEYUV2PACKED1(%%eax, %5) WRITEYUY2(%%esp, 8280(%5), %%eax) "movl "ESP_OFFSET"(%5), %%esp \n\t" :: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest), "r" (&c->redDither) : "%eax" ); return; } } else { switch(dstFormat) { case IMGFMT_BGR32: asm volatile( "movl %%esp, "ESP_OFFSET"(%5) \n\t" "movl %4, %%esp \n\t" YSCALEYUV2RGB1b(%%eax, %5) WRITEBGR32(%%esp, 8280(%5), %%eax) "movl "ESP_OFFSET"(%5), %%esp \n\t" :: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest), "r" (&c->redDither) : "%eax" ); return; case IMGFMT_BGR24: asm volatile( "movl %%esp, "ESP_OFFSET"(%5) \n\t" "movl %4, %%esp \n\t" YSCALEYUV2RGB1b(%%eax, %5) WRITEBGR24(%%esp, 8280(%5), %%eax) "movl "ESP_OFFSET"(%5), %%esp \n\t" :: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest), "r" (&c->redDither) : "%eax" ); return; case IMGFMT_BGR15: asm volatile( "movl %%esp, "ESP_OFFSET"(%5) \n\t" "movl %4, %%esp \n\t" YSCALEYUV2RGB1b(%%eax, %5) /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP "paddusb "MANGLE(b5Dither)", %%mm2\n\t" "paddusb "MANGLE(g5Dither)", %%mm4\n\t" "paddusb "MANGLE(r5Dither)", %%mm5\n\t"#endif WRITEBGR15(%%esp, 8280(%5), %%eax) "movl "ESP_OFFSET"(%5), %%esp \n\t" :: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest), "r" (&c->redDither) : "%eax" ); return; case IMGFMT_BGR16: asm volatile( "movl %%esp, "ESP_OFFSET"(%5) \n\t" "movl %4, %%esp \n\t" YSCALEYUV2RGB1b(%%eax, %5) /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP "paddusb "MANGLE(b5Dither)", %%mm2\n\t" "paddusb "MANGLE(g6Dither)", %%mm4\n\t" "paddusb "MANGLE(r5Dither)", %%mm5\n\t"#endif WRITEBGR16(%%esp, 8280(%5), %%eax) "movl "ESP_OFFSET"(%5), %%esp \n\t" :: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest), "r" (&c->redDither) : "%eax" ); return; case IMGFMT_YUY2: asm volatile( "movl %%esp, "ESP_OFFSET"(%5) \n\t" "movl %4, %%esp \n\t" YSCALEYUV2PACKED1b(%%eax, %5) WRITEYUY2(%%esp, 8280(%5), %%eax) "movl "ESP_OFFSET"(%5), %%esp \n\t" :: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest), "r" (&c->redDither) : "%eax" ); return; } }#endif if( uvalpha < 2048 ) { YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C, YSCALE_YUV_2_PACKED1_C) }else{ YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C, YSCALE_YUV_2_PACKED1B_C) }}//FIXME yuy2* can read upto 7 samples to muchstatic inline void RENAME(yuy2ToY)(uint8_t *dst, uint8_t *src, int width){#ifdef HAVE_MMX asm volatile( "movq "MANGLE(bm01010101)", %%mm2\n\t" "movl %0, %%eax \n\t" "1: \n\t" "movq (%1, %%eax,2), %%mm0 \n\t" "movq 8(%1, %%eax,2), %%mm1 \n\t" "pand %%mm2, %%mm0 \n\t" "pand %%mm2, %%mm1 \n\t" "packuswb %%mm1, %%mm0 \n\t" "movq %%mm0, (%2, %%eax) \n\t" "addl $8, %%eax \n\t" " js 1b \n\t" : : "g" (-width), "r" (src+width*2), "r" (dst+width) : "%eax" );#else int i; for(i=0; i<width; i++) dst[i]= src[2*i];#endif}static inline void RENAME(yuy2ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, int width){#if defined (HAVE_MMX2) || defined (HAVE_3DNOW) asm volatile( "movq "MANGLE(bm01010101)", %%mm4\n\t" "movl %0, %%eax \n\t" "1: \n\t" "movq (%1, %%eax,4), %%mm0 \n\t" "movq 8(%1, %%eax,4), %%mm1 \n\t" "movq (%2, %%eax,4), %%mm2 \n\t" "movq 8(%2, %%eax,4), %%mm3 \n\t" PAVGB(%%mm2, %%mm0) PAVGB(%%mm3, %%mm1) "psrlw $8, %%mm0 \n\t" "psrlw $8, %%mm1 \n\t" "packuswb %%mm1, %%mm0 \n\t" "movq %%mm0, %%mm1 \n\t" "psrlw $8, %%mm0 \n\t" "pand %%mm4, %%mm1 \n\t" "packuswb %%mm0, %%mm0 \n\t" "packuswb %%mm1, %%mm1 \n\t" "movd %%mm0, (%4, %%eax) \n\t" "movd %%mm1, (%3, %%eax) \n\t" "addl $4, %%eax \n\t" " js 1b \n\t" : : "g" (-width), "r" (src1+width*4), "r" (src2+width*4), "r" (dstU+width), "r" (dstV+width) : "%eax" );#else int i; for(i=0; i<width; i++) { dstU[i]= (src1[4*i + 1] + src2[4*i + 1])>>1; dstV[i]= (src1[4*i + 3] + src2[4*i + 3])>>1; }#endif}//this is allmost identical to the previous, end exists only cuz yuy2ToY/UV)(dst, src+1, ...) would have 100% unaligned accessesstatic inline void RENAME(uyvyToY)(uint8_t *dst, uint8_t *src, int width){#ifdef HAVE_MMX asm volatile( "movl %0, %%eax \n\t" "1: \n\t" "movq (%1, %%eax,2), %%mm0 \n\t" "movq 8(%1, %%eax,2), %%mm1 \n\t" "psrlw $8, %%mm0 \n\t" "psrlw $8, %%mm1 \n\t" "packuswb %%mm1, %%mm0 \n\t" "movq %%mm0, (%2, %%eax) \n\t" "addl $8, %%eax \n\t" " js 1b \n\t" : : "g" (-width), "r" (src+width*2), "r" (dst+width) : "%eax" );#else int i; for(i=0; i<width; i++) dst[i]= src[2*i+1];#endif}static inline void RENAME(uyvyToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, int width){#if defined (HAVE_MMX2) || defined (HAVE_3DNOW) asm volatile( "movq "MANGLE(bm01010101)", %%mm4\n\t" "movl %0, %%eax \n\t" "1: \n\t" "movq (%1, %%eax,4), %%mm0 \n\t" "movq 8(%1, %%eax,4), %%mm1 \n\t" "movq (%2, %%eax,4), %%mm2 \n\t" "movq 8(%2, %%eax,4), %%mm3 \n\t" PAVGB(%%mm2, %%mm0) PAVGB(%%mm3, %%mm1) "pand %%mm4, %%mm0 \n\t" "pand %%mm4, %%mm1 \n\t" "packuswb %%mm1, %%mm0 \n\t" "movq %%mm0, %%mm1 \n\t" "psrlw $8, %%mm0 \n\t" "pand %%mm4, %%mm1 \n\t" "packuswb %%mm0, %%mm0 \n\t" "packuswb %%mm1, %%mm1 \n\t" "movd %%mm0, (%4, %%eax) \n\t" "movd %%mm1, (%3, %%eax) \n\t" "addl $4, %%eax \n\t" " js 1b \n\t" : : "g" (-width), "r" (src1+width*4), "r" (src2+width*4), "r" (dstU+width), "r" (dstV+width) : "%eax" );#else int i; for(i=0; i<width; i++) { dstU[i]= (src1[4*i + 0] + src2[4*i + 0])>>1; dstV[i]= (src1[4*i + 2] + src2[4*i + 2])>>1; }#endif}static inline void RENAME(bgr32ToY)(uint8_t *dst, uint8_t *src, int width){#ifdef HAVE_MMXFIXME#else int i; for(i=0; i<width; i++) { int b= ((uint32_t*)src)[i]&0xFF; int g= (((uint32_t*)src)[i]>>8)&0xFF; int r= (((uint32_t*)src)[i]>>16)&0xFF; dst[i]= ((RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1)) )>>RGB2YUV_SHIFT); }#endif}static inline void RENAME(bgr32ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, int width){#ifdef HAVE_MMXFIXME#else int i; for(i=0; i<width; i++) { const int a= ((uint32_t*)src1)[2*i+0]; const int e= ((uint32_t*)src1)[2*i+1]; const int c= ((uint32_t*)src2)[2*i+0]; const int d= ((uint32_t*)src2)[2*i+1]; const int l= (a&0xFF00FF) + (e&0xFF00FF) + (c&0xFF00FF) + (d&0xFF00FF); const int h= (a&0x00FF00) + (e&0x00FF00) + (c&0x00FF00) + (d&0x00FF00); const int b= l&0x3FF; const int g= h>>8; const int r= l>>16; dstU[i]= ((RU*r + GU*g + BU*b)>>(RGB2YUV_SHIFT+2)) + 128; dstV[i]= ((RV*r + GV*g + BV*b)>>(RGB2YUV_SHIFT+2)) + 128; }#endif}static inline void RENAME(bgr24ToY)(uint8_t *dst, uint8_t *src, int width){#ifdef HAVE_MMX asm volatile( "movl %2, %%eax \n\t" "movq "MANGLE(bgr2YCoeff)", %%mm6 \n\t" "movq "MANGLE(w1111)", %%mm5 \n\t" "pxor %%mm7, %%mm7 \n\t" "leal (%%eax, %%eax, 2), %%ebx \n\t" ".balign 16 \n\t" "1: \n\t" PREFETCH" 64(%0, %%ebx) \n\t" "movd (%0, %%ebx), %%mm0 \n\t" "movd 3(%0, %%ebx), %%mm1 \n\t" "punpcklbw %%mm7, %%mm0 \n\t" "punpcklbw %%mm7, %%mm1 \n\t" "movd 6(%0, %%ebx), %%mm2 \n\t" "movd 9(%0, %%ebx), %%mm3 \n\t" "punpcklbw %%mm7, %%mm2 \n\t" "punpcklbw %%mm7, %%mm3 \n\t" "pmaddwd %%mm6, %%mm0 \n\t" "pmaddwd %%mm6, %%mm1 \n\t" "pmaddwd %%mm6, %%mm2 \n\t" "pmaddwd %%mm6, %%mm3 \n\t"#ifndef FAST_BGR2YV12 "psrad $8, %%mm0 \n\t" "psrad $8, %%mm1 \n\t" "psrad $8, %%mm2 \n\t" "psrad $8, %%mm3 \n\t"#endif "packssdw %%mm1, %%mm0 \n\t" "packssdw %%mm3, %%mm2 \n\t" "pmaddwd %%mm5, %%mm0 \n\t" "pmaddwd %%mm5, %%mm2 \n\t" "packssdw %%mm2, %%mm0 \n\t" "psraw $7, %%mm0 \n\t" "movd 12(%0, %%ebx), %%mm4 \n\t" "movd 15(%0, %%ebx), %%mm1 \n\t" "punpcklbw %%mm7, %%mm4 \n\t" "punpcklbw %%mm7, %%mm1 \n\t" "movd 18(%0, %%ebx), %%mm2 \n\t" "movd 21(%0, %%ebx), %%mm3 \n\t" "punpcklbw %%mm7, %%mm2 \n\t" "punpcklbw %%mm7, %%mm3 \n\t" "pmaddwd %%mm6, %%mm4 \n\t" "pmaddwd %%mm6, %%mm1 \n\t" "pmaddwd %%mm6, %%mm2 \n\t" "pmaddwd %%mm6, %%mm3 \n\t"#ifndef FAST_BGR2YV12 "psrad $8, %%mm4 \n\t" "psrad $8, %%mm1 \n\t" "psrad $8, %%mm2 \n\t" "psrad $8, %%mm3 \n\t"#endif "packssdw %%mm1, %%mm4 \n\t" "packssdw %%mm3, %%mm2 \n\t" "pmaddwd %%mm5, %%mm4 \n\t" "pmaddwd %%mm5, %%mm2 \n\t" "addl $24, %%ebx \n\t" "packssdw %%mm2, %%mm4 \n\t" "psraw $7, %%mm4 \n\t" "packuswb %%mm4, %%mm0 \n\t" "paddusb "MANGLE(bgr2YOffset)", %%mm0 \n\t" "movq %%mm0, (%1, %%eax) \n\t" "addl $8, %%eax \n\t" " js 1b \n\t" : : "r" (src+width*3), "r" (dst+width), "g" (-width) : "%eax", "%ebx" );#else int i; for(i=0; i<width; i++) { int b= src[i*3+0]; int g= src[i*3+1]; int r= src[i*3+2]; dst[i]= ((RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1)) )>>RGB2YUV_SHIFT); }#endif}static inline void RENAME(bgr24ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, int width){#ifdef HAVE_MMX asm volatile( "movl %4, %%eax \n\t" "movq "MANGLE(w1111)", %%mm5 \n\t" "movq "MANGLE(bgr2UCoeff)", %%mm6 \n\t" "pxor %%mm7, %%mm7 \n\t" "leal (%%eax, %%eax, 2), %%ebx \n\t" "addl %%ebx, %%ebx \n\t" ".balign 16 \n\t" "1: \n\t" PREFETCH" 64(%0, %%ebx) \n\t" PREFETCH" 64(%1, %%ebx) \n\t"#if defined (HAVE_MMX2) || defined (HAVE_3DNOW) "movq (%0, %%ebx), %%mm0 \n\t" "movq (%1, %%ebx), %%mm1 \n\t" "movq 6(%0, %%ebx), %%mm2 \n\t" "movq 6(%1, %%ebx), %%mm3 \n\t" PAVGB(%%mm1, %%mm0) PAVGB(%%mm3, %%mm2) "movq %%mm0, %%mm1 \n\t" "movq %%mm2, %%mm3 \n\t" "psrlq $24, %%mm0 \n\t" "psrlq $24, %%mm2 \n\t" PAVGB(%%mm1, %%mm0) PAVGB(%%mm3, %%mm2) "punpcklbw %%mm7, %%mm0 \n\t" "punpcklbw %%mm7, %%mm2 \n\t"#else "movd (%0, %%ebx), %%mm0 \n\t" "movd (%1, %%ebx), %%mm1 \n\t" "movd 3(%0, %%ebx), %%mm2 \n\t" "movd 3(%1, %%ebx), %%mm3 \n\t"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -