# HG changeset patch # User reimar # Date 1237631120 0 # Node ID 53ec03e7ba40152453bf9cda6a66a6843aa57b73 # Parent 64246d9e583ae1db5940cde345591a0c8825568d Fix avpicture_get_size for non-paletted formats with a helper palette to not include the size of that palette. Also clarify its documentation. diff -r 64246d9e583a -r 53ec03e7ba40 avcodec.h --- a/avcodec.h Sat Mar 21 01:54:31 2009 +0000 +++ b/avcodec.h Sat Mar 21 10:25:20 2009 +0000 @@ -2676,6 +2676,7 @@ * If a planar format is specified, several pointers will be set pointing to * the different picture planes and the line sizes of the different planes * will be stored in the lines_sizes array. + * Call with ptr == NULL to get the required size for the ptr buffer. * * @param picture AVPicture whose fields are to be filled in * @param ptr Buffer which will contain or contains the actual image data @@ -2692,11 +2693,14 @@ /** * Calculate the size in bytes that a picture of the given width and height * would occupy if stored in the given picture format. + * Note that this returns the size of a compact representation as generated + * by avpicture_layout, which can be smaller than the size required for e.g. + * avpicture_fill. * * @param pix_fmt the given picture format * @param width the width of the image * @param height the height of the image - * @return Image data size in bytes + * @return Image data size in bytes or -1 on error (e.g. too large dimensions). */ int avpicture_get_size(int pix_fmt, int width, int height); void avcodec_get_chroma_sub_sample(int pix_fmt, int *h_shift, int *v_shift); diff -r 64246d9e583a -r 53ec03e7ba40 imgconvert.c --- a/imgconvert.c Sat Mar 21 01:54:31 2009 +0000 +++ b/imgconvert.c Sat Mar 21 10:25:20 2009 +0000 @@ -786,6 +786,17 @@ int avpicture_get_size(int pix_fmt, int width, int height) { AVPicture dummy_pict; + if(avcodec_check_dimensions(NULL, width, height)) + return -1; + switch (pix_fmt) { + case PIX_FMT_RGB8: + case PIX_FMT_BGR8: + case PIX_FMT_RGB4_BYTE: + case PIX_FMT_BGR4_BYTE: + case PIX_FMT_GRAY8: + // do not include palette for these pseudo-paletted formats + return width * height; + } return avpicture_fill(&dummy_pict, NULL, pix_fmt, width, height); } @@ -1125,7 +1136,7 @@ int size; void *ptr; - size = avpicture_get_size(pix_fmt, width, height); + size = avpicture_fill(picture, NULL, pix_fmt, width, height); if(size<0) goto fail; ptr = av_malloc(size);