Index: gpac/src/media_tools/img.c =================================================================== --- gpac.orig/src/media_tools/img.c +++ gpac/src/media_tools/img.c @@ -388,7 +388,7 @@ typedef struct static void user_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { - GFpng *ctx = (GFpng*)png_ptr->io_ptr; + GFpng *ctx = (GFpng*)png_get_io_ptr(png_ptr); if (ctx->pos + length > ctx->size) { png_error(png_ptr, "Read Error"); @@ -399,7 +399,7 @@ static void user_read_data(png_structp p } static void user_error_fn(png_structp png_ptr,png_const_charp error_msg) { - longjmp(png_ptr->jmpbuf, 1); + longjmp(png_jmpbuf(png_ptr), 1); } GF_EXPORT @@ -409,7 +409,11 @@ GF_Err gf_img_png_dec(char *png, u32 png png_struct *png_ptr; png_info *info_ptr; png_byte **rows; - u32 i, stride, bpp; + u32 i, stride; + int num_trans; + png_bytep trans_alpha; + png_color_16p trans_color; + int bit_depth, color_type; if ((png_size<8) || png_sig_cmp(png, 0, 8) ) return GF_NON_COMPLIANT_BITSTREAM; @@ -424,7 +428,7 @@ GF_Err gf_img_png_dec(char *png, u32 png png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); return GF_IO_ERR; } - if (setjmp(png_ptr->jmpbuf)) { + if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_info_struct(png_ptr,(png_infopp) & info_ptr); png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); return GF_IO_ERR; @@ -434,31 +438,31 @@ GF_Err gf_img_png_dec(char *png, u32 png png_read_info(png_ptr, info_ptr); + png_get_IHDR(png_ptr,info_ptr,width,height,&bit_depth,&color_type,NULL,NULL,NULL); /*unpaletize*/ - if (info_ptr->color_type==PNG_COLOR_TYPE_PALETTE) { + if (color_type==PNG_COLOR_TYPE_PALETTE) { png_set_expand(png_ptr); png_read_update_info(png_ptr, info_ptr); } - if (info_ptr->num_trans) { + png_get_tRNS(png_ptr,info_ptr,&trans_alpha,&num_trans,&trans_color); + if (num_trans) { png_set_tRNS_to_alpha(png_ptr); png_read_update_info(png_ptr, info_ptr); } - bpp = info_ptr->pixel_depth / 8; - *width = info_ptr->width; - *height = info_ptr->height; + png_get_IHDR(png_ptr,info_ptr,width,height,&bit_depth,&color_type,NULL,NULL,NULL); - switch (info_ptr->pixel_depth) { - case 8: + switch (color_type) { + case PNG_COLOR_TYPE_GRAY: *pixel_format = GF_PIXEL_GREYSCALE; break; - case 16: + case PNG_COLOR_TYPE_GRAY_ALPHA: *pixel_format = GF_PIXEL_ALPHAGREY; break; - case 24: + case PNG_COLOR_TYPE_RGB: *pixel_format = GF_PIXEL_RGB_24; break; - case 32: + case PNG_COLOR_TYPE_RGB_ALPHA: *pixel_format = GF_PIXEL_RGBA; break; default: @@ -469,18 +473,17 @@ GF_Err gf_img_png_dec(char *png, u32 png } /*new cfg, reset*/ - if (*dst_size != info_ptr->width * info_ptr->height * bpp) { - *dst_size = info_ptr->width * info_ptr->height * bpp; + if (*dst_size != png_get_rowbytes(png_ptr, info_ptr) * png_get_image_height(png_ptr,info_ptr)) { + *dst_size = png_get_rowbytes(png_ptr, info_ptr) * png_get_image_height(png_ptr,info_ptr); png_destroy_info_struct(png_ptr,(png_infopp) & info_ptr); png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); return GF_BUFFER_TOO_SMALL; } - *dst_size = info_ptr->width * info_ptr->height * bpp; /*read*/ stride = png_get_rowbytes(png_ptr, info_ptr); - rows = (png_bytepp) malloc(sizeof(png_bytep) * info_ptr->height); - for (i=0; iheight; i++) { + rows = (png_bytepp) malloc(sizeof(png_bytep) * png_get_image_height(png_ptr,info_ptr)); + for (i=0; iio_ptr; + GFpng *p = (GFpng *)png_get_io_ptr(png); memcpy(p->buffer+p->pos, data, sizeof(char)*size); p->pos += size; }