⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swscale.c.svn-base

📁 mediastreamer2是开源的网络传输媒体流的库
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
        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 + -