📄 swscale.c.svn-base
字号:
int c= av_clip_uint8(i-256); clip_table[i]=c; }}static SwsFunc getSwsFunc(int flags){#if defined(RUNTIME_CPUDETECT) && defined (CONFIG_GPL)#if defined(ARCH_X86) // ordered per speed fastest first if (flags & SWS_CPU_CAPS_MMX2) return swScale_MMX2; else if (flags & SWS_CPU_CAPS_3DNOW) return swScale_3DNow; else if (flags & SWS_CPU_CAPS_MMX) return swScale_MMX; else return swScale_C;#else#ifdef ARCH_POWERPC if (flags & SWS_CPU_CAPS_ALTIVEC) return swScale_altivec; else return swScale_C;#endif return swScale_C;#endif /* defined(ARCH_X86) */#else //RUNTIME_CPUDETECT#ifdef HAVE_MMX2 return swScale_MMX2;#elif defined (HAVE_3DNOW) return swScale_3DNow;#elif defined (HAVE_MMX) return swScale_MMX;#elif defined (HAVE_ALTIVEC) return swScale_altivec;#else return swScale_C;#endif#endif //!RUNTIME_CPUDETECT}static int PlanarToNV12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dstParam[], int dstStride[]){ uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; /* Copy Y plane */ if (dstStride[0]==srcStride[0] && srcStride[0] > 0) memcpy(dst, src[0], srcSliceH*dstStride[0]); else { int i; uint8_t *srcPtr= src[0]; uint8_t *dstPtr= dst; for (i=0; i<srcSliceH; i++) { memcpy(dstPtr, srcPtr, c->srcW); srcPtr+= srcStride[0]; dstPtr+= dstStride[0]; } } dst = dstParam[1] + dstStride[1]*srcSliceY/2; if (c->dstFormat == PIX_FMT_NV12) interleaveBytes(src[1], src[2], dst, c->srcW/2, srcSliceH/2, srcStride[1], srcStride[2], dstStride[0]); else interleaveBytes(src[2], src[1], dst, c->srcW/2, srcSliceH/2, srcStride[2], srcStride[1], dstStride[0]); return srcSliceH;}static int PlanarToYuy2Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dstParam[], int dstStride[]){ uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; yv12toyuy2(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], srcStride[1], dstStride[0]); return srcSliceH;}static int PlanarToUyvyWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dstParam[], int dstStride[]){ uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; yv12touyvy(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], srcStride[1], dstStride[0]); return srcSliceH;}/* {RGB,BGR}{15,16,24,32} -> {RGB,BGR}{15,16,24,32} */static int rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ const int srcFormat= c->srcFormat; const int dstFormat= c->dstFormat; const int srcBpp= (fmt_depth(srcFormat) + 7) >> 3; const int dstBpp= (fmt_depth(dstFormat) + 7) >> 3; const int srcId= fmt_depth(srcFormat) >> 2; /* 1:0, 4:1, 8:2, 15:3, 16:4, 24:6, 32:8 */ const int dstId= fmt_depth(dstFormat) >> 2; void (*conv)(const uint8_t *src, uint8_t *dst, long src_size)=NULL; /* BGR -> BGR */ if ( (isBGR(srcFormat) && isBGR(dstFormat)) || (isRGB(srcFormat) && isRGB(dstFormat))){ switch(srcId | (dstId<<4)){ case 0x34: conv= rgb16to15; break; case 0x36: conv= rgb24to15; break; case 0x38: conv= rgb32to15; break; case 0x43: conv= rgb15to16; break; case 0x46: conv= rgb24to16; break; case 0x48: conv= rgb32to16; break; case 0x63: conv= rgb15to24; break; case 0x64: conv= rgb16to24; break; case 0x68: conv= rgb32to24; break; case 0x83: conv= rgb15to32; break; case 0x84: conv= rgb16to32; break; case 0x86: conv= rgb24to32; break; default: av_log(c, AV_LOG_ERROR, "swScaler: internal error %s -> %s converter\n", sws_format_name(srcFormat), sws_format_name(dstFormat)); break; } }else if ( (isBGR(srcFormat) && isRGB(dstFormat)) || (isRGB(srcFormat) && isBGR(dstFormat))){ switch(srcId | (dstId<<4)){ case 0x33: conv= rgb15tobgr15; break; case 0x34: conv= rgb16tobgr15; break; case 0x36: conv= rgb24tobgr15; break; case 0x38: conv= rgb32tobgr15; break; case 0x43: conv= rgb15tobgr16; break; case 0x44: conv= rgb16tobgr16; break; case 0x46: conv= rgb24tobgr16; break; case 0x48: conv= rgb32tobgr16; break; case 0x63: conv= rgb15tobgr24; break; case 0x64: conv= rgb16tobgr24; break; case 0x66: conv= rgb24tobgr24; break; case 0x68: conv= rgb32tobgr24; break; case 0x83: conv= rgb15tobgr32; break; case 0x84: conv= rgb16tobgr32; break; case 0x86: conv= rgb24tobgr32; break; case 0x88: conv= rgb32tobgr32; break; default: av_log(c, AV_LOG_ERROR, "swScaler: internal error %s -> %s converter\n", sws_format_name(srcFormat), sws_format_name(dstFormat)); break; } }else{ av_log(c, AV_LOG_ERROR, "swScaler: internal error %s -> %s converter\n", sws_format_name(srcFormat), sws_format_name(dstFormat)); } if(conv) { if (dstStride[0]*srcBpp == srcStride[0]*dstBpp && srcStride[0] > 0) conv(src[0], dst[0] + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]); else { int i; uint8_t *srcPtr= src[0]; uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; for (i=0; i<srcSliceH; i++) { conv(srcPtr, dstPtr, c->srcW*srcBpp); srcPtr+= srcStride[0]; dstPtr+= dstStride[0]; } } } return srcSliceH;}static int bgr24toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ rgb24toyv12( src[0], dst[0]+ srcSliceY *dstStride[0], dst[1]+(srcSliceY>>1)*dstStride[1], dst[2]+(srcSliceY>>1)*dstStride[2], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]); return srcSliceH;}static int yvu9toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ int i; /* copy Y */ if (srcStride[0]==dstStride[0] && srcStride[0] > 0) memcpy(dst[0]+ srcSliceY*dstStride[0], src[0], srcStride[0]*srcSliceH); else{ uint8_t *srcPtr= src[0]; uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; for (i=0; i<srcSliceH; i++) { memcpy(dstPtr, srcPtr, c->srcW); srcPtr+= srcStride[0]; dstPtr+= dstStride[0]; } } if (c->dstFormat==PIX_FMT_YUV420P){ planar2x(src[1], dst[1], c->chrSrcW, c->chrSrcH, srcStride[1], dstStride[1]); planar2x(src[2], dst[2], c->chrSrcW, c->chrSrcH, srcStride[2], dstStride[2]); }else{ planar2x(src[1], dst[2], c->chrSrcW, c->chrSrcH, srcStride[1], dstStride[2]); planar2x(src[2], dst[1], c->chrSrcW, c->chrSrcH, srcStride[2], dstStride[1]); } return srcSliceH;}/* unscaled copy like stuff (assumes nearly identical formats) */static int simpleCopy(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ if (isPacked(c->srcFormat)) { if (dstStride[0]==srcStride[0] && srcStride[0] > 0) memcpy(dst[0] + dstStride[0]*srcSliceY, src[0], srcSliceH*dstStride[0]); else { int i; uint8_t *srcPtr= src[0]; uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; int length=0; /* universal length finder */ while(length+c->srcW <= FFABS(dstStride[0]) && length+c->srcW <= FFABS(srcStride[0])) length+= c->srcW; ASSERT(length!=0); for (i=0; i<srcSliceH; i++) { memcpy(dstPtr, srcPtr, length); srcPtr+= srcStride[0]; dstPtr+= dstStride[0]; } } } else { /* Planar YUV or gray */ int plane; for (plane=0; plane<3; plane++) { int length= plane==0 ? c->srcW : -((-c->srcW )>>c->chrDstHSubSample); int y= plane==0 ? srcSliceY: -((-srcSliceY)>>c->chrDstVSubSample); int height= plane==0 ? srcSliceH: -((-srcSliceH)>>c->chrDstVSubSample); if ((isGray(c->srcFormat) || isGray(c->dstFormat)) && plane>0) { if (!isGray(c->dstFormat)) memset(dst[plane], 128, dstStride[plane]*height); } else { if (dstStride[plane]==srcStride[plane] && srcStride[plane] > 0) memcpy(dst[plane] + dstStride[plane]*y, src[plane], height*dstStride[plane]); else { int i; uint8_t *srcPtr= src[plane]; uint8_t *dstPtr= dst[plane] + dstStride[plane]*y; for (i=0; i<height; i++) { memcpy(dstPtr, srcPtr, length); srcPtr+= srcStride[plane]; dstPtr+= dstStride[plane]; } } } } } return srcSliceH;}static int gray16togray(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ int length= c->srcW; int y= srcSliceY; int height= srcSliceH; int i, j; uint8_t *srcPtr= src[0]; uint8_t *dstPtr= dst[0] + dstStride[0]*y; if (!isGray(c->dstFormat)){ int height= -((-srcSliceH)>>c->chrDstVSubSample); memset(dst[1], 128, dstStride[1]*height); memset(dst[2], 128, dstStride[2]*height); } if (c->srcFormat == PIX_FMT_GRAY16LE) srcPtr++; for (i=0; i<height; i++) { for (j=0; j<length; j++) dstPtr[j] = srcPtr[j<<1]; srcPtr+= srcStride[0]; dstPtr+= dstStride[0]; } return srcSliceH;}static int graytogray16(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ int length= c->srcW; int y= srcSliceY; int height= srcSliceH; int i, j; uint8_t *srcPtr= src[0]; uint8_t *dstPtr= dst[0] + dstStride[0]*y; for (i=0; i<height; i++) { for (j=0; j<length; j++) { dstPtr[j<<1] = srcPtr[j]; dstPtr[(j<<1)+1] = srcPtr[j]; } srcPtr+= srcStride[0]; dstPtr+= dstStride[0]; } return srcSliceH;}static int gray16swap(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ int length= c->srcW; int y= srcSliceY; int height= srcSliceH; int i, j; uint16_t *srcPtr= src[0]; uint16_t *dstPtr= dst[0] + dstStride[0]*y/2; for (i=0; i<height; i++) { for (j=0; j<length; j++) dstPtr[j] = bswap_16(srcPtr[j]); srcPtr+= srcStride[0]/2; dstPtr+= dstStride[0]/2; } return srcSliceH;}static void getSubSampleFactors(int *h, int *v, int format){ switch(format){ case PIX_FMT_UYVY422: case PIX_FMT_YUYV422: *h=1; *v=0; break; case PIX_FMT_YUV420P: case PIX_FMT_YUVA420P: case PIX_FMT_GRAY16BE: case PIX_FMT_GRAY16LE: case PIX_FMT_GRAY8: //FIXME remove after different subsamplings are fully implemented case PIX_FMT_NV12: case PIX_FMT_NV21: *h=1; *v=1; break; case PIX_FMT_YUV440P: *h=0; *v=1; break; case PIX_FMT_YUV410P: *h=2; *v=2; break; case PIX_FMT_YUV444P: *h=0; *v=0; break; case PIX_FMT_YUV422P: *h=1; *v=0; break; case PIX_FMT_YUV411P: *h=2; *v=0; break; default: *h=0; *v=0; break; }}static uint16_t roundToInt
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -