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

📄 swscale.c

📁 ffmpeg移植到symbian的全部源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    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, "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, "internal error %s -> %s converter\n",                        sws_format_name(srcFormat), sws_format_name(dstFormat)); break;        }    }else{        av_log(c, AV_LOG_ERROR, "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 packedCopy(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,                      int srcSliceH, uint8_t* dst[], int dstStride[]){    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];        }    }    return srcSliceH;}static int planarCopy(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,                      int srcSliceH, uint8_t* dst[], int dstStride[]){    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= (uint16_t*)src[0];    uint16_t *dstPtr= (uint16_t*)(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 roundToInt16(int64_t f){    int r= (f + (1<<15))>>16;         if (r<-0x7FFF) return 0x8000;    else if (r> 0x7FFF) return 0x7FFF;    else                return r;}/** * @param inv_table the yuv2rgb coeffs, normally Inverse_Table_6_9[x] * @param fullRange if 1 then the luma range is 0..255 if 0 it is 16..235 * @return -1 if not supported */int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation){    int64_t crv =  inv_table[0];    int64_t cbu =  inv_table[1];    int64_t cgu = -inv_table[2];    int64_t cgv = -inv_table[3];    int64_t cy  = 1<<16;    int64_t oy  = 0;    if (isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1;    memcpy(c->srcColorspaceTable, inv_table, sizeof(int)*4);    memcpy(c->dstColorspaceTable,     table, sizeof(int)*4);    c->brightness= brightness;    c->contrast  = contrast;    c->saturation= saturation;    c->srcRange  = srcRange;    c->dstRange  = dstRange;    c->uOffset=   0x0400040004000400LL;    c->vOffset=   0x0400040004000400LL;    if (!srcRange){        cy= (cy*255) / 219;        oy= 16<<16;    }else{        crv= (crv*224) / 255;        cbu= (cbu*224) / 255;        cgu= (cgu*224) / 255;        cgv= (cgv*224) / 255;    }    cy = (cy *contrast             )>>16;    crv= (crv*contrast * saturation)>>32;    cbu= (cbu*contrast * saturation)>>32;    cgu= (cgu*contrast * saturation)>>32;    cgv= (cgv*contrast * saturation)>>32;    oy -= 256*brightness;    c->yCoeff=    roundToInt16(cy *8192) * 0x0001000100010001ULL;    c->vrCoeff=   roundToInt16(crv*8192) * 0x0001000100010001ULL;    c->ubCoeff=   roundToInt16(cbu*8192) * 0x0001000100010001ULL;    c->vgCoeff=   roundToInt16(cgv*8192) * 0x0001000100010001ULL;    c->ugCoeff=   roundToInt16(cgu*8192) * 0x0001000100010001ULL;    c->yOffset=   roundToInt16(oy *   8) * 0x0001000100010001ULL;    yuv2rgb_c_init_tables(c, inv_table, srcRange, brightness, contrast, saturation);    //FIXME factorize#ifdef COMPILE_ALTIVEC    if (c->flags & SWS_CPU_CAPS_ALTIVEC)        yuv2rgb_altivec_init_tables (c, inv_table, brightness, contrast, saturation);#endif    return 0;}/** * @return -1 if not supported */int sws_getColorspaceDetails(SwsContext *c, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation){    if (isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1;    *inv_table = c->srcColorspaceTable;    *table     = c->dstColorspaceTable;    *srcRange  = c->srcRange;    *dstRange  = c->dstRange;    *brightness= c->brightness;    *contrast  = c->contrast;    *saturation= c->saturation;    return 0;}static int handle_jpeg(int *format){    switch (*format) {        case PIX_FMT_YUVJ420P:            *format = PIX_FMT_YUV420P;            return 1;        case PIX_FMT_YUVJ422P:            *format = PIX_FMT_YUV422P;            return 1;        case PIX_FMT_YUVJ444P:            *format = PIX_FMT_YUV444P;            return 1;        case PIX_FMT_YUVJ440P:            *format = PIX_FMT_YUV440P;            return 1;        default:            return 0;    }}SwsContext *sws_getContext(int srcW, int srcH, int srcForma

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -