return 0;
int img_convert(AVPicture *dst, int dst_pix_fmt,                AVPicture *src, int src_pix_fmt,                 int src_width, int src_height){    int i, ret, dst_width, dst_height, int_pix_fmt;    PixFmtInfo *src_pix, *dst_pix;    ConvertEntry *ce;    AVPicture tmp1, *tmp = &tmp1;    if (src_pix_fmt < 0 || src_pix_fmt >= PIX_FMT_NB ||        dst_pix_fmt < 0 || dst_pix_fmt >= PIX_FMT_NB)        return -1;    if (src_width <= 0 || src_height <= 0)        return 0;    dst_width = src_width;    dst_height = src_height;    dst_pix = &pix_fmt_info[dst_pix_fmt];    src_pix = &pix_fmt_info[src_pix_fmt];    if (src_pix_fmt == dst_pix_fmt) {        /* XXX: incorrect */        /* same format: just copy */        for(i = 0; i < dst_pix->nb_components; i++) {            int w, h;            w = dst_width;            h = dst_height;            if (dst_pix->is_yuv && (i == 1 || i == 2)) {                w >>= dst_pix->x_chroma_shift;                h >>= dst_pix->y_chroma_shift;            }            img_copy(dst->data[i], dst->linesize[i],                     src->data[i], src->linesize[i],                     w, h);        }        return 0;    }    ce = &convert_table[src_pix_fmt][dst_pix_fmt];    if (ce->convert) {        /* specific convertion routine */        ce->convert(dst, src, dst_width, dst_height);        return 0;    }    /* gray to YUV */    if (dst_pix->is_yuv && src_pix_fmt == PIX_FMT_GRAY8) {        int w, h, y;        uint8_t *d;        img_copy(dst->data[0], dst->linesize[0],                 src->data[0], src->linesize[0],                 dst_width, dst_height);        /* fill U and V with 128 */        w = dst_width;        h = dst_height;        w >>= dst_pix->x_chroma_shift;        h >>= dst_pix->y_chroma_shift;        for(i = 1; i <= 2; i++) {            d = dst->data[i];            for(y = 0; y< h; y++) {                memset(d, 128, w);                d += dst->linesize[i];            }        }        return 0;    }    /* YUV to gray */    if (src_pix->is_yuv && dst_pix_fmt == PIX_FMT_GRAY8) {        img_copy(dst->data[0], dst->linesize[0],                 src->data[0], src->linesize[0],                 dst_width, dst_height);        return 0;    }    /* YUV to YUV */    if (dst_pix->is_yuv && src_pix->is_yuv) {        int x_shift, y_shift, w, h;        void (*resize_func)(UINT8 *dst, int dst_wrap,                             UINT8 *src, int src_wrap,                            int width, int height);        /* compute chroma size of the smallest dimensions */        w = dst_width;        h = dst_height;        if (dst_pix->x_chroma_shift >= src_pix->x_chroma_shift)            w >>= dst_pix->x_chroma_shift;        else            w >>= src_pix->x_chroma_shift;        if (dst_pix->y_chroma_shift >= src_pix->y_chroma_shift)            h >>= dst_pix->y_chroma_shift;        else            h >>= src_pix->y_chroma_shift;        x_shift = (dst_pix->x_chroma_shift - src_pix->x_chroma_shift);        y_shift = (dst_pix->y_chroma_shift - src_pix->y_chroma_shift);        if (x_shift == 0 && y_shift == 0) {            resize_func = img_copy; /* should never happen */        } else if (x_shift == 0 && y_shift == 1) {            resize_func = shrink2;        } else if (x_shift == 1 && y_shift == 1) {            resize_func = shrink22;        } else if (x_shift == -1 && y_shift == -1) {            resize_func = grow22;        } else if (x_shift == -1 && y_shift == 1) {            resize_func = conv411;        } else {            /* currently not handled */            return -1;        }        img_copy(dst->data[0], dst->linesize[0],                 src->data[0], src->linesize[0],                 dst_width, dst_height);        for(i = 1;i <= 2; i++)            resize_func(dst->data[1], dst->linesize[1],                        src->data[1], src->linesize[1],                        w, h);    }    /* try to use an intermediate format */    if (src_pix_fmt == PIX_FMT_MONOWHITE ||        src_pix_fmt == PIX_FMT_MONOBLACK ||        dst_pix_fmt == PIX_FMT_MONOWHITE ||        dst_pix_fmt == PIX_FMT_MONOBLACK) {        int_pix_fmt = PIX_FMT_GRAY8;    } else {        int_pix_fmt = PIX_FMT_RGB24;    }    if (avpicture_alloc(tmp, int_pix_fmt, dst_width, dst_height) < 0)        return -1;    ret = -1;    if (img_convert(tmp, int_pix_fmt,                    src, src_pix_fmt, src_width, src_height) < 0)        goto fail1;    if (img_convert(dst, dst_pix_fmt,                    tmp, int_pix_fmt, dst_width, dst_height) < 0)        goto fail1;    ret = 0; fail1:    avpicture_free(tmp);    return ret;}