# HG changeset patch # User stefano # Date 1270994945 0 # Node ID 0124d6beb4154d45f742cdea66dd430affae31b3 # Parent fce0ed54244cda88c2d177fffdbf6313a001bb86 Make ff_fill_linesize() use the information stored in av_pix_fmt_descriptors. Allow simplification and a more generic implementation. diff -r fce0ed54244c -r 0124d6beb415 imgconvert.c --- a/imgconvert.c Sun Apr 11 11:47:33 2010 +0000 +++ b/imgconvert.c Sun Apr 11 14:09:05 2010 +0000 @@ -492,107 +492,36 @@ int ff_fill_linesize(AVPicture *picture, enum PixelFormat pix_fmt, int width) { - int w2; + int i; const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt]; + int max_plane_step [4]; + int max_plane_step_comp[4]; memset(picture->linesize, 0, sizeof(picture->linesize)); - 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: - w2 = (width + (1 << desc->log2_chroma_w) - 1) >> desc->log2_chroma_w; - picture->linesize[0] = width; - picture->linesize[1] = w2; - picture->linesize[2] = w2; - break; - case PIX_FMT_YUV420P16LE: - case PIX_FMT_YUV422P16LE: - case PIX_FMT_YUV444P16LE: - case PIX_FMT_YUV420P16BE: - case PIX_FMT_YUV422P16BE: - case PIX_FMT_YUV444P16BE: - w2 = (width + (1 << desc->log2_chroma_w) - 1) >> desc->log2_chroma_w; - picture->linesize[0] = 2*width; - picture->linesize[1] = 2*w2; - picture->linesize[2] = 2*w2; - break; - case PIX_FMT_YUVA420P: - w2 = (width + (1 << desc->log2_chroma_w) - 1) >> desc->log2_chroma_w; - picture->linesize[0] = width; - picture->linesize[1] = w2; - picture->linesize[2] = w2; - picture->linesize[3] = width; - break; - case PIX_FMT_NV12: - case PIX_FMT_NV21: - w2 = (width + (1 << desc->log2_chroma_w) - 1) >> desc->log2_chroma_w; - picture->linesize[0] = width; - picture->linesize[1] = 2 * w2; - break; - case PIX_FMT_RGB24: - case PIX_FMT_BGR24: - picture->linesize[0] = width * 3; - break; - case PIX_FMT_ARGB: - case PIX_FMT_ABGR: - case PIX_FMT_RGBA: - case PIX_FMT_BGRA: - picture->linesize[0] = width * 4; - break; - case PIX_FMT_RGB48BE: - case PIX_FMT_RGB48LE: - picture->linesize[0] = width * 6; - break; - case PIX_FMT_GRAY16BE: - case PIX_FMT_GRAY16LE: - case PIX_FMT_BGR444BE: - case PIX_FMT_BGR444LE: - case PIX_FMT_BGR555BE: - case PIX_FMT_BGR555LE: - case PIX_FMT_BGR565BE: - case PIX_FMT_BGR565LE: - case PIX_FMT_RGB444BE: - case PIX_FMT_RGB444LE: - case PIX_FMT_RGB555BE: - case PIX_FMT_RGB555LE: - case PIX_FMT_RGB565BE: - case PIX_FMT_RGB565LE: - case PIX_FMT_YUYV422: - picture->linesize[0] = width * 2; - break; - case PIX_FMT_UYVY422: - picture->linesize[0] = width * 2; - break; - case PIX_FMT_UYYVYY411: - picture->linesize[0] = width + width/2; - 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: - case PIX_FMT_RGB8: - case PIX_FMT_BGR8: - case PIX_FMT_RGB4_BYTE: - case PIX_FMT_BGR4_BYTE: - case PIX_FMT_GRAY8: - picture->linesize[0] = width; - break; - default: + if (desc->flags & PIX_FMT_HWACCEL) return -1; + + if (desc->flags & PIX_FMT_BITSTREAM) { + picture->linesize[0] = (width * (desc->comp[0].step_minus1+1) + 7) >> 3; + return 0; } + + memset(max_plane_step , 0, sizeof(max_plane_step )); + memset(max_plane_step_comp, 0, sizeof(max_plane_step_comp)); + for (i = 0; i < 4; i++) { + const AVComponentDescriptor *comp = &(desc->comp[i]); + if ((comp->step_minus1+1) > max_plane_step[comp->plane]) { + max_plane_step [comp->plane] = comp->step_minus1+1; + max_plane_step_comp[comp->plane] = i; + } + } + + for (i = 0; i < 4; i++) { + int s = (max_plane_step_comp[i] == 1 || max_plane_step_comp[i] == 2) ? desc->log2_chroma_w : 0; + picture->linesize[i] = max_plane_step[i] * (((width + (1 << s) - 1)) >> s); + } + return 0; }