---
Changelog | 1 +
configure | 4 +
doc/general.texi | 4 +-
libavcodec/Makefile | 1 +
libavcodec/allcodecs.c | 1 +
libavcodec/libwebpenc.c | 203 ++++++++++++++++++++++++++++++++++++++++++++++++
libavcodec/version.h | 2 +-
libavformat/img2enc.c | 2 +-
8 files changed, 214 insertions(+), 4 deletions(-)
create mode 100644 libavcodec/libwebpenc.c
diff --git a/Changelog b/Changelog
index 1e58a2c..79f19a1 100644
--- a/Changelog
+++ b/Changelog
@@ -48,6 +48,7 @@ version 10:
- setsar/setdar filters now support variables in ratio expressions
- dar variable in the scale filter now returns the actual DAR (i.e. a * sar)
- VP9 decoder
+- WebP encoding via libwebp
version 9:
diff --git a/configure b/configure
index 05dbca7..e7f41dd 100755
--- a/configure
+++ b/configure
@@ -202,6 +202,7 @@ External library support:
--enable-libvorbis enable Vorbis encoding via libvorbis [no]
--enable-libvpx enable VP8 and VP9 de/encoding via libvpx [no]
--enable-libwavpack enable wavpack encoding via libwavpack [no]
+ --enable-libwebp enable WebP encoding via libwebp [no]
--enable-libx264 enable H.264 encoding via x264 [no]
--enable-libxavs enable AVS encoding via xavs [no]
--enable-libxvid enable Xvid encoding via xvidcore,
@@ -1069,6 +1070,7 @@ EXTERNAL_LIBRARY_LIST="
libvorbis
libvpx
libwavpack
+ libwebp
libx264
libxavs
libxvid
@@ -1808,6 +1810,7 @@ libvpx_vp8_encoder_deps="libvpx"
libvpx_vp9_decoder_deps="libvpx"
libvpx_vp9_encoder_deps="libvpx"
libwavpack_encoder_deps="libwavpack"
+libwebp_encoder_deps="libwebp"
libx264_encoder_deps="libx264"
libxavs_encoder_deps="libxavs"
libxvid_encoder_deps="libxvid"
@@ -3837,6 +3840,7 @@ enabled libvpx && {
enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h"
"vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder; }
enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h"
"vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } }
enabled libwavpack && require libwavpack wavpack/wavpack.h
WavpackOpenFileOutput -lwavpack
+enabled libwebp && require_pkg_config libwebp webp/encode.h
WebPGetEncoderVersion
enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264
&&
{ check_cpp_condition x264.h "X264_BUILD >= 118"
||
die "ERROR: libx264 version must be >=
0.118."; }
diff --git a/doc/general.texi b/doc/general.texi
index c1809e2..a1996d0 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -415,8 +415,8 @@ following image formats are supported:
@tab YUV, JPEG and some extension is not supported yet.
@item Truevision Targa @tab X @tab X
@tab Targa (.TGA) image format
-@item WebP @tab @tab X
- @tab WebP image format
+@item WebP @tab E @tab X
+ @tab WebP image format, encoding supported through external library libwebp
@item XBM @tab X @tab
@tab X BitMap image format
@item XWD @tab X @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 1674d47..6413e24 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -614,6 +614,7 @@ OBJS-$(CONFIG_LIBVPX_VP8_ENCODER) += libvpxenc.o
OBJS-$(CONFIG_LIBVPX_VP9_DECODER) += libvpxdec.o
OBJS-$(CONFIG_LIBVPX_VP9_ENCODER) += libvpxenc.o
OBJS-$(CONFIG_LIBWAVPACK_ENCODER) += libwavpackenc.o
+OBJS-$(CONFIG_LIBWEBP_ENCODER) += libwebpenc.o
OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o
OBJS-$(CONFIG_LIBXAVS_ENCODER) += libxavs.o
OBJS-$(CONFIG_LIBXVID_ENCODER) += libxvid.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 6453e30..89dc34a 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -437,6 +437,7 @@ void avcodec_register_all(void)
REGISTER_ENCDEC (LIBVPX_VP8, libvpx_vp8);
REGISTER_ENCDEC (LIBVPX_VP9, libvpx_vp9);
REGISTER_ENCODER(LIBWAVPACK, libwavpack);
+ REGISTER_ENCODER(LIBWEBP, libwebp);
REGISTER_ENCODER(LIBX264, libx264);
REGISTER_ENCODER(LIBXAVS, libxavs);
REGISTER_ENCODER(LIBXVID, libxvid);
diff --git a/libavcodec/libwebpenc.c b/libavcodec/libwebpenc.c
new file mode 100644
index 0000000..d762eb1
--- /dev/null
+++ b/libavcodec/libwebpenc.c
@@ -0,0 +1,203 @@
+/*
+ * WebP encoding support via libwebp
+ * Copyright (c) 2013 Justin Ruggles <[email protected]>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * WebP encoder using libwebp
+ */
+
+#include <webp/encode.h>
+
+#include "libavutil/common.h"
+#include "libavutil/opt.h"
+#include "avcodec.h"
+#include "internal.h"
+
+typedef struct {
+ AVClass *avclass; // class for AVOptions
+ int lossless; // use lossless encoding
+ float quality; // lossy quality 0 - 100
+ int method; // algorithmic complexity 0=fast to 6=slow
+ int preset; // configuration preset
+ WebPConfig config; // libwebp configuration
+} LibWebPContext;
+
+static av_cold int libwebp_encode_init(AVCodecContext *avctx)
+{
+ LibWebPContext *s = avctx->priv_data;
+ int ret;
+
+ if (s->preset >= WEBP_PRESET_DEFAULT) {
+ ret = WebPConfigPreset(&s->config, s->preset, s->quality);
+ if (!ret)
+ return AVERROR_UNKNOWN;