On 11/21/2013 10:34 PM, Luca Barbato wrote:
On 22/11/13 03:12, Justin Ruggles wrote:
---
  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;
ENOSYS

Why ENOSYS?


+        s->lossless = s->config.lossless;
+        s->quality  = s->config.quality;
+        s->method   = s->config.method;
+    } else {
+        ret = WebPConfigInit(&s->config);
+        if (!ret)
+            return AVERROR_UNKNOWN;
ENOMEM

+    ret = WebPPictureInit(&pic);
+    if (!ret)
+        return AVERROR_UNKNOWN;
ENOMEM

Those functions don't allocate any memory.


-Justin

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to