gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libextractor] branch master updated: remove ffmpeg support, fixes #5659


From: gnunet
Subject: [libextractor] branch master updated: remove ffmpeg support, fixes #5659, #6777 and #6734
Date: Tue, 20 Apr 2021 18:36:54 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository libextractor.

The following commit(s) were added to refs/heads/master by this push:
     new 2332716  remove ffmpeg support, fixes #5659, #6777 and #6734
2332716 is described below

commit 2332716ae48d6b899e4d2bb07f468e8c076d2608
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Tue Apr 20 18:34:51 2021 +0200

    remove ffmpeg support, fixes #5659, #6777 and #6734
---
 ChangeLog                               |    3 +
 configure.ac                            |   29 -
 src/plugins/Makefile.am                 |   37 -
 src/plugins/previewopus_extractor.c     | 1247 -------------------------------
 src/plugins/test_previewopus.c          |   52 --
 src/plugins/test_thumbnailffmpeg.c      |   51 --
 src/plugins/thumbnailffmpeg_extractor.c |  890 ----------------------
 7 files changed, 3 insertions(+), 2306 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a1ba981..c16dbf3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+Tue 20 Apr 2021 06:33:46 PM CEST
+    Removing plugins depending on buggy, unstable libffmpeg library. -CG
+
 Sat 30 Jan 2021 03:25:35 PM CET
        Fix #6709: mask SIGPIPE to avoid test case failure
        with latest librpm.  Remove plibc.h logic.
diff --git a/configure.ac b/configure.ac
index 8005a39..80ce414 100644
--- a/configure.ac
+++ b/configure.ac
@@ -648,32 +648,6 @@ CPPFLAGS="$CPPFLAGS_OLD"
 AC_CHECK_PROG([HAVE_ZZUF],[zzuf], 1, 0)
 AM_CONDITIONAL(HAVE_ZZUF, test 0 != $HAVE_ZZUF)
 
