imgconvert.c

来自「播放H264文件的播放器」· C语言 代码 · 共 2,488 行 · 第 1/5 页

C
2,488
字号
            .convert = rgb565_to_rgb32        },        [PIX_FMT_RGB24] = {            .convert = rgb565_to_rgb24        },        [PIX_FMT_YUV420P] = {            .convert = rgb565_to_yuv420p        },        [PIX_FMT_GRAY8] = {            .convert = rgb565_to_gray        },    },    [PIX_FMT_GRAY16BE] = {        [PIX_FMT_GRAY8] = {            .convert = gray16be_to_gray        },        [PIX_FMT_GRAY16LE] = {            .convert = gray16_to_gray16        },    },    [PIX_FMT_GRAY16LE] = {        [PIX_FMT_GRAY8] = {            .convert = gray16le_to_gray        },        [PIX_FMT_GRAY16BE] = {            .convert = gray16_to_gray16        },    },    [PIX_FMT_GRAY8] = {        [PIX_FMT_RGB555] = {            .convert = gray_to_rgb555        },        [PIX_FMT_RGB565] = {            .convert = gray_to_rgb565        },        [PIX_FMT_RGB24] = {            .convert = gray_to_rgb24        },        [PIX_FMT_BGR24] = {            .convert = gray_to_bgr24        },        [PIX_FMT_RGB32] = {            .convert = gray_to_rgb32        },        [PIX_FMT_MONOWHITE] = {            .convert = gray_to_monowhite        },        [PIX_FMT_MONOBLACK] = {            .convert = gray_to_monoblack        },        [PIX_FMT_GRAY16LE] = {            .convert = gray_to_gray16        },        [PIX_FMT_GRAY16BE] = {            .convert = gray_to_gray16        },    },    [PIX_FMT_MONOWHITE] = {        [PIX_FMT_GRAY8] = {            .convert = monowhite_to_gray        },    },    [PIX_FMT_MONOBLACK] = {        [PIX_FMT_GRAY8] = {            .convert = monoblack_to_gray        },    },    [PIX_FMT_PAL8] = {        [PIX_FMT_RGB555] = {            .convert = pal8_to_rgb555        },        [PIX_FMT_RGB565] = {            .convert = pal8_to_rgb565        },        [PIX_FMT_BGR24] = {            .convert = pal8_to_bgr24        },        [PIX_FMT_RGB24] = {            .convert = pal8_to_rgb24        },        [PIX_FMT_RGB32] = {            .convert = pal8_to_rgb32        },    },    [PIX_FMT_UYYVYY411] = {        [PIX_FMT_YUV411P] = {            .convert = uyyvyy411_to_yuv411p,        },    },};#endifint avpicture_alloc(AVPicture *picture,                           int pix_fmt, int width, int height){    int size;    void *ptr;    size = avpicture_get_size(pix_fmt, width, height);    if(size<0)        goto fail;    ptr = av_malloc(size);    if (!ptr)        goto fail;    avpicture_fill(picture, ptr, pix_fmt, width, height);    if(picture->data[1] && !picture->data[2])        ff_set_systematic_pal((uint32_t*)picture->data[1], pix_fmt);    return 0; fail:    memset(picture, 0, sizeof(AVPicture));    return -1;}void avpicture_free(AVPicture *picture){    av_free(picture->data[0]);}/* return true if yuv planar */static _inline int is_yuv_planar(const PixFmtInfo *ps){    return (ps->color_type == FF_COLOR_YUV ||            ps->color_type == FF_COLOR_YUV_JPEG) &&        ps->pixel_type == FF_PIXEL_PLANAR;}int av_picture_crop(AVPicture *dst, const AVPicture *src,              int pix_fmt, int top_band, int left_band){    int y_shift;    int x_shift;    if (pix_fmt < 0 || pix_fmt >= PIX_FMT_NB || !is_yuv_planar(&pix_fmt_info[pix_fmt]))        return -1;    y_shift = pix_fmt_info[pix_fmt].y_chroma_shift;    x_shift = pix_fmt_info[pix_fmt].x_chroma_shift;    dst->data[0] = src->data[0] + (top_band * src->linesize[0]) + left_band;    dst->data[1] = src->data[1] + ((top_band >> y_shift) * src->linesize[1]) + (left_band >> x_shift);    dst->data[2] = src->data[2] + ((top_band >> y_shift) * src->linesize[2]) + (left_band >> x_shift);    dst->linesize[0] = src->linesize[0];    dst->linesize[1] = src->linesize[1];    dst->linesize[2] = src->linesize[2];    return 0;}int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width,            int pix_fmt, int padtop, int padbottom, int padleft, int padright,            int *color){    uint8_t *optr;    int y_shift;    int x_shift;    int yheight;    int i, y;    if (pix_fmt < 0 || pix_fmt >= PIX_FMT_NB ||        !is_yuv_planar(&pix_fmt_info[pix_fmt])) return -1;    for (i = 0; i < 3; i++) {        x_shift = i ? pix_fmt_info[pix_fmt].x_chroma_shift : 0;        y_shift = i ? pix_fmt_info[pix_fmt].y_chroma_shift : 0;        if (padtop || padleft) {            memset(dst->data[i], color[i],                dst->linesize[i] * (padtop >> y_shift) + (padleft >> x_shift));        }        if (padleft || padright) {            optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +                (dst->linesize[i] - (padright >> x_shift));            yheight = (height - 1 - (padtop + padbottom)) >> y_shift;            for (y = 0; y < yheight; y++) {                memset(optr, color[i], (padleft + padright) >> x_shift);                optr += dst->linesize[i];            }        }        if (src) { /* first line */            uint8_t *iptr = src->data[i];            optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +                    (padleft >> x_shift);            memcpy(optr, iptr, (width - padleft - padright) >> x_shift);            iptr += src->linesize[i];            optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +                (dst->linesize[i] - (padright >> x_shift));            yheight = (height - 1 - (padtop + padbottom)) >> y_shift;            for (y = 0; y < yheight; y++) {                memset(optr, color[i], (padleft + padright) >> x_shift);                memcpy(optr + ((padleft + padright) >> x_shift), iptr,                       (width - padleft - padright) >> x_shift);                iptr += src->linesize[i];                optr += dst->linesize[i];            }        }        if (padbottom || padright) {            optr = dst->data[i] + dst->linesize[i] *                ((height - padbottom) >> y_shift) - (padright >> x_shift);            memset(optr, color[i],dst->linesize[i] *                (padbottom >> y_shift) + (padright >> x_shift));        }    }    return 0;}#if !CONFIG_SWSCALEstatic uint8_t y_ccir_to_jpeg[256];static uint8_t y_jpeg_to_ccir[256];static uint8_t c_ccir_to_jpeg[256];static uint8_t c_jpeg_to_ccir[256];/* init various conversion tables */static av_cold void img_convert_init(void){    int i;    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;    for(i = 0;i < 256; i++) {        y_ccir_to_jpeg[i] = Y_CCIR_TO_JPEG(i);        y_jpeg_to_ccir[i] = Y_JPEG_TO_CCIR(i);        c_ccir_to_jpeg[i] = C_CCIR_TO_JPEG(i);        c_jpeg_to_ccir[i] = C_JPEG_TO_CCIR(i);    }}/* apply to each pixel the given table */static void img_apply_table(uint8_t *dst, int dst_wrap,                            const uint8_t *src, int src_wrap,                            int width, int height, const uint8_t *table1){    int n;    const uint8_t *s;    uint8_t *d;    const uint8_t *table;    table = table1;    for(;height > 0; height--) {        s = src;        d = dst;        n = width;        while (n >= 4) {            d[0] = table[s[0]];            d[1] = table[s[1]];            d[2] = table[s[2]];            d[3] = table[s[3]];            d += 4;            s += 4;            n -= 4;        }        while (n > 0) {            d[0] = table[s[0]];            d++;            s++;            n--;        }        dst += dst_wrap;        src += src_wrap;    }}/* XXX: use generic filter ? *//* XXX: in most cases, the sampling position is incorrect *//* 4x1 -> 1x1 */static void shrink41(uint8_t *dst, int dst_wrap,                     const uint8_t *src, int src_wrap,                     int width, int height){    int w;    const uint8_t *s;    uint8_t *d;    for(;height > 0; height--) {        s = src;        d = dst;        for(w = width;w > 0; w--) {            d[0] = (s[0] + s[1] + s[2] + s[3] + 2) >> 2;            s += 4;            d++;        }        src += src_wrap;        dst += dst_wrap;    }}/* 2x1 -> 1x1 */static void shrink21(uint8_t *dst, int dst_wrap,                     const uint8_t *src, int src_wrap,                     int width, int height){    int w;    const uint8_t *s;    uint8_t *d;    for(;height > 0; height--) {        s = src;        d = dst;        for(w = width;w > 0; w--) {            d[0] = (s[0] + s[1]) >> 1;            s += 2;            d++;        }        src += src_wrap;        dst += dst_wrap;    }}/* 1x2 -> 1x1 */static void shrink12(uint8_t *dst, int dst_wrap,                     const uint8_t *src, int src_wrap,                     int width, int height){    int w;    uint8_t *d;    const uint8_t *s1, *s2;    for(;height > 0; height--) {        s1 = src;        s2 = s1 + src_wrap;        d = dst;        for(w = width;w >= 4; w-=4) {            d[0] = (s1[0] + s2[0]) >> 1;            d[1] = (s1[1] + s2[1]) >> 1;            d[2] = (s1[2] + s2[2]) >> 1;            d[3] = (s1[3] + s2[3]) >> 1;            s1 += 4;            s2 += 4;            d += 4;        }        for(;w > 0; w--) {            d[0] = (s1[0] + s2[0]) >> 1;            s1++;            s2++;            d++;        }        src += 2 * src_wrap;        dst += dst_wrap;    }}static void grow21_line(uint8_t *dst, const uint8_t *src,                        int width){    int w;    const uint8_t *s1;    uint8_t *d;    s1 = src;    d = dst;    for(w = width;w >= 4; w-=4) {        d[1] = d[0] = s1[0];        d[3] = d[2] = s1[1];        s1 += 2;        d += 4;    }    for(;w >= 2; w -= 2) {        d[1] = d[0] = s1[0];        s1 ++;        d += 2;    }    /* only needed if width is not a multiple of two */    /* XXX: veryfy that */    if (w) {        d[0] = s1[0];    }}static void grow41_line(uint8_t *dst, const uint8_t *src,                        int width){    int w, v;    const uint8_t *s1;    uint8_t *d;    s1 = src;    d = dst;    for(w = width;w >= 4; w-=4) {        v = s1[0];        d[0] = v;        d[1] = v;        d[2] = v;        d[3] = v;        s1 ++;        d += 4;    }}/* 1x1 -> 2x1 */static void grow21(uint8_t *dst, int dst_wrap,                   const uint8_t *src, int src_wrap,                   int width, int height){    for(;height > 0; height--) {        grow21_line(dst, src, width);        src += src_wrap;        dst += dst_wrap;    }}/* 1x1 -> 1x2 */static void grow12(uint8_t *dst, int dst_wrap,                   const uint8_t *src, int src_wrap,                   int width, int height){    for(;height > 0; height-=2) {        memcpy(dst, src, width);        dst += dst_wrap;        memcpy(dst, src, width);        dst += dst_wrap;        src += src_wrap;    }}/* 1x1 -> 2x2 */static void grow22(uint8_t *dst, int dst_wrap,                   const uint8_t *src, int src_wrap,                   int width, int height){    for(;height > 0; height--) {        grow21_line(dst, src, width);        if (height%2)            src += src_wrap;        dst += dst_wrap;    }}/* 1x1 -> 4x1 */static void grow41(uint8_t *dst, int dst_wrap,                   const uint8_t *src, int src_wrap,                   int width, int height){    for(;height > 0; height--) {        grow41_line(dst, src, width);        src += src_wrap;        dst += dst_wrap;    }}/* 1x1 -> 4x4 */static void grow44(uint8_t *dst, int dst_wrap,                   const uint8_t *src, int src_wrap,                   int width, int height){    for(;height > 0; height--) {        grow41_line(dst, src, width);        if ((height & 3) == 1)            src += src_wrap;        dst += dst_wrap;    }}/* 1x2 -> 2x1 */static void conv411(uint8_t *dst, int dst_wrap,                    const uint8_t *src, int src_wrap,                    int width, int height){    int w, c;    const uint8_t *s1, *s2;    uint8_t *d;    width>>=1;    for(;height > 0; height--) {        s1 = src;        s2 = src + src_wrap;        d = dst;        for(w = width;w > 0; w--) {            c = (s1[0] + s2[0]) >> 1;            d[0] = c;            d[1] = c;            s1++;            s2++;            d += 2;        }        src += src_wrap * 2;        dst += dst_wrap;    }}/* XXX: always use linesize. Return -1 if not supported */int img_convert(AVPicture *dst, int dst_pix_fmt,                const AVPicture *src, int src_pix_fmt,                int src_width, int src_height){    static int initialized;    int i, ret, dst_width, dst_height, int_pix_fmt;    const PixFmtInfo *src_pix, *dst_pix;    const ConvertEntry *ce;    AVPicture tmp1, *tmp = &tmp1;    if (src_pix_fmt < 0 || src_pix_fmt 

⌨️ 快捷键说明

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