mirror of
https://github.com/webmproject/libwebp.git
synced 2024-11-20 04:18:26 +01:00
split example_util.h
move ExUtil*File to imageio_util.h ExUtil*WebP* to webpdec.h string parsing routines remain Change-Id: I0560c4a74e86710d83bc4b5b234f1b5ef9a86f9d
This commit is contained in:
parent
15ed462b2d
commit
bdda5bd4bf
@ -82,9 +82,13 @@ if(WEBP_BUILD_CWEBP OR WEBP_BUILD_DWEBP)
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/imageio/example_util.h)
|
${CMAKE_CURRENT_SOURCE_DIR}/imageio/example_util.h)
|
||||||
add_library(exampleutil ${exampleutil_SRCS})
|
add_library(exampleutil ${exampleutil_SRCS})
|
||||||
target_link_libraries(exampleutil webp ${WEBP_DEP_LIBRARIES})
|
target_link_libraries(exampleutil webp ${WEBP_DEP_LIBRARIES})
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WEBP_BUILD_CWEBP)
|
set(imageioutil_SRCS
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/imageio/imageio_util.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/imageio/imageio_util.h)
|
||||||
|
add_library(imageioutil ${imageioutil_SRCS})
|
||||||
|
target_link_libraries(imageioutil ${WEBP_DEP_LIBRARIES})
|
||||||
|
|
||||||
# Image-decoding utility library.
|
# Image-decoding utility library.
|
||||||
set(imagedec_SRCS
|
set(imagedec_SRCS
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/imageio/image_dec.c
|
${CMAKE_CURRENT_SOURCE_DIR}/imageio/image_dec.c
|
||||||
@ -113,8 +117,8 @@ if(WEBP_BUILD_DWEBP)
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/examples/dwebp.c
|
${CMAKE_CURRENT_SOURCE_DIR}/examples/dwebp.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/examples/stopwatch.h
|
${CMAKE_CURRENT_SOURCE_DIR}/examples/stopwatch.h
|
||||||
)
|
)
|
||||||
target_link_libraries(dwebp webp exampleutil ${WEBP_DEP_LIBRARIES}
|
target_link_libraries(dwebp imagedec webp exampleutil imageioutil
|
||||||
${WEBP_DEP_IMG_LIBRARIES}
|
${WEBP_DEP_LIBRARIES} ${WEBP_DEP_IMG_LIBRARIES}
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -124,7 +128,7 @@ if(WEBP_BUILD_CWEBP)
|
|||||||
add_executable(cwebp
|
add_executable(cwebp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/examples/cwebp.c
|
${CMAKE_CURRENT_SOURCE_DIR}/examples/cwebp.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/examples/stopwatch.h)
|
${CMAKE_CURRENT_SOURCE_DIR}/examples/stopwatch.h)
|
||||||
target_link_libraries(cwebp imagedec webp exampleutil
|
target_link_libraries(cwebp imagedec webp exampleutil imageioutil
|
||||||
${WEBP_DEP_LIBRARIES} ${WEBP_DEP_IMG_LIBRARIES}
|
${WEBP_DEP_LIBRARIES} ${WEBP_DEP_IMG_LIBRARIES}
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
20
Makefile.vc
20
Makefile.vc
@ -289,6 +289,9 @@ ENC_OBJS = \
|
|||||||
$(DIROBJ)\enc\vp8l.obj \
|
$(DIROBJ)\enc\vp8l.obj \
|
||||||
$(DIROBJ)\enc\webpenc.obj \
|
$(DIROBJ)\enc\webpenc.obj \
|
||||||
|
|
||||||
|
IMAGEIO_UTIL_OBJS = \
|
||||||
|
$(DIROBJ)\imageio\imageio_util.obj \
|
||||||
|
|
||||||
MUX_OBJS = \
|
MUX_OBJS = \
|
||||||
$(DIROBJ)\mux\anim_encode.obj \
|
$(DIROBJ)\mux\anim_encode.obj \
|
||||||
$(DIROBJ)\mux\muxedit.obj \
|
$(DIROBJ)\mux\muxedit.obj \
|
||||||
@ -333,18 +336,21 @@ gif2webp: $(DIRBIN)\gif2webp.exe
|
|||||||
anim_diff: $(DIRBIN)\anim_diff.exe
|
anim_diff: $(DIRBIN)\anim_diff.exe
|
||||||
|
|
||||||
$(DIRBIN)\anim_diff.exe: $(DIROBJ)\examples\anim_diff.obj $(EX_ANIM_UTIL_OBJS)
|
$(DIRBIN)\anim_diff.exe: $(DIROBJ)\examples\anim_diff.obj $(EX_ANIM_UTIL_OBJS)
|
||||||
$(DIRBIN)\anim_diff.exe: $(EX_UTIL_OBJS)
|
$(DIRBIN)\anim_diff.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS)
|
||||||
$(DIRBIN)\anim_diff.exe: $(EX_GIF_DEC_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP)
|
$(DIRBIN)\anim_diff.exe: $(EX_GIF_DEC_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP)
|
||||||
$(DIRBIN)\cwebp.exe: $(DIROBJ)\examples\cwebp.obj $(EX_FORMAT_DEC_OBJS)
|
$(DIRBIN)\cwebp.exe: $(DIROBJ)\examples\cwebp.obj $(EX_FORMAT_DEC_OBJS)
|
||||||
$(DIRBIN)\dwebp.exe: $(DIROBJ)\examples\dwebp.obj
|
$(DIRBIN)\cwebp.exe: $(IMAGEIO_UTIL_OBJS)
|
||||||
|
$(DIRBIN)\dwebp.exe: $(DIROBJ)\examples\dwebp.obj $(EX_FORMAT_DEC_OBJS)
|
||||||
|
$(DIRBIN)\dwebp.exe: $(IMAGEIO_UTIL_OBJS)
|
||||||
$(DIRBIN)\gif2webp.exe: $(DIROBJ)\examples\gif2webp.obj $(EX_GIF_DEC_OBJS)
|
$(DIRBIN)\gif2webp.exe: $(DIROBJ)\examples\gif2webp.obj $(EX_GIF_DEC_OBJS)
|
||||||
$(DIRBIN)\gif2webp.exe: $(EX_UTIL_OBJS) $(LIBWEBPMUX) $(LIBWEBP)
|
$(DIRBIN)\gif2webp.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(LIBWEBPMUX)
|
||||||
$(DIRBIN)\vwebp.exe: $(DIROBJ)\examples\vwebp.obj
|
$(DIRBIN)\gif2webp.exe: $(LIBWEBP)
|
||||||
$(DIRBIN)\vwebp.exe: $(EX_UTIL_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP)
|
$(DIRBIN)\vwebp.exe: $(DIROBJ)\examples\vwebp.obj $(EX_UTIL_OBJS)
|
||||||
|
$(DIRBIN)\vwebp.exe: $(IMAGEIO_UTIL_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP)
|
||||||
$(DIRBIN)\webpmux.exe: $(DIROBJ)\examples\webpmux.obj $(LIBWEBPMUX)
|
$(DIRBIN)\webpmux.exe: $(DIROBJ)\examples\webpmux.obj $(LIBWEBPMUX)
|
||||||
$(DIRBIN)\webpmux.exe: $(EX_UTIL_OBJS) $(LIBWEBP)
|
$(DIRBIN)\webpmux.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(LIBWEBP)
|
||||||
$(OUT_EXAMPLES): $(EX_UTIL_OBJS) $(LIBWEBP)
|
$(OUT_EXAMPLES): $(EX_UTIL_OBJS) $(LIBWEBP)
|
||||||
$(EX_UTIL_OBJS) $(EX_FORMAT_DEC_OBJS): $(OUTPUT_DIRS)
|
$(EX_UTIL_OBJS) $(EX_FORMAT_DEC_OBJS) $(IMAGEIO_UTIL_OBJS): $(OUTPUT_DIRS)
|
||||||
!ENDIF # ARCH == ARM
|
!ENDIF # ARCH == ARM
|
||||||
|
|
||||||
experimental:
|
experimental:
|
||||||
|
20
build.gradle
20
build.gradle
@ -255,6 +255,22 @@ model {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
imageio_util(NativeLibrarySpec) {
|
||||||
|
binaries {
|
||||||
|
all {
|
||||||
|
lib library: "webp", linkage: "static"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sources {
|
||||||
|
c {
|
||||||
|
source {
|
||||||
|
srcDir "./imageio"
|
||||||
|
include "imageio_util.c"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
imagedec(NativeLibrarySpec) {
|
imagedec(NativeLibrarySpec) {
|
||||||
binaries {
|
binaries {
|
||||||
all {
|
all {
|
||||||
@ -280,6 +296,7 @@ model {
|
|||||||
all {
|
all {
|
||||||
lib library: "example_util", linkage: "static"
|
lib library: "example_util", linkage: "static"
|
||||||
lib library: "imagedec", linkage: "static"
|
lib library: "imagedec", linkage: "static"
|
||||||
|
lib library: "imageio_util", linkage: "static"
|
||||||
lib library: "webp", linkage: "static"
|
lib library: "webp", linkage: "static"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -297,6 +314,8 @@ model {
|
|||||||
binaries {
|
binaries {
|
||||||
all {
|
all {
|
||||||
lib library: "example_util", linkage: "static"
|
lib library: "example_util", linkage: "static"
|
||||||
|
lib library: "imagedec", linkage: "static"
|
||||||
|
lib library: "imageio_util", linkage: "static"
|
||||||
lib library: "webp"
|
lib library: "webp"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -314,6 +333,7 @@ model {
|
|||||||
binaries {
|
binaries {
|
||||||
all {
|
all {
|
||||||
lib library: "example_util", linkage: "static"
|
lib library: "example_util", linkage: "static"
|
||||||
|
lib library: "imageio_util", linkage: "static"
|
||||||
lib library: "webpmux", linkage: "static"
|
lib library: "webpmux", linkage: "static"
|
||||||
lib library: "webp"
|
lib library: "webp"
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ LOCAL_SRC_FILES := \
|
|||||||
|
|
||||||
LOCAL_CFLAGS := $(WEBP_CFLAGS)
|
LOCAL_CFLAGS := $(WEBP_CFLAGS)
|
||||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
|
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
|
||||||
LOCAL_STATIC_LIBRARIES := example_util imagedec webp
|
LOCAL_STATIC_LIBRARIES := example_util imageio_util imagedec webp
|
||||||
|
|
||||||
LOCAL_MODULE := cwebp
|
LOCAL_MODULE := cwebp
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ LOCAL_SRC_FILES := \
|
|||||||
|
|
||||||
LOCAL_CFLAGS := $(WEBP_CFLAGS)
|
LOCAL_CFLAGS := $(WEBP_CFLAGS)
|
||||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
|
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
|
||||||
LOCAL_STATIC_LIBRARIES := example_util webp
|
LOCAL_STATIC_LIBRARIES := example_util imageio_util imagedec webp
|
||||||
|
|
||||||
LOCAL_MODULE := dwebp
|
LOCAL_MODULE := dwebp
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ LOCAL_SRC_FILES := \
|
|||||||
|
|
||||||
LOCAL_CFLAGS := $(WEBP_CFLAGS)
|
LOCAL_CFLAGS := $(WEBP_CFLAGS)
|
||||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
|
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
|
||||||
LOCAL_STATIC_LIBRARIES := example_util webpmux webp
|
LOCAL_STATIC_LIBRARIES := example_util imageio_util webpmux webp
|
||||||
|
|
||||||
LOCAL_MODULE := webpmux_example
|
LOCAL_MODULE := webpmux_example
|
||||||
|
|
||||||
|
@ -19,40 +19,41 @@ endif
|
|||||||
anim_diff_SOURCES = anim_diff.c anim_util.c anim_util.h
|
anim_diff_SOURCES = anim_diff.c anim_util.c anim_util.h
|
||||||
anim_diff_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE) $(GIF_INCLUDES)
|
anim_diff_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE) $(GIF_INCLUDES)
|
||||||
anim_diff_LDADD = ../src/demux/libwebpdemux.la
|
anim_diff_LDADD = ../src/demux/libwebpdemux.la
|
||||||
anim_diff_LDADD += ../imageio/libexample_util.la
|
anim_diff_LDADD += ../imageio/libexample_util.la ../imageio/libimageio_util.la
|
||||||
anim_diff_LDADD += $(GIF_LIBS) -lm
|
anim_diff_LDADD += $(GIF_LIBS) -lm
|
||||||
|
|
||||||
dwebp_SOURCES = dwebp.c stopwatch.h
|
dwebp_SOURCES = dwebp.c stopwatch.h
|
||||||
dwebp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE)
|
dwebp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE)
|
||||||
dwebp_CPPFLAGS += $(JPEG_INCLUDES) $(PNG_INCLUDES)
|
dwebp_CPPFLAGS += $(JPEG_INCLUDES) $(PNG_INCLUDES)
|
||||||
dwebp_LDADD = ../imageio/libexample_util.la $(PNG_LIBS) $(JPEG_LIBS)
|
dwebp_LDADD = ../imageio/libexample_util.la ../imageio/libimageio_util.la
|
||||||
|
dwebp_LDADD += ../imageio/libimagedec.la ../src/libwebp.la
|
||||||
|
dwebp_LDADD +=$(PNG_LIBS) $(JPEG_LIBS)
|
||||||
|
|
||||||
cwebp_SOURCES = cwebp.c stopwatch.h
|
cwebp_SOURCES = cwebp.c stopwatch.h
|
||||||
cwebp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE)
|
cwebp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE)
|
||||||
cwebp_LDADD = ../imageio/libexample_util.la ../imageio/libimagedec.la
|
cwebp_LDADD = ../imageio/libexample_util.la ../imageio/libimageio_util.la
|
||||||
cwebp_LDADD += ../src/libwebp.la $(JPEG_LIBS) $(PNG_LIBS) $(TIFF_LIBS)
|
cwebp_LDADD += ../imageio/libimagedec.la ../src/libwebp.la
|
||||||
|
cwebp_LDADD += $(JPEG_LIBS) $(PNG_LIBS) $(TIFF_LIBS)
|
||||||
|
|
||||||
gif2webp_SOURCES = gif2webp.c gifdec.c gifdec.h
|
gif2webp_SOURCES = gif2webp.c gifdec.c gifdec.h
|
||||||
gif2webp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE) $(GIF_INCLUDES)
|
gif2webp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE) $(GIF_INCLUDES)
|
||||||
gif2webp_LDADD = ../imageio/libexample_util.la ../src/mux/libwebpmux.la
|
gif2webp_LDADD = ../imageio/libexample_util.la ../imageio/libimageio_util.la
|
||||||
gif2webp_LDADD += ../src/libwebp.la $(GIF_LIBS)
|
gif2webp_LDADD += ../src/mux/libwebpmux.la ../src/libwebp.la $(GIF_LIBS)
|
||||||
|
|
||||||
webpmux_SOURCES = webpmux.c
|
webpmux_SOURCES = webpmux.c
|
||||||
webpmux_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE)
|
webpmux_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE)
|
||||||
webpmux_LDADD = ../imageio/libexample_util.la ../src/mux/libwebpmux.la
|
webpmux_LDADD = ../imageio/libexample_util.la ../imageio/libimageio_util.la
|
||||||
webpmux_LDADD += ../src/libwebp.la
|
webpmux_LDADD += ../src/mux/libwebpmux.la ../src/libwebp.la
|
||||||
|
|
||||||
vwebp_SOURCES = vwebp.c
|
vwebp_SOURCES = vwebp.c
|
||||||
vwebp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE) $(GL_INCLUDES)
|
vwebp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE) $(GL_INCLUDES)
|
||||||
vwebp_LDADD = ../imageio/libexample_util.la ../src/demux/libwebpdemux.la
|
vwebp_LDADD = ../imageio/libexample_util.la ../imageio/libimageio_util.la
|
||||||
vwebp_LDADD += $(GL_LIBS)
|
vwebp_LDADD += ../src/demux/libwebpdemux.la $(GL_LIBS)
|
||||||
|
|
||||||
if BUILD_LIBWEBPDECODER
|
if BUILD_LIBWEBPDECODER
|
||||||
anim_diff_LDADD += ../src/libwebpdecoder.la
|
anim_diff_LDADD += ../src/libwebpdecoder.la
|
||||||
dwebp_LDADD += ../src/libwebpdecoder.la
|
|
||||||
vwebp_LDADD += ../src/libwebpdecoder.la
|
vwebp_LDADD += ../src/libwebpdecoder.la
|
||||||
else
|
else
|
||||||
anim_diff_LDADD += ../src/libwebp.la
|
anim_diff_LDADD += ../src/libwebp.la
|
||||||
dwebp_LDADD += ../src/libwebp.la
|
|
||||||
vwebp_LDADD += ../src/libwebp.la
|
vwebp_LDADD += ../src/libwebp.la
|
||||||
endif
|
endif
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include "webp/format_constants.h"
|
#include "webp/format_constants.h"
|
||||||
#include "webp/decode.h"
|
#include "webp/decode.h"
|
||||||
#include "webp/demux.h"
|
#include "webp/demux.h"
|
||||||
#include "../imageio/example_util.h"
|
#include "../imageio/imageio_util.h"
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include "../imageio/example_util.h"
|
#include "../imageio/example_util.h"
|
||||||
#include "../imageio/image_dec.h"
|
#include "../imageio/image_dec.h"
|
||||||
|
#include "../imageio/imageio_util.h"
|
||||||
#include "./stopwatch.h"
|
#include "./stopwatch.h"
|
||||||
#include "webp/encode.h"
|
#include "webp/encode.h"
|
||||||
|
|
||||||
|
@ -41,6 +41,8 @@
|
|||||||
|
|
||||||
#include "webp/decode.h"
|
#include "webp/decode.h"
|
||||||
#include "../imageio/example_util.h"
|
#include "../imageio/example_util.h"
|
||||||
|
#include "../imageio/imageio_util.h"
|
||||||
|
#include "../imageio/webpdec.h"
|
||||||
#include "./stopwatch.h"
|
#include "./stopwatch.h"
|
||||||
|
|
||||||
static int verbose = 0;
|
static int verbose = 0;
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "webp/encode.h"
|
#include "webp/encode.h"
|
||||||
#include "webp/mux.h"
|
#include "webp/mux.h"
|
||||||
#include "../imageio/example_util.h"
|
#include "../imageio/example_util.h"
|
||||||
|
#include "../imageio/imageio_util.h"
|
||||||
#include "./gifdec.h"
|
#include "./gifdec.h"
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include "webp/demux.h"
|
#include "webp/demux.h"
|
||||||
|
|
||||||
#include "../imageio/example_util.h"
|
#include "../imageio/example_util.h"
|
||||||
|
#include "../imageio/imageio_util.h"
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
|
@ -56,6 +56,7 @@
|
|||||||
#include "webp/decode.h"
|
#include "webp/decode.h"
|
||||||
#include "webp/mux.h"
|
#include "webp/mux.h"
|
||||||
#include "../imageio/example_util.h"
|
#include "../imageio/example_util.h"
|
||||||
|
#include "../imageio/imageio_util.h"
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Config object to parse command-line arguments.
|
// Config object to parse command-line arguments.
|
||||||
|
@ -14,12 +14,12 @@ noinst_PROGRAMS = get_disto webp_quality
|
|||||||
|
|
||||||
get_disto_SOURCES = get_disto.c
|
get_disto_SOURCES = get_disto.c
|
||||||
get_disto_CPPFLAGS = $(AM_CPPFLAGS)
|
get_disto_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
get_disto_LDADD = ../imageio/libexample_util.la ../imageio/libimagedec.la
|
get_disto_LDADD = ../imageio/libimageio_util.la ../imageio/libimagedec.la
|
||||||
get_disto_LDADD += ../src/libwebp.la
|
get_disto_LDADD += ../src/libwebp.la
|
||||||
get_disto_LDADD += $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS)
|
get_disto_LDADD += $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS)
|
||||||
|
|
||||||
webp_quality_SOURCES = webp_quality.c
|
webp_quality_SOURCES = webp_quality.c
|
||||||
webp_quality_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE)
|
webp_quality_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE)
|
||||||
webp_quality_LDADD = ../imageio/libexample_util.la ../imageio/libimagedec.la
|
webp_quality_LDADD = ../imageio/libimageio_util.la ../imageio/libimagedec.la
|
||||||
webp_quality_LDADD += ./libwebpextras.la
|
webp_quality_LDADD += ./libwebpextras.la
|
||||||
webp_quality_LDADD += ../src/libwebp.la $(JPEG_LIBS) $(PNG_LIBS) $(TIFF_LIBS)
|
webp_quality_LDADD += ../src/libwebp.la $(JPEG_LIBS) $(PNG_LIBS) $(TIFF_LIBS)
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "webp/encode.h"
|
#include "webp/encode.h"
|
||||||
#include "../imageio/example_util.h"
|
|
||||||
#include "../imageio/image_dec.h"
|
#include "../imageio/image_dec.h"
|
||||||
|
#include "../imageio/imageio_util.h"
|
||||||
|
|
||||||
static size_t ReadPicture(const char* const filename, WebPPicture* const pic,
|
static size_t ReadPicture(const char* const filename, WebPPicture* const pic,
|
||||||
int keep_alpha) {
|
int keep_alpha) {
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "./extras.h"
|
#include "./extras.h"
|
||||||
#include "../imageio/example_util.h"
|
#include "../imageio/imageio_util.h"
|
||||||
|
|
||||||
int main(int argc, const char *argv[]) {
|
int main(int argc, const char *argv[]) {
|
||||||
int c;
|
int c;
|
||||||
|
@ -15,6 +15,21 @@ LOCAL_MODULE := example_util
|
|||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# libimageio_util
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
imageio_util.c \
|
||||||
|
|
||||||
|
LOCAL_CFLAGS := $(WEBP_CFLAGS)
|
||||||
|
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
|
||||||
|
|
||||||
|
LOCAL_MODULE := imageio_util
|
||||||
|
|
||||||
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# libimagedec
|
# libimagedec
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src
|
AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src
|
||||||
noinst_LTLIBRARIES = libexample_util.la libimagedec.la
|
noinst_LTLIBRARIES = libexample_util.la libimageio_util.la libimagedec.la
|
||||||
|
|
||||||
noinst_HEADERS =
|
noinst_HEADERS =
|
||||||
noinst_HEADERS += ../src/webp/decode.h
|
noinst_HEADERS += ../src/webp/decode.h
|
||||||
@ -8,6 +8,8 @@ noinst_HEADERS += ../examples/stopwatch.h
|
|||||||
|
|
||||||
libexample_util_la_SOURCES = example_util.c example_util.h
|
libexample_util_la_SOURCES = example_util.c example_util.h
|
||||||
|
|
||||||
|
libimageio_util_la_SOURCES = imageio_util.c imageio_util.h
|
||||||
|
|
||||||
libimagedec_la_SOURCES = image_dec.c image_dec.h
|
libimagedec_la_SOURCES = image_dec.c image_dec.h
|
||||||
libimagedec_la_SOURCES += jpegdec.c jpegdec.h
|
libimagedec_la_SOURCES += jpegdec.c jpegdec.h
|
||||||
libimagedec_la_SOURCES += metadata.c metadata.h
|
libimagedec_la_SOURCES += metadata.c metadata.h
|
||||||
|
@ -12,16 +12,8 @@
|
|||||||
|
|
||||||
#include "./example_util.h"
|
#include "./example_util.h"
|
||||||
|
|
||||||
#if defined(_WIN32)
|
|
||||||
#include <fcntl.h> // for _O_BINARY
|
|
||||||
#include <io.h> // for _setmode()
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "webp/decode.h"
|
|
||||||
#include "../examples/stopwatch.h"
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// String parsing
|
// String parsing
|
||||||
@ -51,231 +43,3 @@ float ExUtilGetFloat(const char* const v, int* const error) {
|
|||||||
}
|
}
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
// File I/O
|
|
||||||
|
|
||||||
FILE* ExUtilSetBinaryMode(FILE* file) {
|
|
||||||
#if defined(_WIN32)
|
|
||||||
if (_setmode(_fileno(file), _O_BINARY) == -1) {
|
|
||||||
fprintf(stderr, "Failed to reopen file in O_BINARY mode.\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ExUtilReadFromStdin(const uint8_t** data, size_t* data_size) {
|
|
||||||
static const size_t kBlockSize = 16384; // default initial size
|
|
||||||
size_t max_size = 0;
|
|
||||||
size_t size = 0;
|
|
||||||
uint8_t* input = NULL;
|
|
||||||
|
|
||||||
if (data == NULL || data_size == NULL) return 0;
|
|
||||||
*data = NULL;
|
|
||||||
*data_size = 0;
|
|
||||||
|
|
||||||
if (!ExUtilSetBinaryMode(stdin)) return 0;
|
|
||||||
|
|
||||||
while (!feof(stdin)) {
|
|
||||||
// We double the buffer size each time and read as much as possible.
|
|
||||||
const size_t extra_size = (max_size == 0) ? kBlockSize : max_size;
|
|
||||||
void* const new_data = realloc(input, max_size + extra_size);
|
|
||||||
if (new_data == NULL) goto Error;
|
|
||||||
input = (uint8_t*)new_data;
|
|
||||||
max_size += extra_size;
|
|
||||||
size += fread(input + size, 1, extra_size, stdin);
|
|
||||||
if (size < max_size) break;
|
|
||||||
}
|
|
||||||
if (ferror(stdin)) goto Error;
|
|
||||||
*data = input;
|
|
||||||
*data_size = size;
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
Error:
|
|
||||||
free(input);
|
|
||||||
fprintf(stderr, "Could not read from stdin\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ExUtilReadFile(const char* const file_name,
|
|
||||||
const uint8_t** data, size_t* data_size) {
|
|
||||||
int ok;
|
|
||||||
void* file_data;
|
|
||||||
size_t file_size;
|
|
||||||
FILE* in;
|
|
||||||
const int from_stdin = (file_name == NULL) || !strcmp(file_name, "-");
|
|
||||||
|
|
||||||
if (from_stdin) return ExUtilReadFromStdin(data, data_size);
|
|
||||||
|
|
||||||
if (data == NULL || data_size == NULL) return 0;
|
|
||||||
*data = NULL;
|
|
||||||
*data_size = 0;
|
|
||||||
|
|
||||||
in = fopen(file_name, "rb");
|
|
||||||
if (in == NULL) {
|
|
||||||
fprintf(stderr, "cannot open input file '%s'\n", file_name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
fseek(in, 0, SEEK_END);
|
|
||||||
file_size = ftell(in);
|
|
||||||
fseek(in, 0, SEEK_SET);
|
|
||||||
file_data = malloc(file_size);
|
|
||||||
if (file_data == NULL) return 0;
|
|
||||||
ok = (fread(file_data, file_size, 1, in) == 1);
|
|
||||||
fclose(in);
|
|
||||||
|
|
||||||
if (!ok) {
|
|
||||||
fprintf(stderr, "Could not read %d bytes of data from file %s\n",
|
|
||||||
(int)file_size, file_name);
|
|
||||||
free(file_data);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
*data = (uint8_t*)file_data;
|
|
||||||
*data_size = file_size;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ExUtilWriteFile(const char* const file_name,
|
|
||||||
const uint8_t* data, size_t data_size) {
|
|
||||||
int ok;
|
|
||||||
FILE* out;
|
|
||||||
const int to_stdout = (file_name == NULL) || !strcmp(file_name, "-");
|
|
||||||
|
|
||||||
if (data == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
out = to_stdout ? stdout : fopen(file_name, "wb");
|
|
||||||
if (out == NULL) {
|
|
||||||
fprintf(stderr, "Error! Cannot open output file '%s'\n", file_name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
ok = (fwrite(data, data_size, 1, out) == 1);
|
|
||||||
if (out != stdout) fclose(out);
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// WebP decoding
|
|
||||||
|
|
||||||
static const char* const kStatusMessages[VP8_STATUS_NOT_ENOUGH_DATA + 1] = {
|
|
||||||
"OK", "OUT_OF_MEMORY", "INVALID_PARAM", "BITSTREAM_ERROR",
|
|
||||||
"UNSUPPORTED_FEATURE", "SUSPENDED", "USER_ABORT", "NOT_ENOUGH_DATA"
|
|
||||||
};
|
|
||||||
|
|
||||||
static void PrintAnimationWarning(const WebPDecoderConfig* const config) {
|
|
||||||
if (config->input.has_animation) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"Error! Decoding of an animated WebP file is not supported.\n"
|
|
||||||
" Use webpmux to extract the individual frames or\n"
|
|
||||||
" vwebp to view this image.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExUtilPrintWebPError(const char* const in_file, int status) {
|
|
||||||
fprintf(stderr, "Decoding of %s failed.\n", in_file);
|
|
||||||
fprintf(stderr, "Status: %d", status);
|
|
||||||
if (status >= VP8_STATUS_OK && status <= VP8_STATUS_NOT_ENOUGH_DATA) {
|
|
||||||
fprintf(stderr, "(%s)", kStatusMessages[status]);
|
|
||||||
}
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
int ExUtilLoadWebP(const char* const in_file,
|
|
||||||
const uint8_t** data, size_t* data_size,
|
|
||||||
WebPBitstreamFeatures* bitstream) {
|
|
||||||
VP8StatusCode status;
|
|
||||||
WebPBitstreamFeatures local_features;
|
|
||||||
if (!ExUtilReadFile(in_file, data, data_size)) return 0;
|
|
||||||
|
|
||||||
if (bitstream == NULL) {
|
|
||||||
bitstream = &local_features;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = WebPGetFeatures(*data, *data_size, bitstream);
|
|
||||||
if (status != VP8_STATUS_OK) {
|
|
||||||
free((void*)*data);
|
|
||||||
*data = NULL;
|
|
||||||
*data_size = 0;
|
|
||||||
ExUtilPrintWebPError(in_file, status);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
VP8StatusCode ExUtilDecodeWebP(const uint8_t* const data, size_t data_size,
|
|
||||||
int verbose, WebPDecoderConfig* const config) {
|
|
||||||
Stopwatch stop_watch;
|
|
||||||
VP8StatusCode status = VP8_STATUS_OK;
|
|
||||||
if (config == NULL) return VP8_STATUS_INVALID_PARAM;
|
|
||||||
|
|
||||||
PrintAnimationWarning(config);
|
|
||||||
|
|
||||||
StopwatchReset(&stop_watch);
|
|
||||||
|
|
||||||
// Decoding call.
|
|
||||||
status = WebPDecode(data, data_size, config);
|
|
||||||
|
|
||||||
if (verbose) {
|
|
||||||
const double decode_time = StopwatchReadAndReset(&stop_watch);
|
|
||||||
fprintf(stderr, "Time to decode picture: %.3fs\n", decode_time);
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
VP8StatusCode ExUtilDecodeWebPIncremental(
|
|
||||||
const uint8_t* const data, size_t data_size,
|
|
||||||
int verbose, WebPDecoderConfig* const config) {
|
|
||||||
Stopwatch stop_watch;
|
|
||||||
VP8StatusCode status = VP8_STATUS_OK;
|
|
||||||
if (config == NULL) return VP8_STATUS_INVALID_PARAM;
|
|
||||||
|
|
||||||
PrintAnimationWarning(config);
|
|
||||||
|
|
||||||
StopwatchReset(&stop_watch);
|
|
||||||
|
|
||||||
// Decoding call.
|
|
||||||
{
|
|
||||||
WebPIDecoder* const idec = WebPIDecode(data, data_size, config);
|
|
||||||
if (idec == NULL) {
|
|
||||||
fprintf(stderr, "Failed during WebPINewDecoder().\n");
|
|
||||||
return VP8_STATUS_OUT_OF_MEMORY;
|
|
||||||
} else {
|
|
||||||
#ifdef WEBP_EXPERIMENTAL_FEATURES
|
|
||||||
size_t size = 0;
|
|
||||||
const size_t incr = 2 + (data_size / 20);
|
|
||||||
while (size < data_size) {
|
|
||||||
size_t next_size = size + (rand() % incr);
|
|
||||||
if (next_size > data_size) next_size = data_size;
|
|
||||||
status = WebPIUpdate(idec, data, next_size);
|
|
||||||
if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) break;
|
|
||||||
size = next_size;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = WebPIUpdate(idec, data, data_size);
|
|
||||||
#endif
|
|
||||||
WebPIDelete(idec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (verbose) {
|
|
||||||
const double decode_time = StopwatchReadAndReset(&stop_watch);
|
|
||||||
fprintf(stderr, "Time to decode picture: %.3fs\n", decode_time);
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void ExUtilCopyPlane(const uint8_t* src, int src_stride,
|
|
||||||
uint8_t* dst, int dst_stride, int width, int height) {
|
|
||||||
while (height-- > 0) {
|
|
||||||
memcpy(dst, src, width * sizeof(*dst));
|
|
||||||
src += src_stride;
|
|
||||||
dst += dst_stride;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
@ -13,8 +13,7 @@
|
|||||||
#ifndef WEBP_IMAGEIO_EXAMPLE_UTIL_H_
|
#ifndef WEBP_IMAGEIO_EXAMPLE_UTIL_H_
|
||||||
#define WEBP_IMAGEIO_EXAMPLE_UTIL_H_
|
#define WEBP_IMAGEIO_EXAMPLE_UTIL_H_
|
||||||
|
|
||||||
#include <stdio.h>
|
#include "webp/types.h"
|
||||||
#include "webp/decode.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -30,64 +29,6 @@ uint32_t ExUtilGetUInt(const char* const v, int base, int* const error);
|
|||||||
int ExUtilGetInt(const char* const v, int base, int* const error);
|
int ExUtilGetInt(const char* const v, int base, int* const error);
|
||||||
float ExUtilGetFloat(const char* const v, int* const error);
|
float ExUtilGetFloat(const char* const v, int* const error);
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// File I/O
|
|
||||||
|
|
||||||
// Reopen file in binary (O_BINARY) mode.
|
|
||||||
// Returns 'file' on success, NULL otherwise.
|
|
||||||
FILE* ExUtilSetBinaryMode(FILE* file);
|
|
||||||
|
|
||||||
// Allocates storage for entire file 'file_name' and returns contents and size
|
|
||||||
// in 'data' and 'data_size'. Returns 1 on success, 0 otherwise. '*data' should
|
|
||||||
// be deleted using free().
|
|
||||||
// If 'file_name' is NULL or equal to "-", input is read from stdin by calling
|
|
||||||
// the function ExUtilReadFromStdin().
|
|
||||||
int ExUtilReadFile(const char* const file_name,
|
|
||||||
const uint8_t** data, size_t* data_size);
|
|
||||||
|
|
||||||
// Same as ExUtilReadFile(), but reads until EOF from stdin instead.
|
|
||||||
int ExUtilReadFromStdin(const uint8_t** data, size_t* data_size);
|
|
||||||
|
|
||||||
// Write a data segment into a file named 'file_name'. Returns true if ok.
|
|
||||||
// If 'file_name' is NULL or equal to "-", output is written to stdout.
|
|
||||||
int ExUtilWriteFile(const char* const file_name,
|
|
||||||
const uint8_t* data, size_t data_size);
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Copy width x height pixels from 'src' to 'dst' honoring the strides.
|
|
||||||
void ExUtilCopyPlane(const uint8_t* src, int src_stride,
|
|
||||||
uint8_t* dst, int dst_stride, int width, int height);
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// WebP decoding
|
|
||||||
|
|
||||||
// Prints an informative error message regarding decode failure of 'in_file'.
|
|
||||||
// 'status' is treated as a VP8StatusCode and if valid will be printed as a
|
|
||||||
// text string.
|
|
||||||
void ExUtilPrintWebPError(const char* const in_file, int status);
|
|
||||||
|
|
||||||
// Reads a WebP from 'in_file', returning the contents and size in 'data' and
|
|
||||||
// 'data_size'. If not NULL, 'bitstream' is populated using WebPGetFeatures().
|
|
||||||
// Returns true on success.
|
|
||||||
int ExUtilLoadWebP(const char* const in_file,
|
|
||||||
const uint8_t** data, size_t* data_size,
|
|
||||||
WebPBitstreamFeatures* bitstream);
|
|
||||||
|
|
||||||
// Decodes the WebP contained in 'data'.
|
|
||||||
// 'config' is a structure previously initialized by WebPInitDecoderConfig().
|
|
||||||
// 'config->output' should have the desired colorspace selected. 'verbose' will
|
|
||||||
// cause decode timing to be reported.
|
|
||||||
// Returns the decoder status. On success 'config->output' will contain the
|
|
||||||
// decoded picture.
|
|
||||||
VP8StatusCode ExUtilDecodeWebP(const uint8_t* const data, size_t data_size,
|
|
||||||
int verbose, WebPDecoderConfig* const config);
|
|
||||||
|
|
||||||
// Same as ExUtilDecodeWebP(), but using the incremental decoder.
|
|
||||||
VP8StatusCode ExUtilDecodeWebPIncremental(
|
|
||||||
const uint8_t* const data, size_t data_size,
|
|
||||||
int verbose, WebPDecoderConfig* const config);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
136
imageio/imageio_util.c
Normal file
136
imageio/imageio_util.c
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
// Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Use of this source code is governed by a BSD-style license
|
||||||
|
// that can be found in the COPYING file in the root of the source
|
||||||
|
// tree. An additional intellectual property rights grant can be found
|
||||||
|
// in the file PATENTS. All contributing project authors may
|
||||||
|
// be found in the AUTHORS file in the root of the source tree.
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Utility functions used by the image decoders.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "./imageio_util.h"
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#include <fcntl.h> // for _O_BINARY
|
||||||
|
#include <io.h> // for _setmode()
|
||||||
|
#endif
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// File I/O
|
||||||
|
|
||||||
|
FILE* ExUtilSetBinaryMode(FILE* file) {
|
||||||
|
#if defined(_WIN32)
|
||||||
|
if (_setmode(_fileno(file), _O_BINARY) == -1) {
|
||||||
|
fprintf(stderr, "Failed to reopen file in O_BINARY mode.\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ExUtilReadFromStdin(const uint8_t** data, size_t* data_size) {
|
||||||
|
static const size_t kBlockSize = 16384; // default initial size
|
||||||
|
size_t max_size = 0;
|
||||||
|
size_t size = 0;
|
||||||
|
uint8_t* input = NULL;
|
||||||
|
|
||||||
|
if (data == NULL || data_size == NULL) return 0;
|
||||||
|
*data = NULL;
|
||||||
|
*data_size = 0;
|
||||||
|
|
||||||
|
if (!ExUtilSetBinaryMode(stdin)) return 0;
|
||||||
|
|
||||||
|
while (!feof(stdin)) {
|
||||||
|
// We double the buffer size each time and read as much as possible.
|
||||||
|
const size_t extra_size = (max_size == 0) ? kBlockSize : max_size;
|
||||||
|
void* const new_data = realloc(input, max_size + extra_size);
|
||||||
|
if (new_data == NULL) goto Error;
|
||||||
|
input = (uint8_t*)new_data;
|
||||||
|
max_size += extra_size;
|
||||||
|
size += fread(input + size, 1, extra_size, stdin);
|
||||||
|
if (size < max_size) break;
|
||||||
|
}
|
||||||
|
if (ferror(stdin)) goto Error;
|
||||||
|
*data = input;
|
||||||
|
*data_size = size;
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
Error:
|
||||||
|
free(input);
|
||||||
|
fprintf(stderr, "Could not read from stdin\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ExUtilReadFile(const char* const file_name,
|
||||||
|
const uint8_t** data, size_t* data_size) {
|
||||||
|
int ok;
|
||||||
|
void* file_data;
|
||||||
|
size_t file_size;
|
||||||
|
FILE* in;
|
||||||
|
const int from_stdin = (file_name == NULL) || !strcmp(file_name, "-");
|
||||||
|
|
||||||
|
if (from_stdin) return ExUtilReadFromStdin(data, data_size);
|
||||||
|
|
||||||
|
if (data == NULL || data_size == NULL) return 0;
|
||||||
|
*data = NULL;
|
||||||
|
*data_size = 0;
|
||||||
|
|
||||||
|
in = fopen(file_name, "rb");
|
||||||
|
if (in == NULL) {
|
||||||
|
fprintf(stderr, "cannot open input file '%s'\n", file_name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
fseek(in, 0, SEEK_END);
|
||||||
|
file_size = ftell(in);
|
||||||
|
fseek(in, 0, SEEK_SET);
|
||||||
|
file_data = malloc(file_size);
|
||||||
|
if (file_data == NULL) return 0;
|
||||||
|
ok = (fread(file_data, file_size, 1, in) == 1);
|
||||||
|
fclose(in);
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
fprintf(stderr, "Could not read %d bytes of data from file %s\n",
|
||||||
|
(int)file_size, file_name);
|
||||||
|
free(file_data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*data = (uint8_t*)file_data;
|
||||||
|
*data_size = file_size;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ExUtilWriteFile(const char* const file_name,
|
||||||
|
const uint8_t* data, size_t data_size) {
|
||||||
|
int ok;
|
||||||
|
FILE* out;
|
||||||
|
const int to_stdout = (file_name == NULL) || !strcmp(file_name, "-");
|
||||||
|
|
||||||
|
if (data == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
out = to_stdout ? stdout : fopen(file_name, "wb");
|
||||||
|
if (out == NULL) {
|
||||||
|
fprintf(stderr, "Error! Cannot open output file '%s'\n", file_name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ok = (fwrite(data, data_size, 1, out) == 1);
|
||||||
|
if (out != stdout) fclose(out);
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void ExUtilCopyPlane(const uint8_t* src, int src_stride,
|
||||||
|
uint8_t* dst, int dst_stride, int width, int height) {
|
||||||
|
while (height-- > 0) {
|
||||||
|
memcpy(dst, src, width * sizeof(*dst));
|
||||||
|
src += src_stride;
|
||||||
|
dst += dst_stride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
56
imageio/imageio_util.h
Normal file
56
imageio/imageio_util.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
// Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Use of this source code is governed by a BSD-style license
|
||||||
|
// that can be found in the COPYING file in the root of the source
|
||||||
|
// tree. An additional intellectual property rights grant can be found
|
||||||
|
// in the file PATENTS. All contributing project authors may
|
||||||
|
// be found in the AUTHORS file in the root of the source tree.
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Utility functions used by the image decoders.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef WEBP_IMAGEIO_IMAGEIO_UTIL_H_
|
||||||
|
#define WEBP_IMAGEIO_IMAGEIO_UTIL_H_
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "webp/types.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// File I/O
|
||||||
|
|
||||||
|
// Reopen file in binary (O_BINARY) mode.
|
||||||
|
// Returns 'file' on success, NULL otherwise.
|
||||||
|
FILE* ExUtilSetBinaryMode(FILE* file);
|
||||||
|
|
||||||
|
// Allocates storage for entire file 'file_name' and returns contents and size
|
||||||
|
// in 'data' and 'data_size'. Returns 1 on success, 0 otherwise. '*data' should
|
||||||
|
// be deleted using free().
|
||||||
|
// If 'file_name' is NULL or equal to "-", input is read from stdin by calling
|
||||||
|
// the function ExUtilReadFromStdin().
|
||||||
|
int ExUtilReadFile(const char* const file_name,
|
||||||
|
const uint8_t** data, size_t* data_size);
|
||||||
|
|
||||||
|
// Same as ExUtilReadFile(), but reads until EOF from stdin instead.
|
||||||
|
int ExUtilReadFromStdin(const uint8_t** data, size_t* data_size);
|
||||||
|
|
||||||
|
// Write a data segment into a file named 'file_name'. Returns true if ok.
|
||||||
|
// If 'file_name' is NULL or equal to "-", output is written to stdout.
|
||||||
|
int ExUtilWriteFile(const char* const file_name,
|
||||||
|
const uint8_t* data, size_t data_size);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Copy width x height pixels from 'src' to 'dst' honoring the strides.
|
||||||
|
void ExUtilCopyPlane(const uint8_t* src, int src_stride,
|
||||||
|
uint8_t* dst, int dst_stride, int width, int height);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // WEBP_IMAGEIO_IMAGEIO_UTIL_H_
|
@ -16,9 +16,124 @@
|
|||||||
|
|
||||||
#include "webp/decode.h"
|
#include "webp/decode.h"
|
||||||
#include "webp/encode.h"
|
#include "webp/encode.h"
|
||||||
#include "./example_util.h"
|
#include "../examples/stopwatch.h"
|
||||||
|
#include "./imageio_util.h"
|
||||||
#include "./metadata.h"
|
#include "./metadata.h"
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// WebP decoding
|
||||||
|
|
||||||
|
static const char* const kStatusMessages[VP8_STATUS_NOT_ENOUGH_DATA + 1] = {
|
||||||
|
"OK", "OUT_OF_MEMORY", "INVALID_PARAM", "BITSTREAM_ERROR",
|
||||||
|
"UNSUPPORTED_FEATURE", "SUSPENDED", "USER_ABORT", "NOT_ENOUGH_DATA"
|
||||||
|
};
|
||||||
|
|
||||||
|
static void PrintAnimationWarning(const WebPDecoderConfig* const config) {
|
||||||
|
if (config->input.has_animation) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error! Decoding of an animated WebP file is not supported.\n"
|
||||||
|
" Use webpmux to extract the individual frames or\n"
|
||||||
|
" vwebp to view this image.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExUtilPrintWebPError(const char* const in_file, int status) {
|
||||||
|
fprintf(stderr, "Decoding of %s failed.\n", in_file);
|
||||||
|
fprintf(stderr, "Status: %d", status);
|
||||||
|
if (status >= VP8_STATUS_OK && status <= VP8_STATUS_NOT_ENOUGH_DATA) {
|
||||||
|
fprintf(stderr, "(%s)", kStatusMessages[status]);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int ExUtilLoadWebP(const char* const in_file,
|
||||||
|
const uint8_t** data, size_t* data_size,
|
||||||
|
WebPBitstreamFeatures* bitstream) {
|
||||||
|
VP8StatusCode status;
|
||||||
|
WebPBitstreamFeatures local_features;
|
||||||
|
if (!ExUtilReadFile(in_file, data, data_size)) return 0;
|
||||||
|
|
||||||
|
if (bitstream == NULL) {
|
||||||
|
bitstream = &local_features;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = WebPGetFeatures(*data, *data_size, bitstream);
|
||||||
|
if (status != VP8_STATUS_OK) {
|
||||||
|
free((void*)*data);
|
||||||
|
*data = NULL;
|
||||||
|
*data_size = 0;
|
||||||
|
ExUtilPrintWebPError(in_file, status);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
VP8StatusCode ExUtilDecodeWebP(const uint8_t* const data, size_t data_size,
|
||||||
|
int verbose, WebPDecoderConfig* const config) {
|
||||||
|
Stopwatch stop_watch;
|
||||||
|
VP8StatusCode status = VP8_STATUS_OK;
|
||||||
|
if (config == NULL) return VP8_STATUS_INVALID_PARAM;
|
||||||
|
|
||||||
|
PrintAnimationWarning(config);
|
||||||
|
|
||||||
|
StopwatchReset(&stop_watch);
|
||||||
|
|
||||||
|
// Decoding call.
|
||||||
|
status = WebPDecode(data, data_size, config);
|
||||||
|
|
||||||
|
if (verbose) {
|
||||||
|
const double decode_time = StopwatchReadAndReset(&stop_watch);
|
||||||
|
fprintf(stderr, "Time to decode picture: %.3fs\n", decode_time);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
VP8StatusCode ExUtilDecodeWebPIncremental(
|
||||||
|
const uint8_t* const data, size_t data_size,
|
||||||
|
int verbose, WebPDecoderConfig* const config) {
|
||||||
|
Stopwatch stop_watch;
|
||||||
|
VP8StatusCode status = VP8_STATUS_OK;
|
||||||
|
if (config == NULL) return VP8_STATUS_INVALID_PARAM;
|
||||||
|
|
||||||
|
PrintAnimationWarning(config);
|
||||||
|
|
||||||
|
StopwatchReset(&stop_watch);
|
||||||
|
|
||||||
|
// Decoding call.
|
||||||
|
{
|
||||||
|
WebPIDecoder* const idec = WebPIDecode(data, data_size, config);
|
||||||
|
if (idec == NULL) {
|
||||||
|
fprintf(stderr, "Failed during WebPINewDecoder().\n");
|
||||||
|
return VP8_STATUS_OUT_OF_MEMORY;
|
||||||
|
} else {
|
||||||
|
#ifdef WEBP_EXPERIMENTAL_FEATURES
|
||||||
|
size_t size = 0;
|
||||||
|
const size_t incr = 2 + (data_size / 20);
|
||||||
|
while (size < data_size) {
|
||||||
|
size_t next_size = size + (rand() % incr);
|
||||||
|
if (next_size > data_size) next_size = data_size;
|
||||||
|
status = WebPIUpdate(idec, data, next_size);
|
||||||
|
if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) break;
|
||||||
|
size = next_size;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
status = WebPIUpdate(idec, data, data_size);
|
||||||
|
#endif
|
||||||
|
WebPIDelete(idec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose) {
|
||||||
|
const double decode_time = StopwatchReadAndReset(&stop_watch);
|
||||||
|
fprintf(stderr, "Time to decode picture: %.3fs\n", decode_time);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
int ReadWebP(const uint8_t* const data, size_t data_size,
|
int ReadWebP(const uint8_t* const data, size_t data_size,
|
||||||
WebPPicture* const pic,
|
WebPPicture* const pic,
|
||||||
int keep_alpha, Metadata* const metadata) {
|
int keep_alpha, Metadata* const metadata) {
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#ifndef WEBP_IMAGEIO_WEBPDEC_H_
|
#ifndef WEBP_IMAGEIO_WEBPDEC_H_
|
||||||
#define WEBP_IMAGEIO_WEBPDEC_H_
|
#define WEBP_IMAGEIO_WEBPDEC_H_
|
||||||
|
|
||||||
#include "webp/types.h"
|
#include "webp/decode.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -21,6 +21,37 @@ extern "C" {
|
|||||||
struct Metadata;
|
struct Metadata;
|
||||||
struct WebPPicture;
|
struct WebPPicture;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// WebP decoding
|
||||||
|
|
||||||
|
// Prints an informative error message regarding decode failure of 'in_file'.
|
||||||
|
// 'status' is treated as a VP8StatusCode and if valid will be printed as a
|
||||||
|
// text string.
|
||||||
|
void ExUtilPrintWebPError(const char* const in_file, int status);
|
||||||
|
|
||||||
|
// Reads a WebP from 'in_file', returning the contents and size in 'data' and
|
||||||
|
// 'data_size'. If not NULL, 'bitstream' is populated using WebPGetFeatures().
|
||||||
|
// Returns true on success.
|
||||||
|
int ExUtilLoadWebP(const char* const in_file,
|
||||||
|
const uint8_t** data, size_t* data_size,
|
||||||
|
WebPBitstreamFeatures* bitstream);
|
||||||
|
|
||||||
|
// Decodes the WebP contained in 'data'.
|
||||||
|
// 'config' is a structure previously initialized by WebPInitDecoderConfig().
|
||||||
|
// 'config->output' should have the desired colorspace selected. 'verbose' will
|
||||||
|
// cause decode timing to be reported.
|
||||||
|
// Returns the decoder status. On success 'config->output' will contain the
|
||||||
|
// decoded picture.
|
||||||
|
VP8StatusCode ExUtilDecodeWebP(const uint8_t* const data, size_t data_size,
|
||||||
|
int verbose, WebPDecoderConfig* const config);
|
||||||
|
|
||||||
|
// Same as ExUtilDecodeWebP(), but using the incremental decoder.
|
||||||
|
VP8StatusCode ExUtilDecodeWebPIncremental(
|
||||||
|
const uint8_t* const data, size_t data_size,
|
||||||
|
int verbose, WebPDecoderConfig* const config);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Reads a WebP from 'in_file', returning the decoded output in 'pic'.
|
// Reads a WebP from 'in_file', returning the decoded output in 'pic'.
|
||||||
// Output is RGBA or YUVA, depending on pic->use_argb value.
|
// Output is RGBA or YUVA, depending on pic->use_argb value.
|
||||||
// If 'keep_alpha' is true and the WebP has an alpha channel, the output is RGBA
|
// If 'keep_alpha' is true and the WebP has an alpha channel, the output is RGBA
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
#include <wincodec.h>
|
#include <wincodec.h>
|
||||||
|
|
||||||
#include "webp/encode.h"
|
#include "webp/encode.h"
|
||||||
#include "./example_util.h"
|
#include "./imageio_util.h"
|
||||||
#include "./metadata.h"
|
#include "./metadata.h"
|
||||||
|
|
||||||
#define IFS(fn) \
|
#define IFS(fn) \
|
||||||
|
@ -228,6 +228,9 @@ EX_UTIL_OBJS = \
|
|||||||
GIFDEC_OBJS = \
|
GIFDEC_OBJS = \
|
||||||
examples/gifdec.o \
|
examples/gifdec.o \
|
||||||
|
|
||||||
|
IMAGE_UTIL_OBJS = \
|
||||||
|
imageio/imageio_util.o \
|
||||||
|
|
||||||
MUX_OBJS = \
|
MUX_OBJS = \
|
||||||
src/mux/anim_encode.o \
|
src/mux/anim_encode.o \
|
||||||
src/mux/muxedit.o \
|
src/mux/muxedit.o \
|
||||||
@ -307,7 +310,8 @@ HDRS = \
|
|||||||
src/webp/format_constants.h \
|
src/webp/format_constants.h \
|
||||||
$(HDRS_INSTALLED) \
|
$(HDRS_INSTALLED) \
|
||||||
|
|
||||||
OUT_LIBS = imageio/libexample_util.a imageio/libimagedec.a src/libwebpdecoder.a
|
OUT_LIBS = imageio/libexample_util.a imageio/libimageio_util.a
|
||||||
|
OUT_LIBS += imageio/libimagedec.a src/libwebpdecoder.a
|
||||||
OUT_LIBS += src/libwebp.a
|
OUT_LIBS += src/libwebp.a
|
||||||
EXTRA_LIB = extras/libwebpextras.a
|
EXTRA_LIB = extras/libwebpextras.a
|
||||||
OUT_EXAMPLES = examples/cwebp examples/dwebp
|
OUT_EXAMPLES = examples/cwebp examples/dwebp
|
||||||
@ -344,6 +348,7 @@ examples/libgifdec.a: $(GIFDEC_OBJS)
|
|||||||
extras/libwebpextras.a: $(LIBWEBPEXTRA_OBJS)
|
extras/libwebpextras.a: $(LIBWEBPEXTRA_OBJS)
|
||||||
imageio/libexample_util.a: $(EX_UTIL_OBJS)
|
imageio/libexample_util.a: $(EX_UTIL_OBJS)
|
||||||
imageio/libimagedec.a: $(EX_FORMAT_DEC_OBJS)
|
imageio/libimagedec.a: $(EX_FORMAT_DEC_OBJS)
|
||||||
|
imageio/libimageio_util.a: $(IMAGE_UTIL_OBJS)
|
||||||
src/libwebpdecoder.a: $(LIBWEBPDECODER_OBJS)
|
src/libwebpdecoder.a: $(LIBWEBPDECODER_OBJS)
|
||||||
src/libwebp.a: $(LIBWEBP_OBJS)
|
src/libwebp.a: $(LIBWEBP_OBJS)
|
||||||
src/mux/libwebpmux.a: $(LIBWEBPMUX_OBJS)
|
src/mux/libwebpmux.a: $(LIBWEBPMUX_OBJS)
|
||||||
@ -361,34 +366,35 @@ examples/webpmux: examples/webpmux.o
|
|||||||
|
|
||||||
examples/anim_diff: examples/libanim_util.a examples/libgifdec.a
|
examples/anim_diff: examples/libanim_util.a examples/libgifdec.a
|
||||||
examples/anim_diff: src/demux/libwebpdemux.a imageio/libexample_util.a
|
examples/anim_diff: src/demux/libwebpdemux.a imageio/libexample_util.a
|
||||||
examples/anim_diff: src/libwebp.a
|
examples/anim_diff: imageio/libimageio_util.a src/libwebp.a
|
||||||
examples/anim_diff: EXTRA_LIBS += $(GIF_LIBS)
|
examples/anim_diff: EXTRA_LIBS += $(GIF_LIBS)
|
||||||
examples/anim_diff: EXTRA_FLAGS += -DWEBP_HAVE_GIF
|
examples/anim_diff: EXTRA_FLAGS += -DWEBP_HAVE_GIF
|
||||||
examples/cwebp: imageio/libexample_util.a imageio/libimagedec.a
|
examples/cwebp: imageio/libexample_util.a imageio/libimageio_util.a
|
||||||
examples/cwebp: src/libwebp.a
|
examples/cwebp: imageio/libimagedec.a src/libwebp.a
|
||||||
examples/cwebp: EXTRA_LIBS += $(CWEBP_LIBS)
|
examples/cwebp: EXTRA_LIBS += $(CWEBP_LIBS)
|
||||||
examples/dwebp: imageio/libexample_util.a src/libwebpdecoder.a
|
examples/dwebp: imageio/libexample_util.a imageio/libimageio_util.a
|
||||||
|
examples/dwebp: imageio/libimagedec.a src/libwebp.a
|
||||||
examples/dwebp: EXTRA_LIBS += $(DWEBP_LIBS)
|
examples/dwebp: EXTRA_LIBS += $(DWEBP_LIBS)
|
||||||
examples/gif2webp: imageio/libexample_util.a examples/libgifdec.a
|
examples/gif2webp: imageio/libexample_util.a imageio/libimageio_util.a
|
||||||
examples/gif2webp: src/mux/libwebpmux.a src/libwebp.a
|
examples/gif2webp: examples/libgifdec.a src/mux/libwebpmux.a src/libwebp.a
|
||||||
examples/gif2webp: EXTRA_LIBS += $(GIF_LIBS)
|
examples/gif2webp: EXTRA_LIBS += $(GIF_LIBS)
|
||||||
examples/gif2webp: EXTRA_FLAGS += -DWEBP_HAVE_GIF
|
examples/gif2webp: EXTRA_FLAGS += -DWEBP_HAVE_GIF
|
||||||
examples/vwebp: imageio/libexample_util.a src/demux/libwebpdemux.a
|
examples/vwebp: imageio/libexample_util.a src/demux/libwebpdemux.a
|
||||||
examples/vwebp: src/libwebp.a
|
examples/vwebp: imageio/libimageio_util.a src/libwebp.a
|
||||||
examples/vwebp: EXTRA_LIBS += $(GL_LIBS)
|
examples/vwebp: EXTRA_LIBS += $(GL_LIBS)
|
||||||
examples/vwebp: EXTRA_FLAGS += -DWEBP_HAVE_GL
|
examples/vwebp: EXTRA_FLAGS += -DWEBP_HAVE_GL
|
||||||
examples/webpmux: imageio/libexample_util.a src/mux/libwebpmux.a
|
examples/webpmux: imageio/libexample_util.a imageio/libimageio_util.a
|
||||||
examples/webpmux: src/libwebpdecoder.a
|
examples/webpmux: src/mux/libwebpmux.a src/libwebpdecoder.a
|
||||||
|
|
||||||
extras/get_disto: extras/get_disto.o
|
extras/get_disto: extras/get_disto.o
|
||||||
extras/get_disto: imageio/libimagedec.a
|
extras/get_disto: imageio/libimagedec.a
|
||||||
extras/get_disto: imageio/libexample_util.a
|
extras/get_disto: imageio/libimageio_util.a
|
||||||
extras/get_disto: src/libwebp.a $(EXTRA_LIB)
|
extras/get_disto: src/libwebp.a $(EXTRA_LIB)
|
||||||
extras/get_disto: EXTRA_LIBS += $(CWEBP_LIBS)
|
extras/get_disto: EXTRA_LIBS += $(CWEBP_LIBS)
|
||||||
|
|
||||||
extras/webp_quality: extras/webp_quality.o
|
extras/webp_quality: extras/webp_quality.o
|
||||||
extras/webp_quality: imageio/libimagedec.a
|
extras/webp_quality: imageio/libimagedec.a
|
||||||
extras/webp_quality: imageio/libexample_util.a
|
extras/webp_quality: imageio/libimageio_util.a
|
||||||
extras/webp_quality: src/libwebp.a $(EXTRA_LIB)
|
extras/webp_quality: src/libwebp.a $(EXTRA_LIB)
|
||||||
extras/get_disto: EXTRA_LIBS += $(CWEBP_LIBS)
|
extras/get_disto: EXTRA_LIBS += $(CWEBP_LIBS)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user