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

📄 imgconvert.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 3 页
字号:
        switch(pix_fmt) {        case PIX_FMT_YUV411P:            img_copy(dst->data[0], dst->linesize[0],                     src->data[0], src->linesize[0],                     width, height);            conv411(dst->data[1], dst->linesize[1],                    src->data[1], src->linesize[1],                    width / 4, height);            conv411(dst->data[2], dst->linesize[2],                    src->data[2], src->linesize[2],                    width / 4, height);            break;        case PIX_FMT_YUV410P:            img_copy(dst->data[0], dst->linesize[0],                     src->data[0], src->linesize[0],                     width, height);            grow22(dst->data[1], dst->linesize[1],                     src->data[1], src->linesize[1],                     width/2, height/2);            grow22(dst->data[2], dst->linesize[2],                     src->data[2], src->linesize[2],                     width/2, height/2);            break;        case PIX_FMT_YUV420P:            for(i=0;i<3;i++) {                img_copy(dst->data[i], dst->linesize[i],                         src->data[i], src->linesize[i],                         width, height);            }            break;        case PIX_FMT_YUV422P:            img_copy(dst->data[0], dst->linesize[0],                     src->data[0], src->linesize[0],                     width, height);            width >>= 1;            height >>= 1;            for(i=1;i<3;i++) {                shrink2(dst->data[i], dst->linesize[i],                        src->data[i], src->linesize[i],                        width, height);            }            break;        case PIX_FMT_YUV444P:            img_copy(dst->data[0], dst->linesize[0],                     src->data[0], src->linesize[0],                     width, height);            width >>= 1;            height >>= 1;            for(i=1;i<3;i++) {                shrink22(dst->data[i], dst->linesize[i],                         src->data[i], src->linesize[i],                         width, height);            }            break;        case PIX_FMT_YUV422:            yuv422_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                               src->data[0], width, height);            break;        case PIX_FMT_RGB24:            rgb24_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                              src->data[0], width, height);            break;        case PIX_FMT_RGBA32:            rgba32_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                              src->data[0], width, height);            break;        case PIX_FMT_BGR24:            bgr24_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                              src->data[0], width, height);            break;        case PIX_FMT_BGRA32:            bgra32_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                              src->data[0], width, height);            break;        case PIX_FMT_RGB565:            rgb565_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                              src->data[0], width, height);            break;        case PIX_FMT_RGB555:            rgb555_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                              src->data[0], width, height);            break;/*        case PIX_FMT_RGB5551:            rgb5551_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                              src->data[0], width, height);            break;*/        case PIX_FMT_BGR565:            bgr565_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                              src->data[0], width, height);            break;        case PIX_FMT_BGR555:            bgr555_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                              src->data[0], width, height);            break;/*        case PIX_FMT_GBR565:            gbr565_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                              src->data[0], width, height);            break;        case PIX_FMT_GBR555:            gbr555_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],                             src->data[0], width, height);            break;*/        default:            return -1;        }    } else if (dst_pix_fmt == PIX_FMT_RGB24) {        switch(pix_fmt) {        case PIX_FMT_YUV420P:            yuv420p_to_rgb24(dst, src, width, height);            break;        case PIX_FMT_YUV422P:            yuv422p_to_rgb24(dst, src, width, height);            break;        default:            return -1;        }    } else if (dst_pix_fmt == PIX_FMT_RGBA32) {        switch(pix_fmt) {        case PIX_FMT_YUV420P:            yuv420p_to_rgba32(dst, src, width, height);            break;        default:            return -1;        }    } else if (dst_pix_fmt == PIX_FMT_BGRA32) {        switch(pix_fmt) {        case PIX_FMT_YUV420P:            yuv420p_to_bgra32(dst, src, width, height);            break;        default:            return -1;        }    } else {        return -1;    }    return 0;}#ifdef HAVE_MMX#define DEINT_INPLACE_LINE_LUM \                    movd_m2r(lum_m4[0],mm0);\                    movd_m2r(lum_m3[0],mm1);\                    movd_m2r(lum_m2[0],mm2);\                    movd_m2r(lum_m1[0],mm3);\                    movd_m2r(lum[0],mm4);\                    punpcklbw_r2r(mm7,mm0);\                    movd_r2m(mm2,lum_m4[0]);\                    punpcklbw_r2r(mm7,mm1);\                    punpcklbw_r2r(mm7,mm2);\                    punpcklbw_r2r(mm7,mm3);\                    punpcklbw_r2r(mm7,mm4);\                    paddw_r2r(mm3,mm1);\                    psllw_i2r(1,mm2);\                    paddw_r2r(mm4,mm0);\                    psllw_i2r(2,mm1);\                    paddw_r2r(mm6,mm2);\                    paddw_r2r(mm2,mm1);\                    psubusw_r2r(mm0,mm1);\                    psrlw_i2r(3,mm1);\                    packuswb_r2r(mm7,mm1);\                    movd_r2m(mm1,lum_m2[0]);#define DEINT_LINE_LUM \                    movd_m2r(lum_m4[0],mm0);\                    movd_m2r(lum_m3[0],mm1);\                    movd_m2r(lum_m2[0],mm2);\                    movd_m2r(lum_m1[0],mm3);\                    movd_m2r(lum[0],mm4);\                    punpcklbw_r2r(mm7,mm0);\                    punpcklbw_r2r(mm7,mm1);\                    punpcklbw_r2r(mm7,mm2);\                    punpcklbw_r2r(mm7,mm3);\                    punpcklbw_r2r(mm7,mm4);\                    paddw_r2r(mm3,mm1);\                    psllw_i2r(1,mm2);\                    paddw_r2r(mm4,mm0);\                    psllw_i2r(2,mm1);\                    paddw_r2r(mm6,mm2);\                    paddw_r2r(mm2,mm1);\                    psubusw_r2r(mm0,mm1);\                    psrlw_i2r(3,mm1);\                    packuswb_r2r(mm7,mm1);\                    movd_r2m(mm1,dst[0]);#endif/* filter parameters: [-1 4 2 4 -1] // 8 */static void deinterlace_line(UINT8 *dst, UINT8 *lum_m4, UINT8 *lum_m3, UINT8 *lum_m2, UINT8 *lum_m1, UINT8 *lum,                                int size){#ifndef HAVE_MMX    UINT8 *cm = cropTbl + MAX_NEG_CROP;    int sum;    for(;size > 0;size--) {        sum = -lum_m4[0];        sum += lum_m3[0] << 2;        sum += lum_m2[0] << 1;        sum += lum_m1[0] << 2;        sum += -lum[0];        dst[0] = cm[(sum + 4) >> 3];        lum_m4++;        lum_m3++;        lum_m2++;        lum_m1++;        lum++;        dst++;    }#else    for (;size > 3; size-=4) {        DEINT_LINE_LUM        lum_m4+=4;        lum_m3+=4;        lum_m2+=4;        lum_m1+=4;        lum+=4;        dst+=4;    }#endif}static void deinterlace_line_inplace(UINT8 *lum_m4, UINT8 *lum_m3, UINT8 *lum_m2, UINT8 *lum_m1, UINT8 *lum,                             int size){#ifndef HAVE_MMX    UINT8 *cm = cropTbl + MAX_NEG_CROP;    int sum;    for(;size > 0;size--) {        sum = -lum_m4[0];        sum += lum_m3[0] << 2;        sum += lum_m2[0] << 1;        lum_m4[0]=lum_m2[0];        sum += lum_m1[0] << 2;        sum += -lum[0];        lum_m2[0] = cm[(sum + 4) >> 3];        lum_m4++;        lum_m3++;        lum_m2++;        lum_m1++;        lum++;    }#else    for (;size > 3; size-=4) {        DEINT_INPLACE_LINE_LUM        lum_m4+=4;        lum_m3+=4;        lum_m2+=4;        lum_m1+=4;        lum+=4;    }#endif}/* deinterlacing : 2 temporal taps, 3 spatial taps linear filter. The   top field is copied as is, but the bottom field is deinterlaced   against the top field. */static void deinterlace_bottom_field(UINT8 *dst, int dst_wrap,                                    UINT8 *src1, int src_wrap,                                    int width, int height){    UINT8 *src_m2, *src_m1, *src_0, *src_p1, *src_p2;    int y;    src_m2 = src1;    src_m1 = src1;    src_0=&src_m1[src_wrap];    src_p1=&src_0[src_wrap];    src_p2=&src_p1[src_wrap];    for(y=0;y<(height-2);y+=2) {        memcpy(dst,src_m1,width);        dst += dst_wrap;        deinterlace_line(dst,src_m2,src_m1,src_0,src_p1,src_p2,width);        src_m2 = src_0;        src_m1 = src_p1;        src_0 = src_p2;        src_p1 += 2*src_wrap;        src_p2 += 2*src_wrap;        dst += dst_wrap;    }    memcpy(dst,src_m1,width);    dst += dst_wrap;    /* do last line */    deinterlace_line(dst,src_m2,src_m1,src_0,src_0,src_0,width);}static void deinterlace_bottom_field_inplace(UINT8 *src1, int src_wrap,                                     int width, int height){    UINT8 *src_m1, *src_0, *src_p1, *src_p2;    int y;    UINT8 *buf;    buf = (UINT8*)av_malloc(width);    src_m1 = src1;    memcpy(buf,src_m1,width);    src_0=&src_m1[src_wrap];    src_p1=&src_0[src_wrap];    src_p2=&src_p1[src_wrap];    for(y=0;y<(height-2);y+=2) {        deinterlace_line_inplace(buf,src_m1,src_0,src_p1,src_p2,width);        src_m1 = src_p1;        src_0 = src_p2;        src_p1 += 2*src_wrap;        src_p2 += 2*src_wrap;    }    /* do last line */    deinterlace_line_inplace(buf,src_m1,src_0,src_0,src_0,width);    av_free(buf);}/* deinterlace - if not supported return -1 */int avpicture_deinterlace(AVPicture *dst, AVPicture *src,                          int pix_fmt, int width, int height){    int i;    if (pix_fmt != PIX_FMT_YUV420P &&        pix_fmt != PIX_FMT_YUV422P &&        pix_fmt != PIX_FMT_YUV444P)        return -1;    if ((width & 3) != 0 || (height & 3) != 0)        return -1;#ifdef HAVE_MMX    {        mmx_t rounder;        rounder.uw[0]=4;        rounder.uw[1]=4;        rounder.uw[2]=4;        rounder.uw[3]=4;        pxor_r2r(mm7,mm7);        movq_m2r(rounder,mm6);    }#endif        for(i=0;i<3;i++) {        if (i == 1) {            switch(pix_fmt) {            case PIX_FMT_YUV420P:                width >>= 1;                height >>= 1;                break;            case PIX_FMT_YUV422P:                width >>= 1;                break;            default:                break;            }        }        if (src == dst) {            deinterlace_bottom_field_inplace(src->data[i], src->linesize[i],                                 width, height);        } else {            deinterlace_bottom_field(dst->data[i],dst->linesize[i],                                        src->data[i], src->linesize[i],                                        width, height);        }    }#ifdef HAVE_MMX    emms();#endif    return 0;}#undef FIX

⌨️ 快捷键说明

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