From cc9853d38f6b0fbfb26d10efd06950fa1f93791e Mon Sep 17 00:00:00 2001 From: Vitor Sessak Date: Fri, 15 Feb 2008 18:01:07 +0000 Subject: [PATCH] Split avpicture_fill() in two functions. This will be useful for libavfilter and to simplify avcodec_default_get_buffer(). Originally committed as revision 11942 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/imgconvert.c | 172 ++++++++++++++++++++++++---------------- 1 file changed, 104 insertions(+), 68 deletions(-) diff --git a/libavcodec/imgconvert.c b/libavcodec/imgconvert.c index 14d4791fa9..04bcc272b9 100644 --- a/libavcodec/imgconvert.c +++ b/libavcodec/imgconvert.c @@ -426,17 +426,14 @@ void avcodec_pix_fmt_string (char *buf, int buf_size, int pix_fmt) ); } -int avpicture_fill(AVPicture *picture, uint8_t *ptr, - int pix_fmt, int width, int height) +int ff_fill_linesize(AVPicture *picture, int pix_fmt, int width) { - int size, w2, h2, size2; + int w2; const PixFmtInfo *pinfo; - if(avcodec_check_dimensions(NULL, width, height)) - goto fail; + memset(picture->linesize, 0, sizeof(picture->linesize)); pinfo = &pix_fmt_info[pix_fmt]; - size = width * height; switch(pix_fmt) { case PIX_FMT_YUV420P: case PIX_FMT_YUV422P: @@ -449,62 +446,33 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr, case PIX_FMT_YUVJ444P: case PIX_FMT_YUVJ440P: w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift; - h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift; - size2 = w2 * h2; - picture->data[0] = ptr; - picture->data[1] = picture->data[0] + size; - picture->data[2] = picture->data[1] + size2; - picture->data[3] = NULL; picture->linesize[0] = width; picture->linesize[1] = w2; picture->linesize[2] = w2; - picture->linesize[3] = 0; - return size + 2 * size2; + break; case PIX_FMT_YUVA420P: w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift; - h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift; - size2 = w2 * h2; - picture->data[0] = ptr; - picture->data[1] = picture->data[0] + size; - picture->data[2] = picture->data[1] + size2; - picture->data[3] = picture->data[1] + size2 + size2; picture->linesize[0] = width; picture->linesize[1] = w2; picture->linesize[2] = w2; picture->linesize[3] = width; - return 2 * size + 2 * size2; + break; case PIX_FMT_NV12: case PIX_FMT_NV21: w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift; - h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift; - size2 = w2 * h2 * 2; - picture->data[0] = ptr; - picture->data[1] = picture->data[0] + size; - picture->data[2] = NULL; - picture->data[3] = NULL; picture->linesize[0] = width; picture->linesize[1] = w2; - picture->linesize[2] = 0; - picture->linesize[3] = 0; - return size + 2 * size2; + break; case PIX_FMT_RGB24: case PIX_FMT_BGR24: - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->data[3] = NULL; picture->linesize[0] = width * 3; - return size * 3; + break; case PIX_FMT_RGB32: case PIX_FMT_BGR32: case PIX_FMT_RGB32_1: case PIX_FMT_BGR32_1: - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->data[3] = NULL; picture->linesize[0] = width * 4; - return size * 4; + break; case PIX_FMT_GRAY16BE: case PIX_FMT_GRAY16LE: case PIX_FMT_BGR555: @@ -512,64 +480,119 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr, case PIX_FMT_RGB555: case PIX_FMT_RGB565: case PIX_FMT_YUYV422: - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->data[3] = NULL; picture->linesize[0] = width * 2; - return size * 2; + break; case PIX_FMT_UYVY422: - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->data[3] = NULL; picture->linesize[0] = width * 2; - return size * 2; + break; case PIX_FMT_UYYVYY411: - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->data[3] = NULL; picture->linesize[0] = width + width/2; - return size + size/2; + break; case PIX_FMT_RGB8: case PIX_FMT_BGR8: case PIX_FMT_RGB4_BYTE: case PIX_FMT_BGR4_BYTE: case PIX_FMT_GRAY8: - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->data[3] = NULL; picture->linesize[0] = width; - return size; + break; case PIX_FMT_RGB4: case PIX_FMT_BGR4: + picture->linesize[0] = width / 2; + break; + case PIX_FMT_MONOWHITE: + case PIX_FMT_MONOBLACK: + picture->linesize[0] = (width + 7) >> 3; + break; + case PIX_FMT_PAL8: + picture->linesize[0] = width; + picture->linesize[1] = 4; + break; + default: + return -1; + } + return 0; +} + +int ff_fill_pointer(AVPicture *picture, uint8_t *ptr, int pix_fmt, + int height) +{ + int size, h2, size2; + const PixFmtInfo *pinfo; + + pinfo = &pix_fmt_info[pix_fmt]; + size = picture->linesize[0] * height; + switch(pix_fmt) { + case PIX_FMT_YUV420P: + case PIX_FMT_YUV422P: + case PIX_FMT_YUV444P: + case PIX_FMT_YUV410P: + case PIX_FMT_YUV411P: + case PIX_FMT_YUV440P: + case PIX_FMT_YUVJ420P: + case PIX_FMT_YUVJ422P: + case PIX_FMT_YUVJ444P: + case PIX_FMT_YUVJ440P: + h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift; + size2 = picture->linesize[1] * h2; picture->data[0] = ptr; - picture->data[1] = NULL; + picture->data[1] = picture->data[0] + size; + picture->data[2] = picture->data[1] + size2; + picture->data[3] = NULL; + return size + 2 * size2; + case PIX_FMT_YUVA420P: + h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift; + size2 = picture->linesize[1] * h2; + picture->data[0] = ptr; + picture->data[1] = picture->data[0] + size; + picture->data[2] = picture->data[1] + size2; + picture->data[3] = picture->data[1] + size2 + size2; + return 2 * size + 2 * size2; + case PIX_FMT_NV12: + case PIX_FMT_NV21: + h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift; + size2 = picture->linesize[1] * h2 * 2; + picture->data[0] = ptr; + picture->data[1] = picture->data[0] + size; picture->data[2] = NULL; picture->data[3] = NULL; - picture->linesize[0] = width / 2; - return size / 2; + return size + 2 * size2; + case PIX_FMT_RGB24: + case PIX_FMT_BGR24: + case PIX_FMT_RGB32: + case PIX_FMT_BGR32: + case PIX_FMT_RGB32_1: + case PIX_FMT_BGR32_1: + case PIX_FMT_GRAY16BE: + case PIX_FMT_GRAY16LE: + case PIX_FMT_BGR555: + case PIX_FMT_BGR565: + case PIX_FMT_RGB555: + case PIX_FMT_RGB565: + case PIX_FMT_YUYV422: + case PIX_FMT_UYVY422: + case PIX_FMT_UYYVYY411: + case PIX_FMT_RGB8: + case PIX_FMT_BGR8: + case PIX_FMT_RGB4_BYTE: + case PIX_FMT_BGR4_BYTE: + case PIX_FMT_GRAY8: + case PIX_FMT_RGB4: + case PIX_FMT_BGR4: case PIX_FMT_MONOWHITE: case PIX_FMT_MONOBLACK: picture->data[0] = ptr; picture->data[1] = NULL; picture->data[2] = NULL; picture->data[3] = NULL; - picture->linesize[0] = (width + 7) >> 3; - return picture->linesize[0] * height; + return size; case PIX_FMT_PAL8: size2 = (size + 3) & ~3; picture->data[0] = ptr; picture->data[1] = ptr + size2; /* palette is stored here as 256 32 bit words */ picture->data[2] = NULL; picture->data[3] = NULL; - picture->linesize[0] = width; - picture->linesize[1] = 4; return size2 + 256 * 4; default: -fail: picture->data[0] = NULL; picture->data[1] = NULL; picture->data[2] = NULL; @@ -578,6 +601,19 @@ fail: } } +int avpicture_fill(AVPicture *picture, uint8_t *ptr, + int pix_fmt, int width, int height) +{ + + if(avcodec_check_dimensions(NULL, width, height)) + return -1; + + if (avpicture_fill_linesize(picture, pix_fmt, width)) + return -1; + + return avpicture_fill_pointer(picture, ptr, pix_fmt, height); +} + int avpicture_layout(const AVPicture* src, int pix_fmt, int width, int height, unsigned char *dest, int dest_size) {