mirror of
				https://github.com/webmproject/libwebp.git
				synced 2025-10-31 18:35:41 +01:00 
			
		
		
		
	cwebp: extract jpeg decoding to its own module
Change-Id: I45e1f0fa7b34286dd98926e0485e5a8ab1964570
This commit is contained in:
		| @@ -172,6 +172,7 @@ DSP_OBJS = \ | ||||
|     $(DIROBJ)\dsp\yuv.obj \ | ||||
|  | ||||
| EX_FORMAT_DEC_OBJS = \ | ||||
|     $(DIROBJ)\examples/jpegdec.obj \ | ||||
|     $(DIROBJ)\examples/pngdec.obj \ | ||||
|  | ||||
| EX_UTIL_OBJS = \ | ||||
|   | ||||
| @@ -21,6 +21,7 @@ dwebp_CPPFLAGS += $(JPEG_INCLUDES) $(PNG_INCLUDES) | ||||
| dwebp_LDADD = libexampleutil.la ../src/libwebp.la $(PNG_LIBS) $(JPEG_LIBS) | ||||
|  | ||||
| cwebp_SOURCES  = cwebp.c metadata.h stopwatch.h | ||||
| cwebp_SOURCES += jpegdec.c jpegdec.h | ||||
| cwebp_SOURCES += pngdec.c pngdec.h | ||||
| cwebp_CPPFLAGS  = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE) | ||||
| cwebp_CPPFLAGS += $(JPEG_INCLUDES) $(PNG_INCLUDES) $(TIFF_INCLUDES) | ||||
|   | ||||
| @@ -18,11 +18,6 @@ | ||||
| #include "config.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef WEBP_HAVE_JPEG | ||||
| #include <setjmp.h> | ||||
| #include <jpeglib.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef WEBP_HAVE_TIFF | ||||
| #include <tiffio.h> | ||||
| #endif | ||||
| @@ -42,6 +37,7 @@ | ||||
|  | ||||
|  | ||||
| #include "webp/encode.h" | ||||
| #include "./jpegdec.h" | ||||
| #include "./metadata.h" | ||||
| #include "./pngdec.h" | ||||
| #include "./stopwatch.h" | ||||
| @@ -292,99 +288,6 @@ static int ReadPicture(const char* const filename, WebPPicture* const pic, | ||||
|  | ||||
| #else  // !HAVE_WINCODEC_H | ||||
|  | ||||
| #ifdef WEBP_HAVE_JPEG | ||||
| struct my_error_mgr { | ||||
|   struct jpeg_error_mgr pub; | ||||
|   jmp_buf setjmp_buffer; | ||||
| }; | ||||
|  | ||||
| static void my_error_exit(j_common_ptr dinfo) { | ||||
|   struct my_error_mgr* myerr = (struct my_error_mgr*) dinfo->err; | ||||
|   (*dinfo->err->output_message) (dinfo); | ||||
|   longjmp(myerr->setjmp_buffer, 1); | ||||
| } | ||||
|  | ||||
| static int ReadJPEG(FILE* in_file, WebPPicture* const pic) { | ||||
|   int ok = 0; | ||||
|   int stride, width, height; | ||||
|   uint8_t* rgb = NULL; | ||||
|   uint8_t* row_ptr = NULL; | ||||
|   struct jpeg_decompress_struct dinfo; | ||||
|   struct my_error_mgr jerr; | ||||
|   JSAMPARRAY buffer; | ||||
|  | ||||
|   dinfo.err = jpeg_std_error(&jerr.pub); | ||||
|   jerr.pub.error_exit = my_error_exit; | ||||
|  | ||||
|   if (setjmp(jerr.setjmp_buffer)) { | ||||
|  Error: | ||||
|     jpeg_destroy_decompress(&dinfo); | ||||
|     goto End; | ||||
|   } | ||||
|  | ||||
|   jpeg_create_decompress(&dinfo); | ||||
|   jpeg_stdio_src(&dinfo, in_file); | ||||
|   jpeg_read_header(&dinfo, TRUE); | ||||
|  | ||||
|   dinfo.out_color_space = JCS_RGB; | ||||
|   dinfo.dct_method = JDCT_IFAST; | ||||
|   dinfo.do_fancy_upsampling = TRUE; | ||||
|  | ||||
|   jpeg_start_decompress(&dinfo); | ||||
|  | ||||
|   if (dinfo.output_components != 3) { | ||||
|     goto Error; | ||||
|   } | ||||
|  | ||||
|   width = dinfo.output_width; | ||||
|   height = dinfo.output_height; | ||||
|   stride = dinfo.output_width * dinfo.output_components * sizeof(*rgb); | ||||
|  | ||||
|   rgb = (uint8_t*)malloc(stride * height); | ||||
|   if (rgb == NULL) { | ||||
|     goto End; | ||||
|   } | ||||
|   row_ptr = rgb; | ||||
|  | ||||
|   buffer = (*dinfo.mem->alloc_sarray) ((j_common_ptr) &dinfo, | ||||
|                                        JPOOL_IMAGE, stride, 1); | ||||
|   if (buffer == NULL) { | ||||
|     goto End; | ||||
|   } | ||||
|  | ||||
|   while (dinfo.output_scanline < dinfo.output_height) { | ||||
|     if (jpeg_read_scanlines(&dinfo, buffer, 1) != 1) { | ||||
|       goto End; | ||||
|     } | ||||
|     memcpy(row_ptr, buffer[0], stride); | ||||
|     row_ptr += stride; | ||||
|   } | ||||
|  | ||||
|   jpeg_finish_decompress(&dinfo); | ||||
|   jpeg_destroy_decompress(&dinfo); | ||||
|  | ||||
|   // WebP conversion. | ||||
|   pic->width = width; | ||||
|   pic->height = height; | ||||
|   ok = WebPPictureImportRGB(pic, rgb, stride); | ||||
|  | ||||
|  End: | ||||
|   if (rgb) { | ||||
|     free(rgb); | ||||
|   } | ||||
|   return ok; | ||||
| } | ||||
|  | ||||
| #else | ||||
| static int ReadJPEG(FILE* in_file, WebPPicture* const pic) { | ||||
|   (void)in_file; | ||||
|   (void)pic; | ||||
|   fprintf(stderr, "JPEG support not compiled. Please install the libjpeg " | ||||
|           "development package before building.\n"); | ||||
|   return 0; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifdef WEBP_HAVE_TIFF | ||||
| static int ReadTIFF(const char* const filename, | ||||
|                     WebPPicture* const pic, int keep_alpha) { | ||||
|   | ||||
							
								
								
									
										117
									
								
								examples/jpegdec.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								examples/jpegdec.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| // Copyright 2012 Google Inc. All Rights Reserved. | ||||
| // | ||||
| // This code is licensed under the same terms as WebM: | ||||
| //  Software License Agreement:  http://www.webmproject.org/license/software/ | ||||
| //  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/ | ||||
| // ----------------------------------------------------------------------------- | ||||
| // | ||||
| // JPEG decode. | ||||
|  | ||||
| #include "./jpegdec.h" | ||||
|  | ||||
| #ifdef HAVE_CONFIG_H | ||||
| #include "config.h" | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
|  | ||||
| #ifdef WEBP_HAVE_JPEG | ||||
| #include <jpeglib.h> | ||||
| #include <setjmp.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "webp/encode.h" | ||||
|  | ||||
| struct my_error_mgr { | ||||
|   struct jpeg_error_mgr pub; | ||||
|   jmp_buf setjmp_buffer; | ||||
| }; | ||||
|  | ||||
| static void my_error_exit(j_common_ptr dinfo) { | ||||
|   struct my_error_mgr* myerr = (struct my_error_mgr*) dinfo->err; | ||||
|   (*dinfo->err->output_message) (dinfo); | ||||
|   longjmp(myerr->setjmp_buffer, 1); | ||||
| } | ||||
|  | ||||
| int ReadJPEG(FILE* in_file, WebPPicture* const pic) { | ||||
|   int ok = 0; | ||||
|   int stride, width, height; | ||||
|   uint8_t* rgb = NULL; | ||||
|   uint8_t* row_ptr = NULL; | ||||
|   struct jpeg_decompress_struct dinfo; | ||||
|   struct my_error_mgr jerr; | ||||
|   JSAMPARRAY buffer; | ||||
|  | ||||
|   dinfo.err = jpeg_std_error(&jerr.pub); | ||||
|   jerr.pub.error_exit = my_error_exit; | ||||
|  | ||||
|   if (setjmp(jerr.setjmp_buffer)) { | ||||
|  Error: | ||||
|     jpeg_destroy_decompress(&dinfo); | ||||
|     goto End; | ||||
|   } | ||||
|  | ||||
|   jpeg_create_decompress(&dinfo); | ||||
|   jpeg_stdio_src(&dinfo, in_file); | ||||
|   jpeg_read_header(&dinfo, TRUE); | ||||
|  | ||||
|   dinfo.out_color_space = JCS_RGB; | ||||
|   dinfo.dct_method = JDCT_IFAST; | ||||
|   dinfo.do_fancy_upsampling = TRUE; | ||||
|  | ||||
|   jpeg_start_decompress(&dinfo); | ||||
|  | ||||
|   if (dinfo.output_components != 3) { | ||||
|     goto Error; | ||||
|   } | ||||
|  | ||||
|   width = dinfo.output_width; | ||||
|   height = dinfo.output_height; | ||||
|   stride = dinfo.output_width * dinfo.output_components * sizeof(*rgb); | ||||
|  | ||||
|   rgb = (uint8_t*)malloc(stride * height); | ||||
|   if (rgb == NULL) { | ||||
|     goto End; | ||||
|   } | ||||
|   row_ptr = rgb; | ||||
|  | ||||
|   buffer = (*dinfo.mem->alloc_sarray) ((j_common_ptr) &dinfo, | ||||
|                                        JPOOL_IMAGE, stride, 1); | ||||
|   if (buffer == NULL) { | ||||
|     goto End; | ||||
|   } | ||||
|  | ||||
|   while (dinfo.output_scanline < dinfo.output_height) { | ||||
|     if (jpeg_read_scanlines(&dinfo, buffer, 1) != 1) { | ||||
|       goto End; | ||||
|     } | ||||
|     memcpy(row_ptr, buffer[0], stride); | ||||
|     row_ptr += stride; | ||||
|   } | ||||
|  | ||||
|   jpeg_finish_decompress(&dinfo); | ||||
|   jpeg_destroy_decompress(&dinfo); | ||||
|  | ||||
|   // WebP conversion. | ||||
|   pic->width = width; | ||||
|   pic->height = height; | ||||
|   ok = WebPPictureImportRGB(pic, rgb, stride); | ||||
|  | ||||
|  End: | ||||
|   if (rgb) { | ||||
|     free(rgb); | ||||
|   } | ||||
|   return ok; | ||||
| } | ||||
| #else  // !WEBP_HAVE_JPEG | ||||
| int ReadJPEG(FILE* in_file, struct WebPPicture* const pic) { | ||||
|   (void)in_file; | ||||
|   (void)pic; | ||||
|   fprintf(stderr, "JPEG support not compiled. Please install the libjpeg " | ||||
|           "development package before building.\n"); | ||||
|   return 0; | ||||
| } | ||||
| #endif  // WEBP_HAVE_JPEG | ||||
|  | ||||
| // ----------------------------------------------------------------------------- | ||||
							
								
								
									
										31
									
								
								examples/jpegdec.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								examples/jpegdec.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| // Copyright 2012 Google Inc. All Rights Reserved. | ||||
| // | ||||
| // This code is licensed under the same terms as WebM: | ||||
| //  Software License Agreement:  http://www.webmproject.org/license/software/ | ||||
| //  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/ | ||||
| // ----------------------------------------------------------------------------- | ||||
| // | ||||
| // JPEG decode. | ||||
|  | ||||
| #ifndef WEBP_EXAMPLES_JPEGDEC_H_ | ||||
| #define WEBP_EXAMPLES_JPEGDEC_H_ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include "webp/types.h" | ||||
|  | ||||
| #if defined(__cplusplus) || defined(c_plusplus) | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| struct WebPPicture; | ||||
|  | ||||
| // Reads a JPEG from 'in_file', returning the decoded output in 'pic'. | ||||
| // The output is RGB. | ||||
| // Returns true on success. | ||||
| int ReadJPEG(FILE* in_file, struct WebPPicture* const pic); | ||||
|  | ||||
| #if defined(__cplusplus) || defined(c_plusplus) | ||||
| }    // extern "C" | ||||
| #endif | ||||
|  | ||||
| #endif  // WEBP_EXAMPLES_JPEGDEC_H_ | ||||
| @@ -125,6 +125,7 @@ ENC_OBJS = \ | ||||
|     src/enc/webpenc.o \ | ||||
|  | ||||
| EX_FORMAT_DEC_OBJS = \ | ||||
|     examples/jpegdec.o \ | ||||
|     examples/pngdec.o \ | ||||
|  | ||||
| EX_UTIL_OBJS = \ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user