X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fimgconvert.c;h=6b0c049e2a532ce1b14e58bb7a6873b71bd78652;hb=f19c58b4cf0be11cdcfa609ca78265e4b4206091;hp=2574ec8fcc32eb326212acd90017148e7aed3715;hpb=46db10ed0e04872eb9b003129f8395005c935ca4;p=ffmpeg diff --git a/libavcodec/imgconvert.c b/libavcodec/imgconvert.c index 2574ec8fcc3..6b0c049e2a5 100644 --- a/libavcodec/imgconvert.c +++ b/libavcodec/imgconvert.c @@ -37,6 +37,7 @@ #include "libavutil/colorspace.h" #include "libavutil/pixdesc.h" #include "libavcore/imgutils.h" +#include "libavcore/internal.h" #if HAVE_MMX && HAVE_YASM #include "x86/dsputil_mmx.h" @@ -430,72 +431,23 @@ enum PixelFormat avcodec_get_pix_fmt(const char *name) { return av_get_pix_fmt(name); } -#endif void avcodec_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt) { - /* print header */ - if (pix_fmt < 0) - snprintf (buf, buf_size, - "name " " nb_channels" " depth" - ); - else{ - PixFmtInfo info= pix_fmt_info[pix_fmt]; - - snprintf (buf, buf_size, - "%-11s %5d %9d", - av_pix_fmt_descriptors[pix_fmt].name, - info.nb_channels, - av_get_bits_per_pixel(&av_pix_fmt_descriptors[pix_fmt]) - ); - } + av_get_pix_fmt_string(buf, buf_size, pix_fmt); } +#endif int ff_is_hwaccel_pix_fmt(enum PixelFormat pix_fmt) { return av_pix_fmt_descriptors[pix_fmt].flags & PIX_FMT_HWACCEL; } +#if LIBAVCODEC_VERSION_MAJOR < 53 int ff_set_systematic_pal(uint32_t pal[256], enum PixelFormat pix_fmt){ - int i; - - for(i=0; i<256; i++){ - int r,g,b; - - switch(pix_fmt) { - case PIX_FMT_RGB8: - r= (i>>5 )*36; - g= ((i>>2)&7)*36; - b= (i&3 )*85; - break; - case PIX_FMT_BGR8: - b= (i>>6 )*85; - g= ((i>>3)&7)*36; - r= (i&7 )*36; - break; - case PIX_FMT_RGB4_BYTE: - r= (i>>3 )*255; - g= ((i>>1)&3)*85; - b= (i&1 )*255; - break; - case PIX_FMT_BGR4_BYTE: - b= (i>>3 )*255; - g= ((i>>1)&3)*85; - r= (i&1 )*255; - break; - case PIX_FMT_GRAY8: - r=b=g= i; - break; - default: - return -1; - } - pal[i] = b + (g<<8) + (r<<16); - } - - return 0; + return ff_set_systematic_pal2(pal, pix_fmt); } -#if LIBAVCODEC_VERSION_MAJOR < 53 int ff_fill_linesize(AVPicture *picture, enum PixelFormat pix_fmt, int width) { return av_image_fill_linesizes(picture->linesize, pix_fmt, width); @@ -525,68 +477,31 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr, int avpicture_layout(const AVPicture* src, enum PixelFormat pix_fmt, int width, int height, unsigned char *dest, int dest_size) { - const PixFmtInfo* pf = &pix_fmt_info[pix_fmt]; + int i, j, nb_planes = 0, linesizes[4]; const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt]; - int i, j, w, ow, h, oh, data_planes; - const unsigned char* s; int size = avpicture_get_size(pix_fmt, width, height); if (size > dest_size || size < 0) - return -1; + return AVERROR(EINVAL); - if (pf->pixel_type == FF_PIXEL_PACKED || pf->pixel_type == FF_PIXEL_PALETTE) { - if (pix_fmt == PIX_FMT_YUYV422 || - pix_fmt == PIX_FMT_UYVY422 || - pix_fmt == PIX_FMT_BGR565BE || - pix_fmt == PIX_FMT_BGR565LE || - pix_fmt == PIX_FMT_BGR555BE || - pix_fmt == PIX_FMT_BGR555LE || - pix_fmt == PIX_FMT_BGR444BE || - pix_fmt == PIX_FMT_BGR444LE || - pix_fmt == PIX_FMT_RGB565BE || - pix_fmt == PIX_FMT_RGB565LE || - pix_fmt == PIX_FMT_RGB555BE || - pix_fmt == PIX_FMT_RGB555LE || - pix_fmt == PIX_FMT_RGB444BE || - pix_fmt == PIX_FMT_RGB444LE) - w = width * 2; - else if (pix_fmt == PIX_FMT_UYYVYY411) - w = width + width/2; - else if (pix_fmt == PIX_FMT_PAL8) - w = width; - else - w = width * (pf->depth * pf->nb_channels / 8); - - data_planes = 1; - h = height; - } else { - data_planes = pf->nb_channels; - w = (width*pf->depth + 7)/8; - h = height; - } + for (i = 0; i < desc->nb_components; i++) + nb_planes = FFMAX(desc->comp[i].plane, nb_planes); + nb_planes++; - ow = w; - oh = h; + av_image_fill_linesizes(linesizes, pix_fmt, width); + for (i = 0; i < nb_planes; i++) { + int h, shift = (i == 1 || i == 2) ? desc->log2_chroma_h : 0; + const unsigned char *s = src->data[i]; + h = (height + (1 << shift) - 1) >> shift; - for (i=0; i> desc->log2_chroma_w) * pf->depth + 7) / 8; - h = -((-height) >> desc->log2_chroma_h); - if (pix_fmt == PIX_FMT_NV12 || pix_fmt == PIX_FMT_NV21) - w <<= 1; - } else if (i == 3) { - w = ow; - h = oh; - } - s = src->data[i]; - for(j=0; jlinesize[i]; } } - if (pf->pixel_type == FF_PIXEL_PALETTE) + if (desc->flags & PIX_FMT_PAL) memcpy((unsigned char *)(((size_t)dest + 3) & ~3), src->data[1], 256 * 4); return size; @@ -898,23 +813,14 @@ void ff_shrink88(uint8_t *dst, int dst_wrap, int avpicture_alloc(AVPicture *picture, enum PixelFormat pix_fmt, int width, int height) { - int size; - void *ptr; - - size = avpicture_fill(picture, NULL, 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); + int ret; + + if ((ret = av_image_alloc(picture->data, picture->linesize, width, height, pix_fmt, 1)) < 0) { + memset(picture, 0, sizeof(AVPicture)); + return ret; + } return 0; - fail: - memset(picture, 0, sizeof(AVPicture)); - return -1; } void avpicture_free(AVPicture *picture)