-AC_MSG_CHECKING([whether to enable the FFmpeg thumbnail extractor])
-new_ffmpeg=0
-AC_ARG_ENABLE(ffmpeg,
- [AC_HELP_STRING([--enable-ffmpeg],[Enable FFmpeg support])
-  AC_HELP_STRING([--disable-ffmpeg],[Disable FFmpeg support])],
- [AS_CASE(["$enableval"],
-   [no],[
-      AC_MSG_RESULT(no)
-      ffmpeg_enabled=0
-   ],[
-      AC_MSG_RESULT(yes)
-      ffmpeg_enabled=1
-   ])],
-  [     AC_MSG_RESULT(yes)
-        ffmpeg_enabled=1])
-AS_IF([test x$ffmpeg_enabled = x1],
- [ffmpeg_enabled=0
-  new_ffmpeg=0
-  AC_CHECK_HEADERS([libavutil/avutil.h libavformat/avformat.h 
libavcodec/avcodec.h libavutil/frame.h],
-    AC_CHECK_HEADERS([libswresample/swresample.h],
-      AC_CHECK_LIB(avutil, av_audio_fifo_alloc,
-        ffmpeg_enabled=1)))
- ])
-AM_CONDITIONAL(HAVE_FFMPEG, test x$ffmpeg_enabled != x0)
-
-
 LE_INTLINCL=""
 LE_LIBINTL="$LTLIBINTL"
 AC_ARG_ENABLE(framework, [  --enable-framework      enable Mac OS X framework 
build helpers],enable_framework_build=$enableval)
@@ -769,9 +743,6 @@ AS_IF([test "x$HAVE_GIF_TRUE" = "x#"],
 AS_IF([test "x$have_gsf" != "xtrue"],
   [AC_MSG_NOTICE([NOTICE: libgsf not found, no OLE2 (MS Office) support])])
 
-AS_IF([test "x$ffmpeg_enabled" = "x0"],
-  [AC_MSG_NOTICE([NOTICE: FFmpeg/opus audito thumbnailer plugin disabled])])
-
 AS_IF([test "x$have_gdk_pixbuf" = "x0"],
   [AC_MSG_NOTICE([NOTICE: libgdk-pixbuf not found, gtk thumbnail support 
disabled])])
 
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
index 37e31e5..a0e0ae3 100644
--- a/src/plugins/Makefile.am
+++ b/src/plugins/Makefile.am
@@ -68,14 +68,6 @@ if HAVE_MAGIC
 PLUGIN_MIME=libextractor_mime.la
 TEST_MIME=test_mime
 
-if HAVE_FFMPEG
-PLUGIN_FFMPEG=libextractor_thumbnailffmpeg.la
-TEST_FFMPEG=test_thumbnailffmpeg
-
-#PLUGIN_PREVIEWOPUS=libextractor_previewopus.la
-#TEST_PREVIEWOPUS=test_previewopus
-endif
-
 if HAVE_GDK_PIXBUF
 # Gtk-thumbnailer requires MAGIC and GDK_PIXBUF
 PLUGIN_GTK=libextractor_thumbnailgtk.la
@@ -185,7 +177,6 @@ plugin_LTLIBRARIES = \
   libextractor_xm.la \
   $(PLUGIN_ARCHIVE) \
   $(PLUGIN_EXIV2) \
-  $(PLUGIN_FFMPEG) \
   $(PLUGIN_FLAC) \
   $(PLUGIN_GIF) \
   $(PLUGIN_GSF) \
@@ -199,7 +190,6 @@ plugin_LTLIBRARIES = \
   $(PLUGIN_MPEG) \
   $(PLUGIN_OGG) \
   $(PLUGIN_PDF) \
-  $(PLUGIN_PREVIEWOPUS) \
   $(PLUGIN_RPM) \
   $(PLUGIN_TIFF) \
   $(PLUGIN_ZLIB)
@@ -225,8 +215,6 @@ check_PROGRAMS = \
   test_zip \
   $(TEST_ARCHIVE) \
   $(TEST_EXIV2) \
-  $(TEST_FFMPEG) \
-  $(TEST_PREVIEWOPUS) \
   $(TEST_FLAC) \
   $(TEST_GIF) \
   $(TEST_GSF) \
@@ -612,19 +600,6 @@ test_sid_LDADD = \
   $(top_builddir)/src/plugins/libtest.la
 
 
-libextractor_thumbnailffmpeg_la_SOURCES = \
-  thumbnailffmpeg_extractor.c
-libextractor_thumbnailffmpeg_la_LDFLAGS = \
-  $(PLUGINFLAGS)
-libextractor_thumbnailffmpeg_la_LIBADD = \
-  -lavutil -lavformat -lavcodec -lswscale -lmagic $(XLIB)
-
-test_thumbnailffmpeg_SOURCES = \
-  test_thumbnailffmpeg.c
-test_thumbnailffmpeg_LDADD = \
-  $(top_builddir)/src/plugins/libtest.la
-
-
 libextractor_thumbnailgtk_la_SOURCES = \
   thumbnailgtk_extractor.c
 libextractor_thumbnailgtk_la_LDFLAGS = \
@@ -639,18 +614,6 @@ test_thumbnailgtk_SOURCES = \
 test_thumbnailgtk_LDADD = \
   $(top_builddir)/src/plugins/libtest.la
 
-libextractor_previewopus_la_SOURCES = \
-  previewopus_extractor.c
-libextractor_previewopus_la_LDFLAGS = \
-  $(PLUGINFLAGS)
-libextractor_previewopus_la_LIBADD = \
-  -lavutil -lavformat -lavcodec -lswscale -lavresample  -lmagic $(XLIB)
-
-test_previewopus_SOURCES = \
-  test_previewopus.c
-test_previewopus_LDADD = \
-  $(top_builddir)/src/plugins/libtest.la
-
 
 libextractor_tiff_la_SOURCES = \
   tiff_extractor.c
diff --git a/src/plugins/previewopus_extractor.c 
b/src/plugins/previewopus_extractor.c
deleted file mode 100644
index f137f38..0000000
--- a/src/plugins/previewopus_extractor.c
+++ /dev/null
@@ -1,1247 +0,0 @@
-/*
-     This file is part of libextractor.
-     Copyright Copyright (C) 2008, 2013 Bruno Cabral and Christian Grothoff
-
-     libextractor is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
-
-     libextractor 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
-     General Public License for more details.
-
-     You should have received a copy of the GNU General Public License
-     along with libextractor; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-     Boston, MA 02110-1301, USA.
- */
-/**
- * @file previewopus_extractor.c
- * @author Bruno Cabral
- * @author Christian Grothoff
- * @brief this extractor produces a binary encoded
- * audio snippet of music/video files using ffmpeg libs.
- *
- * Based on ffmpeg samples.
- *
- * Note that ffmpeg has a few issues:
- * (1) there are no recent official releases of the ffmpeg libs
- * (2) ffmpeg has a history of having security issues (parser is not robust)
- *
- *  So this plugin cannot be recommended for system with high security
- *requirements.
- */
-#include "platform.h"
-#include "extractor.h"
-#include <magic.h>
-
-#include <libavutil/avutil.h>
-#include <libavutil/audio_fifo.h>
-#include <libavutil/opt.h>
-#include <libavutil/mathematics.h>
-#include <libavformat/avformat.h>
-#include <libavcodec/avcodec.h>
-#include <libswscale/swscale.h>
-#include <libswresample/swresample.h>
-
-
-/**
- * Set to 1 to enable debug output.
- */
-#define DEBUG 0
-
-/**
- * Set to 1 to enable a output file for testing.
- */
-#define OUTPUT_FILE 0
-
-
-/**
- * Maximum size in bytes for the preview.
- */
-#define MAX_SIZE (28 * 1024)
-
-/**
- * HardLimit for file
- */
-#define HARD_LIMIT_SIZE (50 * 1024)
-
-
-/** The output bit rate in kbit/s */
-#define OUTPUT_BIT_RATE 28000
-/** The number of output channels */
-#define OUTPUT_CHANNELS 2
-/** The audio sample output format */
-#define OUTPUT_SAMPLE_FORMAT AV_SAMPLE_FMT_S16
-
-
-/** Our output buffer*/
-static unsigned char *buffer;
-
-/** Actual output buffer size */
-static int totalSize;
-
-/**
- * Convert an error code into a text message.
- * @param error Error code to be converted
- * @return Corresponding error text (not thread-safe)
- */
-static char *const
-get_error_text (const int error)
-{
-  static char error_buffer[255];
-  av_strerror (error, error_buffer, sizeof(error_buffer));
-  return error_buffer;
-}
-
-
-/**
- * Read callback.
- *
- * @param opaque the 'struct EXTRACTOR_ExtractContext'
- * @param buf where to write data
- * @param buf_size how many bytes to read
- * @return -1 on error (or for unknown file size)
- */
-static int
-read_cb (void *opaque,
-         uint8_t *buf,
-         int buf_size)
-{
-  struct EXTRACTOR_ExtractContext *ec = opaque;
-  void *data;
-  ssize_t ret;
-
-  ret = ec->read (ec->cls, &data, buf_size);
-  if (ret <= 0)
-    return ret;
-  memcpy (buf, data, ret);
-  return ret;
-}
-
-
-/**
- * Seek callback.
- *
- * @param opaque the 'struct EXTRACTOR_ExtractContext'
- * @param offset where to seek
- * @param whence how to seek; AVSEEK_SIZE to return file size without seeking
- * @return -1 on error (or for unknown file size)
- */
-static int64_t
-seek_cb (void *opaque,
-         int64_t offset,
-         int whence)
-{
-  struct EXTRACTOR_ExtractContext *ec = opaque;
-
-  if (AVSEEK_SIZE == whence)
-    return ec->get_size (ec->cls);
-  return ec->seek (ec->cls, offset, whence);
-}
-
-
-/**
- * write callback.
- *
- * @param opaque NULL
- * @param pBuffer to write
- * @param pBufferSize , amount to write
- * @return 0 on error
- */
-static int
-writePacket (void *opaque,
-             unsigned char *pBuffer,
-             int pBufferSize)
-{
-  int sizeToCopy = pBufferSize;
-
-  if ( (totalSize + pBufferSize) > HARD_LIMIT_SIZE)
-    sizeToCopy = HARD_LIMIT_SIZE - totalSize;
-
-  memcpy (buffer + totalSize, pBuffer, sizeToCopy);
-  totalSize += sizeToCopy;
-  return sizeToCopy;
-}
-
-
-/**
- * Open an output file and the required encoder.
- * Also set some basic encoder parameters.
- * Some of these parameters are based on the input file's parameters.
- */
-static int
-open_output_file (
-  AVCodecContext *input_codec_context,
-  AVFormatContext **output_format_context,
-  AVCodecContext **output_codec_context)
-{
-  AVStream *stream               = NULL;
-  AVCodec *output_codec          = NULL;
-  AVIOContext *io_ctx;
-  int error;
-  unsigned char *iob;
-
-  if (NULL == (iob = av_malloc (16 * 1024)))
-    return AVERROR_EXIT;
-  if (NULL == (io_ctx = avio_alloc_context (iob, 16 * 1024,
-                                            AVIO_FLAG_WRITE, NULL,
-                                            NULL,
-                                            &writePacket /* no writing */,
-                                            NULL)))
-  {
-    av_free (iob);
-    return AVERROR_EXIT;
-  }
-  if (NULL == ((*output_format_context) = avformat_alloc_context ()))
-  {
-    av_free (io_ctx);
-    return AVERROR_EXIT;
-  }
-  (*output_format_context)->pb = io_ctx;
-
-  /** Guess the desired container format based on the file extension. */
-  if (! ((*output_format_context)->oformat = av_guess_format (NULL,
-                                                              "file.ogg",
-                                                              NULL)))
-  {
-#if DEBUG
-    fprintf (stderr, "Could not find output file format\n");
-#endif
-    error = AVERROR (ENOSYS);
-    goto cleanup;
-  }
-
-  /** Find the encoder to be used by its name. */
-  if (! (output_codec = avcodec_find_encoder (AV_CODEC_ID_OPUS)))
-  {
-#if DEBUG
-    fprintf (stderr, "Could not find an OPUS encoder.\n");
-#endif
-    error = AVERROR (ENOSYS);
-    goto cleanup;
-  }
-
-  /** Create a new audio stream in the output file container. */
-  if (! (stream = avformat_new_stream (*output_format_context, output_codec)))
-  {
-#if DEBUG
-    fprintf (stderr, "Could not create new stream\n");
-#endif
-    error = AVERROR (ENOMEM);
-    goto cleanup;
-  }
-
-  /** Save the encoder context for easiert access later. */
-  *output_codec_context = stream->codec;
-
-  /**
-   * Set the basic encoder parameters.
-   * The input file's sample rate is used to avoid a sample rate conversion.
-   */
-  (*output_codec_context)->channels       = OUTPUT_CHANNELS;
-  (*output_codec_context)->channel_layout = av_get_default_channel_layout (
-    OUTPUT_CHANNELS);
-  (*output_codec_context)->sample_rate    = 48000; // Opus need 48000
-  (*output_codec_context)->sample_fmt     = AV_SAMPLE_FMT_S16;
-  (*output_codec_context)->bit_rate       = OUTPUT_BIT_RATE;
-
-  /** Open the encoder for the audio stream to use it later. */
-  if ((error = avcodec_open2 (*output_codec_context, output_codec, NULL)) < 0)
-  {
-#if DEBUG
-    fprintf (stderr, "Could not open output codec (error '%s')\n",
-             get_error_text (error));
-#endif
-    goto cleanup;
-  }
-  return 0;
-
-cleanup:
-  av_free (io_ctx);
-  return error < 0 ? error : AVERROR_EXIT;
-}
-
-
-/** Initialize one data packet for reading or writing. */
-static void
-init_packet (AVPacket *packet)
-{
-  av_init_packet (packet);
-  /** Set the packet data and size so that it is recognized as being empty. */
-  packet->data = NULL;
-  packet->size = 0;
-}
-
-
-/** Initialize one audio frame for reading from the input file */
-static int
-init_input_frame (AVFrame **frame)
-{
-  *frame = av_frame_alloc ();
-  if (NULL == *frame)
-  {
-#if DEBUG
-    fprintf (stderr, "Could not allocate input frame\n");
-#endif
-    return AVERROR (ENOMEM);
-  }
-  return 0;
-}
-
-
-/**
- * Initialize the audio resampler based on the input and output codec settings.
- * If the input and output sample formats differ, a conversion is required
- * libavresample takes care of this, but requires initialization.
- */
-static int
-init_resampler (AVCodecContext *input_codec_context,
-                AVCodecContext *output_codec_context,
-                SwrContext  **resample_context)
-{
-  /**
-   * Only initialize the resampler if it is necessary, i.e.,
-   * if and only if the sample formats differ.
-   */
-  if ((input_codec_context->sample_fmt != output_codec_context->sample_fmt) ||
-      (input_codec_context->channels != output_codec_context->channels) )
-  {
-    int error;
-
-    /** Create a resampler context for the conversion. */
-    if (! (*resample_context = swr_alloc ()))
-    {
-#if DEBUG
-      fprintf (stderr, "Could not allocate resample context\n");
-#endif
-      return AVERROR (ENOMEM);
-    }
-
-
-    /**
-     * Set the conversion parameters.
-     * Default channel layouts based on the number of channels
-     * are assumed for simplicity (they are sometimes not detected
-     * properly by the demuxer and/or decoder).
-     */
-    av_opt_set_int (*resample_context,
-                    "in_channel_layout",
-                    av_get_default_channel_layout (
-                      input_codec_context->channels), 0);
-    av_opt_set_int (*resample_context,
-                    "out_channel_layout",
-                    av_get_default_channel_layout (
-                      output_codec_context->channels), 0);
-    av_opt_set_int (*resample_context,
-                    "in_sample_rate",
-                    input_codec_context->sample_rate, 0);
-    av_opt_set_int (*resample_context,
-                    "out_sample_rate",
-                    output_codec_context->sample_rate, 0);
-    av_opt_set_int (*resample_context,
-                    "in_sample_fmt",
-                    input_codec_context->sample_fmt, 0);
-    av_opt_set_int (*resample_context,
-                    "out_sample_fmt",
-                    output_codec_context->sample_fmt, 0);
-
-    /** Open the resampler with the specified parameters. */
-    if ((error = swr_init (*resample_context)) < 0)
-    {
-#if DEBUG
-      fprintf (stderr, "Could not open resample context\n");
-#endif
-      swr_free (resample_context);
-      return error;
-    }
-  }
-  return 0;
-}
-
-
-/** Initialize a FIFO buffer for the audio samples to be encoded. */
-static int
-init_fifo (AVAudioFifo **fifo)
-{
-  /** Create the FIFO buffer based on the specified output sample format. */
-  if (! (*fifo = av_audio_fifo_alloc (OUTPUT_SAMPLE_FORMAT, OUTPUT_CHANNELS,
-                                      1)))
-  {
-#if DEBUG
-    fprintf (stderr, "Could not allocate FIFO\n");
-#endif
-    return AVERROR (ENOMEM);
-  }
-  return 0;
-}
-
-
-/** Write the header of the output file container. */
-static int
-write_output_file_header (AVFormatContext *output_format_context)
-{
-  int error;
-  if ((error = avformat_write_header (output_format_context, NULL)) < 0)
-  {
-#if DEBUG
-    fprintf (stderr, "Could not write output file header (error '%s')\n",
-             get_error_text (error));
-#endif
-    return error;
-  }
-  return 0;
-}
-
-
-/** Decode one audio frame from the input file. */
-static int
-decode_audio_frame (AVFrame *frame,
-                    AVFormatContext *input_format_context,
-                    AVCodecContext *input_codec_context, int 
audio_stream_index,
-                    int *data_present, int *finished)
-{
-  /** Packet used for temporary storage. */
-  AVPacket input_packet;
-  int error;
-  init_packet (&input_packet);
-
-  /** Read one audio frame from the input file into a temporary packet. */
-  while (1)
-  {
-    if ((error = av_read_frame (input_format_context, &input_packet)) < 0)
-    {
-      /** If we are the the end of the file, flush the decoder below. */
-      if (error == AVERROR_EOF)
-      {
-#if DEBUG
-        fprintf (stderr, "EOF in decode_audio\n");
-#endif
-        *finished = 1;
-      }
-      else
-      {
-#if DEBUG
-        fprintf (stderr, "Could not read frame (error '%s')\n",
-                 get_error_text (error));
-#endif
-        return error;
-      }
-    }
-
-    if (input_packet.stream_index == audio_stream_index)
-      break;
-  }
-
-  /**
-   * Decode the audio frame stored in the temporary packet.
-   * The input audio stream decoder is used to do this.
-   * If we are at the end of the file, pass an empty packet to the decoder
-   * to flush it.
-   */if ((error = avcodec_decode_audio4 (input_codec_context, frame,
-                                      data_present, &input_packet)) < 0)
-  {
-#if DEBUG
-    fprintf (stderr, "Could not decode frame (error '%s')\n",
-             get_error_text (error));
-#endif
-    av_packet_unref (&input_packet);
-    return error;
-  }
-
-  /**
-   * If the decoder has not been flushed completely, we are not finished,
-   * so that this function has to be called again.
-   */
-  if (*finished && *data_present)
-    *finished = 0;
-  av_packet_unref (&input_packet);
-  return 0;
-}
-
-
-/**
- * Initialize a temporary storage for the specified number of audio samples.
- * The conversion requires temporary storage due to the different format.
- * The number of audio samples to be allocated is specified in frame_size.
- */
-static int
-init_converted_samples (uint8_t ***converted_input_samples,
-                        int*out_linesize,
-                        AVCodecContext *output_codec_context,
-                        int frame_size)
-{
-  int error;
-
-  /**
-   * Allocate as many pointers as there are audio channels.
-   * Each pointer will later point to the audio samples of the corresponding
-   * channels (although it may be NULL for interleaved formats).
-   */if (! (*converted_input_samples = calloc (output_codec_context->channels,
-                                            
sizeof(**converted_input_samples))))
-  {
-#if DEBUG
-    fprintf (stderr, "Could not allocate converted input sample pointers\n");
-#endif
-    return AVERROR (ENOMEM);
-  }
-
-  /**
-   * Allocate memory for the samples of all channels in one consecutive
-   * block for convenience.
-   */
-  if ((error = av_samples_alloc (*converted_input_samples,
-                                 out_linesize,
-                                 output_codec_context->channels,
-                                 frame_size,
-                                 output_codec_context->sample_fmt, 0)) < 0)
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Could not allocate converted input samples (error '%s')\n",
-             get_error_text (error));
-#endif
-    av_freep (&(*converted_input_samples)[0]);
-    free (*converted_input_samples);
-    return error;
-  }
-  return 0;
-}
-
-
-/**
- * Convert the input audio samples into the output sample format.
- * The conversion happens on a per-frame basis, the size of which is specified
- * by frame_size.
- */
-static int
-convert_samples (uint8_t **input_data,
-                 uint8_t **converted_data,
-                 int in_sample,
-                 int out_sample,
-                 int out_linesize,
-                 SwrContext  *resample_context)
-{
-  int error;
-
-  /** Convert the samples using the resampler. */
-  if ((error = swr_convert (resample_context,
-                            converted_data,
-                            out_linesize,
-                            out_sample,
-                            input_data,
-                            0,
-                            in_sample)) < 0)
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Could not convert input samples (error '%s')\n",
-             get_error_text (error));
-#endif
-    return error;
-  }
-
-
-  /**
-   * Perform a sanity check so that the number of converted samples is
-   * not greater than the number of samples to be converted.
-   * If the sample rates differ, this case has to be handled differently
-   */
-  if (avresample_available (resample_context))
-  {
-#if DEBUG
-    fprintf (stderr,
-             "%i Converted samples left over\n",
-             avresample_available (resample_context));
-#endif
-  }
-
-
-  return 0;
-}
-
-
-/** Add converted input audio samples to the FIFO buffer for later processing. 
*/
-static int
-add_samples_to_fifo (AVAudioFifo *fifo,
-                     uint8_t **converted_input_samples,
-                     const int frame_size)
-{
-  int error;
-
-  /**
-   * Make the FIFO as large as it needs to be to hold both,
-   * the old and the new samples.
-   */
-  if ((error = av_audio_fifo_realloc (fifo, av_audio_fifo_size (fifo)
-                                      + frame_size)) < 0)
-  {
-#if DEBUG
-    fprintf (stderr, "Could not reallocate FIFO\n");
-#endif
-    return error;
-  }
-
-  /** Store the new samples in the FIFO buffer. */
-  if (av_audio_fifo_write (fifo, (void **) converted_input_samples,
-                           frame_size) < frame_size)
-  {
-#if DEBUG
-    fprintf (stderr, "Could not write data to FIFO\n");
-#endif
-    return AVERROR_EXIT;
-  }
-  return 0;
-}
-
-
-/**
- * Read one audio frame from the input file, decodes, converts and stores
- * it in the FIFO buffer.
- */
-static int
-read_decode_convert_and_store (AVAudioFifo *fifo,
-                               AVFormatContext *input_format_context,
-                               AVCodecContext *input_codec_context,
-                               AVCodecContext *output_codec_context,
-                               SwrContext  *resampler_context, int
-                               audio_stream_index,
-                               int *finished)
-{
-  /** Temporary storage of the input samples of the frame read from the file. 
*/
-  AVFrame *input_frame = NULL;
-  /** Temporary storage for the converted input samples. */
-  uint8_t **converted_input_samples = NULL;
-  int data_present;
-  int ret = AVERROR_EXIT;
-
-  /** Initialize temporary storage for one input frame. */
-  if (init_input_frame (&input_frame))
-  {
-#if DEBUG
-    fprintf (stderr, "Failed at init frame\n");
-#endif
-    goto cleanup;
-
-  }
-  /** Decode one frame worth of audio samples. */
-  if (decode_audio_frame (input_frame,
-                          input_format_context,
-                          input_codec_context,
-                          audio_stream_index,
-                          &data_present,
-                          finished))
-  {
-#if DEBUG
-    fprintf (stderr, "Failed at decode audio\n");
-#endif
-
-    goto cleanup;
-  }
-  /**
-   * If we are at the end of the file and there are no more samples
-   * in the decoder which are delayed, we are actually finished.
-   * This must not be treated as an error.
-   */
-  if (*finished && ! data_present)
-  {
-    ret = 0;
-#if DEBUG
-    fprintf (stderr, "Failed at finished or no data\n");
-#endif
-    goto cleanup;
-  }
-  /** If there is decoded data, convert and store it */
-  if (data_present)
-  {
-    int out_linesize;
-    // FIXME: I'm losing samples, but can't get it to work.
-    int out_samples = avresample_available (resampler_context)
-                      + avresample_get_delay (resampler_context)
-                      + input_frame->nb_samples;
-
-
-    // fprintf(stderr, "Input nbsamples %i out_samples: %i 
\n",input_frame->nb_samples,out_samples);
-
-    /** Initialize the temporary storage for the converted input samples. */
-    if (init_converted_samples (&converted_input_samples,
-                                &out_linesize,
-                                output_codec_context,
-                                out_samples))
-    {
-#if DEBUG
-      fprintf (stderr, "Failed at init_converted_samples\n");
-#endif
-      goto cleanup;
-    }
-
-    /**
-     * Convert the input samples to the desired output sample format.
-     * This requires a temporary storage provided by converted_input_samples.
-     */
-    if (convert_samples (input_frame->extended_data,
-                         converted_input_samples,
-                         input_frame->nb_samples,
-                         out_samples,
-                         out_linesize,
-                         resampler_context))
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed at convert_samples, input frame %i \n",
-               input_frame->nb_samples);
-#endif
-      goto cleanup;
-    }
-    /** Add the converted input samples to the FIFO buffer for later 
processing. */
-    if (add_samples_to_fifo (fifo,
-                             converted_input_samples,
-                             out_samples))
-    {
-#if DEBUG
-      fprintf (stderr, "Failed at add_samples_to_fifo\n");
-#endif
-      goto cleanup;
-    }
-    ret = 0;
-  }
-  ret = 0;
-
-cleanup:
-  if (converted_input_samples)
-  {
-    av_freep (&converted_input_samples[0]);
-    free (converted_input_samples);
-  }
-  av_frame_free (&input_frame);
-  return ret;
-}
-
-
-/**
- * Initialize one input frame for writing to the output file.
- * The frame will be exactly frame_size samples large.
- */
-static int
-init_output_frame (AVFrame **frame,
-                   AVCodecContext *output_codec_context,
-                   int frame_size)
-{
-  int error;
-
-  /** Create a new frame to store the audio samples. */
-  *frame = av_frame_alloc ();
-  if (NULL == *frame)
-  {
-#if DEBUG
-    fprintf (stderr, "Could not allocate output frame\n");
-#endif
-    return AVERROR_EXIT;
-  }
-
-  /**
-   * Set the frame's parameters, especially its size and format.
-   * av_frame_get_buffer needs this to allocate memory for the
-   * audio samples of the frame.
-   * Default channel layouts based on the number of channels
-   * are assumed for simplicity.
-   */(*frame)->nb_samples  = frame_size;
-  (*frame)->channel_layout = output_codec_context->channel_layout;
-  (*frame)->format         = output_codec_context->sample_fmt;
-  (*frame)->sample_rate    = output_codec_context->sample_rate;
-
-
-  // fprintf(stderr, "%i %i  \n",frame_size , 
(*frame)->format,(*frame)->sample_rate);
-
-  /**
-   * Allocate the samples of the created frame. This call will make
-   * sure that the audio frame can hold as many samples as specified.
-   */
-  if ((error = av_frame_get_buffer (*frame, 0)) < 0)
-  {
-#if DEBUG
-    fprintf (stderr, "Could allocate output frame samples (error '%s')\n",
-             get_error_text (error));
-#endif
-    av_frame_free (frame);
-    return error;
-  }
-
-  return 0;
-}
-
-
-/** Encode one frame worth of audio to the output file. */
-static int
-encode_audio_frame (AVFrame *frame,
-                    AVFormatContext *output_format_context,
-                    AVCodecContext *output_codec_context,
-                    int *data_present)
-{
-  /** Packet used for temporary storage. */
-  AVPacket output_packet;
-  int error;
-  init_packet (&output_packet);
-
-  /**
-   * Encode the audio frame and store it in the temporary packet.
-   * The output audio stream encoder is used to do this.
-   */
-  if ((error = avcodec_encode_audio2 (output_codec_context, &output_packet,
-                                      frame, data_present)) < 0)
-  {
-#if DEBUG
-    fprintf (stderr, "Could not encode frame (error '%s')\n",
-             get_error_text (error));
-#endif
-    av_packet_unref (&output_packet);
-    return error;
-  }
-
-  /** Write one audio frame from the temporary packet to the output file. */
-  if (*data_present)
-  {
-    if ((error = av_write_frame (output_format_context, &output_packet)) < 0)
-    {
-#if DEBUG
-      fprintf (stderr, "Could not write frame (error '%s')\n",
-               get_error_text (error));
-#endif
-
-      av_packet_unref (&output_packet);
-      return error;
-    }
-
-    av_packet_unref (&output_packet);
-  }
-
-  return 0;
-}
-
-
-/**
- * Load one audio frame from the FIFO buffer, encode and write it to the
- * output file.
- */
-static int
-load_encode_and_write (AVAudioFifo *fifo,
-                       AVFormatContext *output_format_context,
-                       AVCodecContext *output_codec_context)
-{
-  /** Temporary storage of the output samples of the frame written to the 
file. */
-  AVFrame *output_frame;
-  /**
-   * Use the maximum number of possible samples per frame.
-   * If there is less than the maximum possible frame size in the FIFO
-   * buffer use this number. Otherwise, use the maximum possible frame size
-   */const int frame_size = FFMIN (av_audio_fifo_size (fifo),
-                                output_codec_context->frame_size);
-  int data_written;
-
-  /** Initialize temporary storage for one output frame. */
-  if (init_output_frame (&output_frame, output_codec_context, frame_size))
-    return AVERROR_EXIT;
-
-  /**
-   * Read as many samples from the FIFO buffer as required to fill the frame.
-   * The samples are stored in the frame temporarily.
-   */
-  if (av_audio_fifo_read (fifo, (void **) output_frame->data, frame_size) <
-      frame_size)
-  {
-#if DEBUG
-    fprintf (stderr, "Could not read data from FIFO\n");
-#endif
-    av_frame_free (&output_frame);
-    return AVERROR_EXIT;
-  }
-
-  /** Encode one frame worth of audio samples. */
-  if (encode_audio_frame (output_frame, output_format_context,
-                          output_codec_context, &data_written))
-  {
-    av_frame_free (&output_frame);
-    return AVERROR_EXIT;
-  }
-  av_frame_free (&output_frame);
-  return 0;
-}
-
-
-/** Write the trailer of the output file container. */
-static int
-write_output_file_trailer (AVFormatContext *output_format_context)
-{
-  int error;
-  if ((error = av_write_trailer (output_format_context)) < 0)
-  {
-#if DEBUG
-    fprintf (stderr, "Could not write output file trailer (error '%s')\n",
-             get_error_text (error));
-#endif
-    return error;
-  }
-  return 0;
-}
-
-
-#define ENUM_CODEC_ID enum AVCodecID
-
-
-/**
- * Perform the audio snippet extraction
- *
- * @param ec extraction context to use
- */
-static void
-extract_audio (struct EXTRACTOR_ExtractContext *ec)
-{
-  AVIOContext *io_ctx;
-  struct AVFormatContext *format_ctx;
-  AVCodecContext *codec_ctx;
-  AVFormatContext *output_format_context = NULL;
-  AVCodec *codec;
-  AVDictionary *options;
-  AVFrame *frame;
-  AVCodecContext*output_codec_context = NULL;
-  SwrContext  *resample_context = NULL;
-  AVAudioFifo *fifo = NULL;
-
-  int audio_stream_index;
-  int i;
-  int err;
-  int duration;
-  unsigned char *iob;
-
-
-  totalSize = 0;
-  if (NULL == (iob = av_malloc (16 * 1024)))
-    return;
-  if (NULL == (io_ctx = avio_alloc_context (iob,
-                                            16 * 1024,
-                                            0, ec,
-                                            &read_cb,
-                                            NULL /* no writing */,
-                                            &seek_cb)))
-  {
-    av_free (iob);
-    return;
-  }
-  if (NULL == (format_ctx = avformat_alloc_context ()))
-  {
-    av_free (io_ctx);
-    return;
-  }
-  format_ctx->pb = io_ctx;
-  options = NULL;
-  if (0 != avformat_open_input (&format_ctx, "<no file>", NULL, &options))
-  {
-    av_free (io_ctx);
-    return;
-  }
-  av_dict_free (&options);
-  if (0 > avformat_find_stream_info (format_ctx, NULL))
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to read stream info\n");
-#endif
-    avformat_close_input (&format_ctx);
-    av_free (io_ctx);
-    return;
-  }
-  codec = NULL;
-  codec_ctx = NULL;
-  audio_stream_index = -1;
-  for (i = 0; i<format_ctx->nb_streams; i++)
-  {
-    codec_ctx = format_ctx->streams[i]->codec;
-    if (AVMEDIA_TYPE_AUDIO != codec_ctx->codec_type)
-      continue;
-    if (NULL == (codec = avcodec_find_decoder (codec_ctx->codec_id)))
-      continue;
-    options = NULL;
-    if (0 != (err = avcodec_open2 (codec_ctx, codec, &options)))
-    {
-      codec = NULL;
-      continue;
-    }
-    av_dict_free (&options);
-    audio_stream_index = i;
-    break;
-  }
-  if ( (-1 == audio_stream_index) ||
-       (0 == codec_ctx->channels) )
-  {
-#if DEBUG
-    fprintf (stderr,
-             "No audio streams or no suitable codec found\n");
-#endif
-    if (NULL != codec)
-      avcodec_close (codec_ctx);
-    avformat_close_input (&format_ctx);
-    av_free (io_ctx);
-    return;
-  }
-
-  frame = av_frame_alloc ();
-  if (NULL == frame)
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to allocate frame\n");
-#endif
-    avcodec_close (codec_ctx);
-    avformat_close_input (&format_ctx);
-    av_free (io_ctx);
-    return;
-  }
-
-
-  if (! (buffer = malloc (HARD_LIMIT_SIZE)))
-    goto cleanup;
-
-
-  /** Open the output file for writing. */
-  if (open_output_file (codec_ctx,
-                        &output_format_context,
-                        &output_codec_context))
-    goto cleanup;
-  /** Initialize the resampler to be able to convert audio sample formats. */
-  if (init_resampler (codec_ctx,
-                      output_codec_context,
-                      &resample_context))
-    goto cleanup;
-  /** Initialize the FIFO buffer to store audio samples to be encoded. */
-  if (init_fifo (&fifo))
-    goto cleanup;
-
-  /** Write the header of the output file container. */
-  if (write_output_file_header (output_format_context))
-    goto cleanup;
-
-
-  if (format_ctx->duration == AV_NOPTS_VALUE)
-  {
-    duration = -1;
-#if DEBUG
-    fprintf (stderr,
-             "Duration unknown\n");
-#endif
-  }
-  else
-  {
-    duration = format_ctx->duration;
-#if DEBUG
-    fprintf (stderr,
-             "Duration: %lld\n",
-             format_ctx->duration);
-#endif
-  }
-
-  /* if duration is known, seek to first tried,
-   * else use 10 sec into stream */
-
-  if (-1 != duration)
-    err = av_seek_frame (format_ctx, -1, (duration / 3), 0);
-  else
-    err = av_seek_frame (format_ctx, -1, 10 * AV_TIME_BASE, 0);
-
-
-  if (err >= 0)
-    avcodec_flush_buffers (codec_ctx);
-
-
-  /**
-   * Loop as long as we have input samples to read or output samples
-   * to write; abort as soon as we have neither.
-   */
-  while (1)
-  {
-    /** Use the encoder's desired frame size for processing. */
-    const int output_frame_size = output_codec_context->frame_size;
-    int finished                = 0;
-
-    /**
-     * Make sure that there is one frame worth of samples in the FIFO
-     * buffer so that the encoder can do its work.
-     * Since the decoder's and the encoder's frame size may differ, we
-     * need to FIFO buffer to store as many frames worth of input samples
-     * that they make up at least one frame worth of output samples.
-     */
-    while ((av_audio_fifo_size (fifo) < output_frame_size))
-    {
-      /**
-       * Decode one frame worth of audio samples, convert it to the
-       * output sample format and put it into the FIFO buffer.
-       */
-      if (read_decode_convert_and_store (fifo,
-                                         format_ctx,
-                                         codec_ctx,
-                                         output_codec_context,
-                                         resample_context,
-                                         audio_stream_index,
-                                         &finished))
-      {
-        goto cleanup;
-      }
-
-      /**
-       * If we are at the end of the input file, we continue
-       * encoding the remaining audio samples to the output file.
-       */
-      if (finished)
-        break;
-    }
-
-    /* Already over our limit*/
-    if (totalSize >= MAX_SIZE)
-      finished = 1;
-
-    /**
-     * If we have enough samples for the encoder, we encode them.
-     * At the end of the file, we pass the remaining samples to
-     * the encoder.
-     *///
-    while (av_audio_fifo_size (fifo) >= output_frame_size ||
-           (finished && av_audio_fifo_size (fifo) > 0))
-    {
-      /**
-       * Take one frame worth of audio samples from the FIFO buffer,
-       * encode it and write it to the output file.
-       */
-      if (load_encode_and_write (fifo,
-                                 output_format_context,
-                                 output_codec_context))
-        goto cleanup;
-    }
-    /**
-     * If we are at the end of the input file and have encoded
-     * all remaining samples, we can exit this loop and finish.
-     */
-    if (finished)
-    {
-      int data_written;
-      /** Flush the encoder as it may have delayed frames. */
-      do {
-        encode_audio_frame (NULL,
-                            output_format_context,
-                            output_codec_context,
-                            &data_written);
-      } while (data_written);
-      break;
-    }
-  }
-
-  /** Write the trailer of the output file container. */
-  if (write_output_file_trailer (output_format_context))
-    goto cleanup;
-  ec->proc (ec->cls,
-            "previewopus",
-            EXTRACTOR_METATYPE_AUDIO_PREVIEW,
-            EXTRACTOR_METAFORMAT_BINARY,
-            "audio/opus",
-            buffer,
-            totalSize);
-
-#if OUTPUT_FILE
-  {
-    FILE *f;
-
-    f = fopen ("example.opus", "wb");
-    if (! f)
-    {
-      fprintf (stderr, "Could not open %s\n", "file");
-      exit (1);
-    }
-    fwrite (buffer, 1, totalSize, f);
-    fclose (f);
-  }
-#endif
-
-cleanup:
-  av_free (frame);
-  free (buffer);
-
-  if (fifo)
-    av_audio_fifo_free (fifo);
-  if (resample_context)
-  {
-    swr_close (resample_context);
-    swr_free (&resample_context);
-  }
-  if (output_codec_context)
-    avcodec_close (output_codec_context);
-
-  avcodec_close (codec_ctx);
-  avformat_close_input (&format_ctx);
-  av_free (io_ctx);
-}
-
-
-/**
- * Main method for the opus-preview plugin.
- *
- * @param ec extraction context
- */
-void
-EXTRACTOR_previewopus_extract_method (struct EXTRACTOR_ExtractContext *ec)
-{
-  ssize_t iret;
-  void *data;
-
-  if (-1 == (iret = ec->read (ec->cls,
-                              &data,
-                              16 * 1024)))
-    return;
-
-  if (0 != ec->seek (ec->cls, 0, SEEK_SET))
-    return;
-
-  extract_audio (ec);
-}
-
-
-/**
- * Log callback.  Does nothing.
- *
- * @param ptr NULL
- * @param level log level
- * @param format format string
- * @param ap arguments for format
- */
-static void
-previewopus_av_log_callback (void*ptr,
-                             int level,
-                             const char *format,
-                             va_list ap)
-{
-#if DEBUG
-  vfprintf (stderr, format, ap);
-#endif
-}
-
-
-/**
- * Initialize av-libs
- */
-void __attribute__ ((constructor))
-previewopus_lib_init (void)
-{
-  av_log_set_callback (&previewopus_av_log_callback);
-}
-
-
-/**
- * Destructor for the library, cleans up.
- */
-void __attribute__ ((destructor))
-previewopus_ltdl_fini ()
-{
-
-}
-
-
-/* end of previewopus_extractor.c */
diff --git a/src/plugins/test_previewopus.c b/src/plugins/test_previewopus.c
deleted file mode 100644
index 6b0b1b8..0000000
--- a/src/plugins/test_previewopus.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
-     This file is part of libextractor.
-     Copyright (C) 2013 Vidyut Samanta and Christian Grothoff
-
-     libextractor is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
-
-     libextractor 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
-     General Public License for more details.
-
-     You should have received a copy of the GNU General Public License
-     along with libextractor; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-     Boston, MA 02110-1301, USA.
-*/
-/**
- * @file plugins/test_previewopus.c
- * @brief stub testcase for previewopus plugin
- * @author Bruno Cabral
- */
-#include "platform.h"
-#include "test_lib.h"
-
-
-/**
- * Main function for the previewopus testcase.
- *
- * @param argc number of arguments (ignored)
- * @param argv arguments (ignored)
- * @return 0 on success
- */
-int
-main (int argc, char *argv[])
-{
-  struct SolutionData previewopus_audio_sol[] = {
-    // TODO. Can't test as it depends on the encoder.
-    { 0, 0, NULL, NULL, 0, -1 }
-  };
-  struct ProblemSet ps[] = {
-    { "testdata/mpeg_alien.mpg",
-      previewopus_audio_sol },
-    { NULL, NULL }
-  };
-  return ET_main ("previewopus", ps);
-}
-
-
-/* end of test_thumbnailffmpeg.c */
diff --git a/src/plugins/test_thumbnailffmpeg.c 
b/src/plugins/test_thumbnailffmpeg.c
deleted file mode 100644
index 3efd69b..0000000
--- a/src/plugins/test_thumbnailffmpeg.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-     This file is part of libextractor.
-     Copyright (C) 2012 Vidyut Samanta and Christian Grothoff
-
-     libextractor is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
-
-     libextractor 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
-     General Public License for more details.
-
-     You should have received a copy of the GNU General Public License
-     along with libextractor; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-     Boston, MA 02110-1301, USA.
-*/
-/**
- * @file plugins/test_thumbnailffmpeg.c
- * @brief testcase for thumbnailffmpeg plugin
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "test_lib.h"
-
-
-/**
- * Main function for the THUMBNAILFFMPEG testcase.
- *
- * @param argc number of arguments (ignored)
- * @param argv arguments (ignored)
- * @return 0 on success
- */
-int
-main (int argc, char *argv[])
-{
-  struct SolutionData thumbnailffmpeg_video_sol[] = {
-    { 0, 0, NULL, NULL, 0, -1 }
-  };
-  struct ProblemSet ps[] = {
-    { "testdata/thumbnailffmpeg_video.mov",
-      thumbnailffmpeg_video_sol },
-    { NULL, NULL }
-  };
-  return ET_main ("thumbnailffmpeg", ps);
-}
-
-
-/* end of test_thumbnailffmpeg.c */
diff --git a/src/plugins/thumbnailffmpeg_extractor.c 
b/src/plugins/thumbnailffmpeg_extractor.c
deleted file mode 100644
index ef7a05f..0000000
--- a/src/plugins/thumbnailffmpeg_extractor.c
+++ /dev/null
@@ -1,890 +0,0 @@
-/*
-     This file is part of libextractor.
-     Copyright Copyright (C) 2008, 2012 Heikki Lindholm and Christian Grothoff
-
-     libextractor is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
-
-     libextractor 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
-     General Public License for more details.
-
-     You should have received a copy of the GNU General Public License
-     along with libextractor; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-     Boston, MA 02110-1301, USA.
- */
-/**
- * @file thumbnailffmpeg_extractor.c
- * @author Heikki Lindholm
- * @author Christian Grothoff
- * @brief this extractor produces a binary encoded
- * thumbnail of images and videos using the ffmpeg libs.
- *
- * This is a thumbnail extractor using the ffmpeg libraries that will 
eventually
- * support extracting thumbnails from both image and video files.
- *
- * Note that ffmpeg has a few issues:
- * (1) there are no recent official releases of the ffmpeg libs
- * (2) ffmpeg has a history of having security issues (parser is not robust)
- *
- *  So this plugin cannot be recommended for system with high security
- *requirements.
- */
-#include "platform.h"
-#include "extractor.h"
-#include <magic.h>
-
-#include <libavutil/avutil.h>
-#include <libavutil/imgutils.h>
-#include <libavformat/avformat.h>
-#include <libavcodec/avcodec.h>
-#include <libswscale/swscale.h>
-
-#if USE_JPEG
-#ifdef PIX_FMT_YUVJ420P
-#define PIX_OUTPUT_FORMAT PIX_FMT_YUVJ420P
-#else
-#define PIX_OUTPUT_FORMAT AV_PIX_FMT_YUVJ420P
-#endif
-#else
-#ifdef PIX_FMT_RGB24
-#define PIX_OUTPUT_FORMAT PIX_FMT_RGB24
-#else
-#define PIX_OUTPUT_FORMAT AV_PIX_FMT_RGB24
-#endif
-#endif
-
-/**
- * Set to 1 to use JPEG, PNG otherwise
- */
-#define USE_JPEG 1
-
-/**
- * Set to 1 to enable a output file for testing.
- */
-#define OUTPUT_FILE 0
-
-
-/**
- * Set to 1 to use jpeg.
- */
-#define DEBUG 0
-
-/**
- * max dimension in pixels for the thumbnail.
- */
-#define MAX_THUMB_DIMENSION 128
-
-/**
- * Maximum size in bytes for the thumbnail.
- */
-#define MAX_THUMB_BYTES (100 * 1024)
-
-/**
- * Number of bytes to feed to libav in one go.
- */
-#define BUFFER_SIZE (32 * 1024)
-
-/**
- * Number of bytes to feed to libav in one go, with padding (padding is 
zeroed).
- */
-#ifdef AV_INPUT_BUFFER_PADDING_SIZE
-#define PADDED_BUFFER_SIZE (BUFFER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE)
-#else
-/* legacy */
-#define PADDED_BUFFER_SIZE (BUFFER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE)
-#endif
-
-#ifndef AV_CODEC_FLAG_QSCALE
-#define AV_CODEC_FLAG_QSCALE CODEC_FLAG_QSCALE
-#endif
-
-
-/**
- * Global handle to MAGIC data.
- */
-static magic_t magic;
-
-
-/**
- * Read callback.
- *
- * @param opaque the 'struct EXTRACTOR_ExtractContext'
- * @param buf where to write data
- * @param buf_size how many bytes to read
- * @return -1 on error (or for unknown file size)
- */
-static int
-read_cb (void *opaque,
-         uint8_t *buf,
-         int buf_size)
-{
-  struct EXTRACTOR_ExtractContext *ec = opaque;
-  void *data;
-  ssize_t ret;
-
-  ret = ec->read (ec->cls, &data, buf_size);
-  if (ret <= 0)
-    return ret;
-  memcpy (buf, data, ret);
-  return ret;
-}
-
-
-/**
- * Seek callback.
- *
- * @param opaque the 'struct EXTRACTOR_ExtractContext'
- * @param offset where to seek
- * @param whence how to seek; AVSEEK_SIZE to return file size without seeking
- * @return -1 on error (or for unknown file size)
- */
-static int64_t
-seek_cb (void *opaque,
-         int64_t offset,
-         int whence)
-{
-  struct EXTRACTOR_ExtractContext *ec = opaque;
-
-  if (AVSEEK_SIZE == whence)
-    return ec->get_size (ec->cls);
-  return ec->seek (ec->cls, offset, whence);
-}
-
-
-/**
- * Rescale and encode a PNG thumbnail.
- *
- * @param src_width source image width
- * @param src_height source image height
- * @param src_stride
- * @param src_pixfmt
- * @param src_data source data
- * @param dst_width desired thumbnail width
- * @param dst_height desired thumbnail height
- * @param output_data where to store the resulting PNG data
- * @param output_max_size maximum size of result that is allowed
- * @return the number of bytes used, 0 on error
- */
-static size_t
-create_thumbnail (AVCodecContext *pCodecCtx, int src_width, int src_height,
-                  int src_stride[],
-                  enum AVPixelFormat src_pixfmt,
-                  const uint8_t *const src_data[],
-                  int dst_width, int dst_height,
-                  uint8_t **output_data,
-                  size_t output_max_size)
-{
-  AVCodecContext *encoder_codec_ctx;
-  AVDictionary *opts;
-  AVCodec *encoder_codec;
-  struct SwsContext *scaler_ctx;
-  AVFrame *dst_frame;
-  uint8_t *dst_buffer;
-  uint8_t *encoder_output_buffer;
-  size_t encoder_output_buffer_size;
-  int err;
-
-  AVPacket pkt;
-  av_init_packet (&pkt);
-  pkt.data = NULL;
-  pkt.size = 0;
-  int gotPacket;
-#if USE_JPEG
-  if (NULL == (encoder_codec = avcodec_find_encoder (AV_CODEC_ID_MJPEG)))
-#else
-  if (NULL == (encoder_codec = avcodec_find_encoder_by_name ("png")))
-#endif
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Couldn't find a encoder\n");
-#endif
-    return 0;
-  }
-
-  /* NOTE: the scaler will be used even if the src and dst image dimensions
-   * match, because the scaler will also perform colour space conversion */
-  if (NULL ==
-      (scaler_ctx =
-         sws_getContext (src_width, src_height, src_pixfmt,
-                         dst_width, dst_height,
-                         PIX_OUTPUT_FORMAT,
-                         SWS_BILINEAR, NULL, NULL, NULL)))
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to get a scaler context\n");
-#endif
-    return 0;
-  }
-
-  dst_frame = av_frame_alloc ();
-  if (NULL == dst_frame)
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to allocate the destination image frame\n");
-#endif
-    sws_freeContext (scaler_ctx);
-    return 0;
-  }
-  if (NULL == (dst_buffer =
-                 av_malloc (av_image_get_buffer_size (PIX_OUTPUT_FORMAT,
-                                                      dst_width,
-                                                      dst_height,
-                                                      1))))
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to allocate the destination image buffer\n");
-#endif
-    av_frame_free (&dst_frame);
-    sws_freeContext (scaler_ctx);
-    return 0;
-  }
-  av_image_fill_arrays (dst_frame->data,
-                        dst_frame->linesize,
-                        dst_buffer,
-                        PIX_OUTPUT_FORMAT,
-                        dst_width,
-                        dst_height,
-                        1);
-  sws_scale (scaler_ctx,
-             src_data,
-             src_stride,
-             0, src_height,
-             dst_frame->data,
-             dst_frame->linesize);
-
-  encoder_output_buffer_size = output_max_size;
-  if (NULL == (encoder_output_buffer = av_malloc (encoder_output_buffer_size)))
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to allocate the encoder output buffer\n");
-#endif
-    av_free (dst_buffer);
-    av_frame_free (&dst_frame);
-    sws_freeContext (scaler_ctx);
-    return 0;
-  }
-
-  if (NULL == (encoder_codec_ctx = avcodec_alloc_context3 (encoder_codec)))
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to allocate the encoder codec context\n");
-#endif
-    av_free (encoder_output_buffer);
-    av_free (dst_buffer);
-    av_frame_free (&dst_frame);
-    sws_freeContext (scaler_ctx);
-    return 0;
-  }
-  encoder_codec_ctx->width = dst_width;
-  encoder_codec_ctx->height = dst_height;
-#if USE_JPEG
-  encoder_codec_ctx->bit_rate      = pCodecCtx->bit_rate;
-  encoder_codec_ctx->codec_id      = AV_CODEC_ID_MJPEG;
-  encoder_codec_ctx->codec_type    = AVMEDIA_TYPE_VIDEO;
-  encoder_codec_ctx->time_base.num = pCodecCtx->time_base.num;
-  encoder_codec_ctx->time_base.den = pCodecCtx->time_base.den;
-  encoder_codec_ctx->pix_fmt = PIX_OUTPUT_FORMAT;
-#else
-  encoder_codec_ctx->pix_fmt = PIX_OUTPUT_FORMAT;
-#endif
-
-  opts = NULL;
-  if (avcodec_open2 (encoder_codec_ctx, encoder_codec, &opts) < 0)
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to open the encoder\n");
-#endif
-    avcodec_free_context (&encoder_codec_ctx);
-    av_free (encoder_output_buffer);
-    av_free (dst_buffer);
-    av_frame_free (&dst_frame);
-    sws_freeContext  (scaler_ctx);
-    return 0;
-  }
-
-
-#ifdef USE_JPEG
-#if FF_API_MPV_OPT
-  encoder_codec_ctx->mb_lmin        = encoder_codec_ctx->lmin =
-    encoder_codec_ctx->qmin * FF_QP2LAMBDA;
-  encoder_codec_ctx->mb_lmax        = encoder_codec_ctx->lmax =
-    encoder_codec_ctx->qmax * FF_QP2LAMBDA;
-#else
-  encoder_codec_ctx->mb_lmin = encoder_codec_ctx->qmin * FF_QP2LAMBDA;
-  encoder_codec_ctx->mb_lmax = encoder_codec_ctx->qmax * FF_QP2LAMBDA;
-#endif
-  encoder_codec_ctx->flags          = AV_CODEC_FLAG_QSCALE;
-  encoder_codec_ctx->global_quality = encoder_codec_ctx->qmin * FF_QP2LAMBDA;
-
-  dst_frame->pts     = 1;
-  dst_frame->quality = encoder_codec_ctx->global_quality;
-#endif
-
-  err = avcodec_encode_video2 (encoder_codec_ctx,
-                               &pkt,
-                               dst_frame, &gotPacket);
-
-  if (err < 0)
-    goto cleanup;
-  err = pkt.size;
-  memcpy (encoder_output_buffer,pkt.data, pkt.size);
-
-  av_packet_unref (&pkt);
-cleanup:
-  av_dict_free (&opts);
-  avcodec_close (encoder_codec_ctx);
-  avcodec_free_context (&encoder_codec_ctx);
-  av_free (dst_buffer);
-  av_frame_free (&dst_frame);
-  sws_freeContext (scaler_ctx);
-  *output_data = encoder_output_buffer;
-
-  return err < 0 ? 0 : err;
-}
-
-
-/**
- * calculate the thumbnail dimensions, taking pixel aspect into account
- *
- * @param src_width source image width
- * @param src_height source image height
- * @param src_sar_num
- * @param src_sar_den
- * @param dst_width desired thumbnail width (set)
- * @param dst_height desired thumbnail height (set)
-  */
-static void
-calculate_thumbnail_dimensions (int src_width,
-                                int src_height,
-                                int src_sar_num,
-                                int src_sar_den,
-                                int *dst_width,
-                                int *dst_height)
-{
-  if ( (src_sar_num <= 0) || (src_sar_den <= 0) )
-  {
-    src_sar_num = 1;
-    src_sar_den = 1;
-  }
-  if ((src_width * src_sar_num) / src_sar_den > src_height)
-  {
-    *dst_width = MAX_THUMB_DIMENSION;
-    *dst_height = (*dst_width * src_height)
-                  / ((src_width * src_sar_num) / src_sar_den);
-  }
-  else
-  {
-    *dst_height = MAX_THUMB_DIMENSION;
-    *dst_width = (*dst_height
-                  * ((src_width * src_sar_num) / src_sar_den))
-                 / src_height;
-  }
-  if (*dst_width < 8)
-    *dst_width = 8;
-  if (*dst_height < 1)
-    *dst_height = 1;
-#if DEBUG
-  fprintf (stderr,
-           "Thumbnail dimensions: %d %d\n",
-           *dst_width, *dst_height);
-#endif
-}
-
-
-#define ENUM_CODEC_ID enum AVCodecID
-
-/**
- * Perform thumbnailing when the input is an image.
- *
- * @param image_codec_id ffmpeg codec for the image format
- * @param ec extraction context to use
- */
-static void
-extract_image (ENUM_CODEC_ID image_codec_id,
-               struct EXTRACTOR_ExtractContext *ec)
-{
-  AVDictionary *opts;
-  AVCodecContext *codec_ctx;
-  AVCodec *codec;
-  AVPacket avpkt;
-  AVFrame *frame;
-  uint8_t *encoded_thumbnail;
-  int thumb_width;
-  int thumb_height;
-  int err;
-  int frame_finished;
-  ssize_t iret;
-  void *data;
-  unsigned char padded_data[PADDED_BUFFER_SIZE];
-
-  if (NULL == (codec = avcodec_find_decoder (image_codec_id)))
-  {
-#if DEBUG
-    fprintf (stderr,
-             "No suitable codec found\n");
-#endif
-    return;
-  }
-  if (NULL == (codec_ctx = avcodec_alloc_context3 (codec)))
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to allocate codec context\n");
-#endif
-    return;
-  }
-  opts = NULL;
-  if (0 != avcodec_open2 (codec_ctx, codec, &opts))
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to open image codec\n");
-#endif
-    avcodec_free_context (&codec_ctx);
-    return;
-  }
-  av_dict_free (&opts);
-  frame = av_frame_alloc ();
-  if (NULL == frame)
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to allocate frame\n");
-#endif
-    avcodec_close (codec_ctx);
-    avcodec_free_context (&codec_ctx);
-    return;
-  }
-
-  frame_finished = 0;
-  while (! frame_finished)
-  {
-    if (0 >= (iret = ec->read (ec->cls,
-                               &data,
-                               BUFFER_SIZE)))
-      break;
-    memcpy (padded_data, data, iret);
-    memset (&padded_data[iret], 0, PADDED_BUFFER_SIZE - iret);
-    av_init_packet (&avpkt);
-    avpkt.data = padded_data;
-    avpkt.size = iret;
-    avcodec_decode_video2 (codec_ctx, frame, &frame_finished, &avpkt);
-  }
-  if (! frame_finished)
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to decode a complete frame\n");
-#endif
-    av_frame_free (&frame);
-    avcodec_close (codec_ctx);
-    avcodec_free_context (&codec_ctx);
-    return;
-  }
-  calculate_thumbnail_dimensions (codec_ctx->width, codec_ctx->height,
-                                  codec_ctx->sample_aspect_ratio.num,
-                                  codec_ctx->sample_aspect_ratio.den,
-                                  &thumb_width, &thumb_height);
-
-  err = create_thumbnail (codec_ctx, codec_ctx->width, codec_ctx->height,
-                          frame->linesize, codec_ctx->pix_fmt,
-                          (const uint8_t *const*) frame->data,
-                          thumb_width, thumb_height,
-                          &encoded_thumbnail, MAX_THUMB_BYTES);
-  if (err > 0)
-  {
-    ec->proc (ec->cls,
-              "thumbnailffmpeg",
-              EXTRACTOR_METATYPE_THUMBNAIL,
-              EXTRACTOR_METAFORMAT_BINARY,
-              "image/png",
-              (const char*) encoded_thumbnail,
-              err);
-
-    #if OUTPUT_FILE
-    FILE *f;
-      #ifdef USE_JPEG
-    f = fopen ("thumb.jpg", "wb");
-      #else
-    f = fopen ("thumb.png", "wb");
-      #endif
-    if (! f)
-    {
-      fprintf (stderr, "Could not open %s\n", "file");
-      exit (1);
-    }
-
-    fwrite (encoded_thumbnail, 1, err, f);
-    fclose (f);
-
-        #endif
-
-
-    av_free (encoded_thumbnail);
-  }
-  av_frame_free (&frame);
-  avcodec_close (codec_ctx);
-  avcodec_free_context (&codec_ctx);
-}
-
-
-/**
- * Perform thumbnailing when the input is a video
- *
- * @param ec extraction context to use
- */
-static void
-extract_video (struct EXTRACTOR_ExtractContext *ec)
-{
-  AVPacket packet;
-  AVIOContext *io_ctx;
-  struct AVFormatContext *format_ctx;
-  AVCodecContext *codec_ctx;
-  AVCodecParameters *codecpar;
-  AVCodec *codec;
-  AVDictionary *options;
-  AVFrame *frame;
-  uint8_t *encoded_thumbnail;
-  int video_stream_index;
-  int thumb_width;
-  int thumb_height;
-  int i;
-  int err;
-  int frame_finished;
-  unsigned char *iob;
-  int duration;
-
-  if (NULL == (iob = av_malloc (16 * 1024)))
-    return;
-  if (NULL == (io_ctx = avio_alloc_context (iob,
-                                            16 * 1024,
-                                            0, ec,
-                                            &read_cb,
-                                            NULL /* no writing */,
-                                            &seek_cb)))
-  {
-    av_free (iob);
-    return;
-  }
-  if (NULL == (format_ctx = avformat_alloc_context ()))
-  {
-    av_free (io_ctx);
-    return;
-  }
-  format_ctx->pb = io_ctx;
-  options = NULL;
-  if (0 != avformat_open_input (&format_ctx, "<no file>", NULL, &options))
-  {
-    av_free (io_ctx);
-    return;
-  }
-  av_dict_free (&options);
-  if (0 > avformat_find_stream_info (format_ctx, NULL))
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to read stream info\n");
-#endif
-    avformat_close_input (&format_ctx);
-    av_free (io_ctx);
-    return;
-  }
-  codec = NULL;
-  codec_ctx = NULL;
-  video_stream_index = -1;
-  for (i = 0; i<format_ctx->nb_streams; i++)
-  {
-    codecpar = format_ctx->streams[i]->codecpar;
-    codec_ctx = format_ctx->streams[i]->codec;
-    if (AVMEDIA_TYPE_VIDEO != codec_ctx->codec_type)
-      continue;
-    if (NULL == (codec = avcodec_find_decoder (codecpar->codec_id)))
-      continue;
-    options = NULL;
-    if (0 != (err = avcodec_open2 (codec_ctx, codec, &options)))
-    {
-      codec = NULL;
-      continue;
-    }
-    av_dict_free (&options);
-    video_stream_index = i;
-    break;
-  }
-  if ( (-1 == video_stream_index) ||
-       (0 == codec_ctx->width) ||
-       (0 == codec_ctx->height) )
-  {
-#if DEBUG
-    fprintf (stderr,
-             "No video streams or no suitable codec found\n");
-#endif
-    if (NULL != codec)
-      avcodec_close (codec_ctx);
-    avformat_close_input (&format_ctx);
-    av_free (io_ctx);
-    return;
-  }
-
-  frame = av_frame_alloc ();
-  if (NULL == frame)
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to allocate frame\n");
-#endif
-    avcodec_close (codec_ctx);
-    avformat_close_input (&format_ctx);
-    av_free (io_ctx);
-    return;
-  }
-
-  if (format_ctx->duration == AV_NOPTS_VALUE)
-  {
-    duration = -1;
-#if DEBUG
-    fprintf (stderr,
-             "Duration unknown\n");
-#endif
-  }
-  else
-  {
-    duration = format_ctx->duration;
-  }
-
-  /* if duration is known, seek to first tried,
-   * else use 10 sec into stream */
-
-  if (-1 != duration)
-    err = av_seek_frame (format_ctx, -1, (duration / 3), 0);
-  else
-    err = av_seek_frame (format_ctx, -1, 10 * AV_TIME_BASE, 0);
-
-  if (err >= 0)
-    avcodec_flush_buffers (codec_ctx);
-  frame_finished = 0;
-
-  while (1)
-  {
-    err = av_read_frame (format_ctx, &packet);
-    if (err < 0)
-      break;
-    if (packet.stream_index == video_stream_index)
-    {
-      avcodec_decode_video2 (codec_ctx,
-                             frame,
-                             &frame_finished,
-                             &packet);
-      if (frame_finished && frame->key_frame)
-      {
-        av_packet_unref (&packet);
-        break;
-      }
-    }
-    av_packet_unref (&packet);
-  }
-
-  if (! frame_finished)
-  {
-#if DEBUG
-    fprintf (stderr,
-             "Failed to decode a complete frame\n");
-#endif
-    av_frame_free (&frame);
-    avcodec_close (codec_ctx);
-    avformat_close_input (&format_ctx);
-    av_free (io_ctx);
-    return;
-  }
-  calculate_thumbnail_dimensions (codec_ctx->width, codec_ctx->height,
-                                  codec_ctx->sample_aspect_ratio.num,
-                                  codec_ctx->sample_aspect_ratio.den,
-                                  &thumb_width, &thumb_height);
-
-  err = create_thumbnail (codec_ctx, codec_ctx->width, codec_ctx->height,
-                          frame->linesize, codec_ctx->pix_fmt,
-                          (const uint8_t*const *) frame->data,
-                          thumb_width, thumb_height,
-                          &encoded_thumbnail, MAX_THUMB_BYTES);
-  if (err > 0)
-  {
-    ec->proc (ec->cls,
-              "thumbnailffmpeg",
-              EXTRACTOR_METATYPE_THUMBNAIL,
-              EXTRACTOR_METAFORMAT_BINARY,
-              "image/png",
-              (const char*) encoded_thumbnail,
-              err);
-#if OUTPUT_FILE
-    FILE *f;
-#ifdef USE_JPEG
-    f = fopen ("thumb.jpg", "wb");
-#else
-    f = fopen ("thumb.png", "wb");
-#endif
-    if (! f)
-    {
-      fprintf (stderr, "Could not open %s\n", "file");
-      exit (1);
-    }
-
-    fwrite (encoded_thumbnail, 1, err, f);
-    fclose (f);
-#endif
-    av_free (encoded_thumbnail);
-  }
-  av_frame_free (&frame);
-  avcodec_close (codec_ctx);
-  avformat_close_input (&format_ctx);
-  av_free (io_ctx);
-}
-
-
-/**
- * Pair of mime type and ffmpeg decoder ID.
- */
-struct MIMEToDecoderMapping
-{
-  /**
-   * String for a mime type.
-   */
-  const char *mime_type;
-
-  /**
-   * Corresponding ffmpeg decoder ID.
-   */
-  ENUM_CODEC_ID codec_id;
-};
-
-
-/**
- * map MIME image types to an ffmpeg decoder
- */
-static const struct MIMEToDecoderMapping m2d_map[] = {
-
-#if LIBAVCODEC_BUILD >= AV_VERSION_INT (54,25,0)
-  { "image/x-bmp", AV_CODEC_ID_BMP },
-  { "image/gif", AV_CODEC_ID_GIF },
-  { "image/jpeg", AV_CODEC_ID_MJPEG },
-  { "image/png", AV_CODEC_ID_PNG },
-  { "image/x-png", AV_CODEC_ID_PNG },
-  { "image/x-portable-pixmap", AV_CODEC_ID_PPM },
-  { NULL, AV_CODEC_ID_NONE }
-#else
-  { "image/x-bmp", CODEC_ID_BMP },
-  { "image/gif", CODEC_ID_GIF },
-  { "image/jpeg", CODEC_ID_MJPEG },
-  { "image/png", CODEC_ID_PNG },
-  { "image/x-png", CODEC_ID_PNG },
-  { "image/x-portable-pixmap", CODEC_ID_PPM },
-  { NULL, CODEC_ID_NONE }
-#endif
-
-};
-
-
-/**
- * Main method for the ffmpeg-thumbnailer plugin.
- *
- * @param ec extraction context
- */
-void
-EXTRACTOR_thumbnailffmpeg_extract_method (struct EXTRACTOR_ExtractContext *ec)
-{
-  unsigned int i;
-  ssize_t iret;
-  void *data;
-  const char *mime;
-
-  if (-1 == (iret = ec->read (ec->cls,
-                              &data,
-                              16 * 1024)))
-    return;
-  if (NULL == (mime = magic_buffer (magic, data, iret)))
-    return;
-  if (0 != ec->seek (ec->cls, 0, SEEK_SET))
-    return;
-  for (i = 0; NULL != m2d_map[i].mime_type; i++)
-    if (0 == strcmp (m2d_map[i].mime_type, mime))
-    {
-      extract_image (m2d_map[i].codec_id, ec);
-      return;
-    }
-  extract_video (ec);
-}
-
-
-/**
- * This plugin sometimes is installed under the alias 'thumbnail'.
- * So we need to provide a second entry method.
- *
- * @param ec extraction context
- */
-void
-EXTRACTOR_thumbnail_extract_method (struct EXTRACTOR_ExtractContext *ec)
-{
-  EXTRACTOR_thumbnailffmpeg_extract_method (ec);
-}
-
-
-/**
- * Log callback.  Does nothing.
- *
- * @param ptr NULL
- * @param level log level
- * @param format format string
- * @param ap arguments for format
- */
-static void
-thumbnailffmpeg_av_log_callback (void*ptr,
-                                 int level,
-                                 const char *format,
-                                 va_list ap)
-{
-#if DEBUG
-  vfprintf (stderr, format, ap);
-#endif
-}
-
-
-/**
- * Initialize av-libs and load magic file.
- */
-void __attribute__ ((constructor))
-thumbnailffmpeg_lib_init (void)
-{
-  av_log_set_callback (&thumbnailffmpeg_av_log_callback);
-  magic = magic_open (MAGIC_MIME_TYPE);
-  if (0 != magic_load (magic, NULL))
-  {
-    /* FIXME: how to deal with errors? */
-  }
-}
-
-
-/**
- * Destructor for the library, cleans up.
- */
-void __attribute__ ((destructor))
-thumbnailffmpeg_ltdl_fini ()
-{
-  if (NULL != magic)
-  {
-    magic_close (magic);
-    magic = NULL;
-  }
-}
-
-
-/* end of thumbnailffmpeg_extractor.c */

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]