mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-25 21:28:22 +01:00
cwebp: extract jpeg decoding to its own module
Change-Id: I45e1f0fa7b34286dd98926e0485e5a8ab1964570
This commit is contained in:
parent
2ee228f9a5
commit
6a871d66a4
@ -172,6 +172,7 @@ DSP_OBJS = \
|
|||||||
$(DIROBJ)\dsp\yuv.obj \
|
$(DIROBJ)\dsp\yuv.obj \
|
||||||
|
|
||||||
EX_FORMAT_DEC_OBJS = \
|
EX_FORMAT_DEC_OBJS = \
|
||||||
|
$(DIROBJ)\examples/jpegdec.obj \
|
||||||
$(DIROBJ)\examples/pngdec.obj \
|
$(DIROBJ)\examples/pngdec.obj \
|
||||||
|
|
||||||
EX_UTIL_OBJS = \
|
EX_UTIL_OBJS = \
|
||||||
|
@ -21,6 +21,7 @@ dwebp_CPPFLAGS += $(JPEG_INCLUDES) $(PNG_INCLUDES)
|
|||||||
dwebp_LDADD = libexampleutil.la ../src/libwebp.la $(PNG_LIBS) $(JPEG_LIBS)
|
dwebp_LDADD = libexampleutil.la ../src/libwebp.la $(PNG_LIBS) $(JPEG_LIBS)
|
||||||
|
|
||||||
cwebp_SOURCES = cwebp.c metadata.h stopwatch.h
|
cwebp_SOURCES = cwebp.c metadata.h stopwatch.h
|
||||||
|
cwebp_SOURCES += jpegdec.c jpegdec.h
|
||||||
cwebp_SOURCES += pngdec.c pngdec.h
|
cwebp_SOURCES += pngdec.c pngdec.h
|
||||||
cwebp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE)
|
cwebp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE)
|
||||||
cwebp_CPPFLAGS += $(JPEG_INCLUDES) $(PNG_INCLUDES) $(TIFF_INCLUDES)
|
cwebp_CPPFLAGS += $(JPEG_INCLUDES) $(PNG_INCLUDES) $(TIFF_INCLUDES)
|
||||||
|
@ -18,11 +18,6 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WEBP_HAVE_JPEG
|
|
||||||
#include <setjmp.h>
|
|
||||||
#include <jpeglib.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WEBP_HAVE_TIFF
|
#ifdef WEBP_HAVE_TIFF
|
||||||
#include <tiffio.h>
|
#include <tiffio.h>
|
||||||
#endif
|
#endif
|
||||||
@ -42,6 +37,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "webp/encode.h"
|
#include "webp/encode.h"
|
||||||
|
#include "./jpegdec.h"
|
||||||
#include "./metadata.h"
|
#include "./metadata.h"
|
||||||
#include "./pngdec.h"
|
#include "./pngdec.h"
|
||||||
#include "./stopwatch.h"
|
#include "./stopwatch.h"
|
||||||
@ -292,99 +288,6 @@ static int ReadPicture(const char* const filename, WebPPicture* const pic,
|
|||||||
|
|
||||||
#else // !HAVE_WINCODEC_H
|
#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
|
#ifdef WEBP_HAVE_TIFF
|
||||||
static int ReadTIFF(const char* const filename,
|
static int ReadTIFF(const char* const filename,
|
||||||
WebPPicture* const pic, int keep_alpha) {
|
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 \
|
src/enc/webpenc.o \
|
||||||
|
|
||||||
EX_FORMAT_DEC_OBJS = \
|
EX_FORMAT_DEC_OBJS = \
|
||||||
|
examples/jpegdec.o \
|
||||||
examples/pngdec.o \
|
examples/pngdec.o \
|
||||||
|
|
||||||
EX_UTIL_OBJS = \
|
EX_UTIL_OBJS = \
|
||||||
|
Loading…
Reference in New Issue
Block a user