diff options
author | alex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-02-12 17:04:13 +0000 |
---|---|---|
committer | alex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-02-12 17:04:13 +0000 |
commit | ed93a4d20c09a21123b8364341fdf4ca69a2f885 (patch) | |
tree | a3344cf14053f8a37df4910a035e5c9be50b01e8 /mpng.c | |
parent | 65750b3de571af1f7dd9f79b110225c847146198 (diff) | |
download | mpv-ed93a4d20c09a21123b8364341fdf4ca69a2f885.tar.bz2 mpv-ed93a4d20c09a21123b8364341fdf4ca69a2f885.tar.xz |
32bpp support, allocating palette based on used colors by file (possible overflow fix)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4672 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'mpng.c')
-rw-r--r-- | mpng.c | 30 |
1 files changed, 25 insertions, 5 deletions
@@ -1,9 +1,9 @@ - #include <stdlib.h> #include "config.h" #include "bswap.h" #include "postproc/rgb2rgb.h" +#include "libvo/fastmemcpy.h" #include "mp_msg.h" #include "png.h" @@ -33,6 +33,15 @@ void decode_mpng( char * palette = NULL; int depth,color; png_uint_32 i; + + /* currently supporting only 24 and 32bpp */ + if ((bytes_per_pixel != 3) && (bytes_per_pixel != 4)) + { + /* is this memset really needed? */ + memset(decoded, 0, width*height*bytes_per_pixel); + return; + } + png=png_create_read_struct( PNG_LIBPNG_VER_STRING,NULL,NULL,NULL ); info=png_create_info_struct( png ); endinfo=png_create_info_struct( png ); @@ -71,9 +80,13 @@ void decode_mpng( free( data ); break; case PNG_COLOR_TYPE_GRAY: + /* constant 256 colors */ palette=malloc( 1024 ); for ( i=0;i < 256;i++ ) palette[(i*4)]=palette[(i*4)+1]=palette[(i*4)+2]=(char)i; - palette8torgb24( data,decoded,png_width * png_height,palette ); + if (bytes_per_pixel == 4) + palette8torgb32( data,decoded,png_width * png_height,palette ); + else + palette8torgb24( data,decoded,png_width * png_height,palette ); free( data ); break; case PNG_COLOR_TYPE_PALETTE: @@ -81,7 +94,8 @@ void decode_mpng( int cols; unsigned char * pal; png_get_PLTE( png,info,(png_colorp*)&pal,&cols ); - palette=calloc( 1,1024 ); + palette=calloc( 1,cols*4 ); + mp_dbg(MSGT_DECVIDEO, MSGL_DBG2, "[mPNG] palette. used colors: %d\n", cols); for ( i=0;i < cols;i++ ) { palette[(i*4) ]=pal[(i*3)+2]; @@ -89,11 +103,17 @@ void decode_mpng( palette[(i*4)+2]=pal[(i*3) ]; } } - palette8torgb24( data,decoded,png_width * png_height,palette ); + if (bytes_per_pixel == 4) + palette8torgb32( data,decoded,png_width * png_height,palette ); + else + palette8torgb24( data,decoded,png_width * png_height,palette ); free( data ); break; case PNG_COLOR_TYPE_RGB_ALPHA: - rgb32to24( data,decoded,png_width * png_height * 4 ); + if (bytes_per_pixel == 4) + memcpy(decoded, data, png_width * png_height * 4); + else + rgb32to24( data,decoded,png_width * png_height * 4 ); free( data ); break; } |