Commit f67af293 authored by Sebastian Dröge's avatar Sebastian Dröge 🍵

vpx: Add initial, experimental VP9 support

parent 95906b8f
......@@ -945,6 +945,8 @@ dnl *** vpx ***
translit(dnm, m, l) AM_CONDITIONAL(USE_VPX, vpx)
AG_GST_CHECK_FEATURE(VPX, [VPX decoder], vpx, [
PKG_CHECK_MODULES(VPX, vpx >= 1.1.0, [HAVE_VPX="yes"], [HAVE_VPX="no"])
HAVE_VP8=no
HAVE_VP9=no
if test $HAVE_VPX = "yes"; then
OLD_LIBS="$LIBS"
......@@ -959,6 +961,16 @@ AG_GST_CHECK_FEATURE(VPX, [VPX decoder], vpx, [
HAVE_VP8=yes
AC_DEFINE(HAVE_VP8_DECODER, 1, [Defined if the VP8 decoder is available])
])
if test "x$BUILD_EXPERIMENTAL" = "xyes"; then
AC_CHECK_LIB(vpx, vpx_codec_vp9_cx_algo, [
HAVE_VP9=yes
AC_DEFINE(HAVE_VP9_ENCODER, 1, [Defined if the VP9 encoder is available])
])
AC_CHECK_LIB(vpx, vpx_codec_vp9_dx_algo, [
HAVE_VP9=yes
AC_DEFINE(HAVE_VP9_DECODER, 1, [Defined if the VP9 decoder is available])
])
fi
LIBS="$OLD_LIBS"
CFLAGS="$OLD_CFLAGS"
fi
......
......@@ -5,6 +5,8 @@ libgstvpx_la_SOURCES = \
gstvp8dec.c \
gstvp8enc.c \
gstvp8utils.c \
gstvp9dec.c \
gstvp9enc.c \
plugin.c
libgstvpx_la_CFLAGS = \
......@@ -22,6 +24,8 @@ libgstvpx_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
noinst_HEADERS = \
gstvp8dec.h \
gstvp8enc.h \
gstvp9dec.h \
gstvp9enc.h \
gstvp8utils.h
presetdir = $(datadir)/gstreamer-$(GST_API_VERSION)/presets
......
This diff is collapsed.
/* VP9
* Copyright (C) 2006 David Schleef <ds@schleef.org>
* Copyright (C) 2008,2009,2010 Entropy Wave Inc
* Copyright (C) 2010-2013 Sebastian Dröge <slomo@circular-chaos.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#ifndef __GST_VP9_DEC_H__
#define __GST_VP9_DEC_H__
#include <gst/gst.h>
#include <gst/video/gstvideodecoder.h>
/* FIXME: Undef HAVE_CONFIG_H because vpx_codec.h uses it,
* which causes compilation failures */
#ifdef HAVE_CONFIG_H
#undef HAVE_CONFIG_H
#endif
#include <vpx/vpx_decoder.h>
#include <vpx/vp8dx.h>
G_BEGIN_DECLS
#define GST_TYPE_VP9_DEC \
(gst_vp9_dec_get_type())
#define GST_VP9_DEC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VP9_DEC,GstVP9Dec))
#define GST_VP9_DEC_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VP9_DEC,GstVP9DecClass))
#define GST_IS_VP9_DEC(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VP9_DEC))
#define GST_IS_VP9_DEC_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VP9_DEC))
typedef struct _GstVP9Dec GstVP9Dec;
typedef struct _GstVP9DecClass GstVP9DecClass;
struct _GstVP9Dec
{
GstVideoDecoder base_video_decoder;
/* < private > */
vpx_codec_ctx_t decoder;
/* state */
gboolean decoder_inited;
/* properties */
gboolean post_processing;
enum vp8_postproc_level post_processing_flags;
gint deblocking_level;
gint noise_level;
gint threads;
GstVideoCodecState *input_state;
GstVideoCodecState *output_state;
};
struct _GstVP9DecClass
{
GstVideoDecoderClass base_video_decoder_class;
};
GType gst_vp9_dec_get_type (void);
G_END_DECLS
#endif /* __GST_VP9_DEC_H__ */
This diff is collapsed.
/* VP9
* Copyright (C) 2006 David Schleef <ds@schleef.org>
* Copyright (C) 2010 Entropy Wave Inc
* Copyright (C) 2010-2013 Sebastian Dröge <slomo@circular-chaos.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#ifndef __GST_VP9_ENC_H__
#define __GST_VP9_ENC_H__
#include <gst/gst.h>
#include <gst/video/gstvideoencoder.h>
/* FIXME: Undef HAVE_CONFIG_H because vpx_codec.h uses it,
* which causes compilation failures */
#ifdef HAVE_CONFIG_H
#undef HAVE_CONFIG_H
#endif
#include <vpx/vpx_encoder.h>
#include <vpx/vp8cx.h>
G_BEGIN_DECLS
#define GST_TYPE_VP9_ENC \
(gst_vp9_enc_get_type())
#define GST_VP9_ENC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VP9_ENC,GstVP9Enc))
#define GST_VP9_ENC_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VP9_ENC,GstVP9EncClass))
#define GST_IS_VP9_ENC(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VP9_ENC))
#define GST_IS_VP9_ENC_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VP9_ENC))
typedef struct _GstVP9Enc GstVP9Enc;
typedef struct _GstVP9EncClass GstVP9EncClass;
struct _GstVP9Enc
{
GstVideoEncoder base_video_encoder;
/* < private > */
vpx_codec_ctx_t encoder;
GMutex encoder_lock;
/* properties */
vpx_codec_enc_cfg_t cfg;
gboolean have_default_config;
gboolean rc_target_bitrate_set;
gint n_ts_target_bitrate;
gint n_ts_rate_decimator;
gint n_ts_layer_id;
/* Global two-pass options */
gchar *multipass_cache_file;
GByteArray *first_pass_cache_content;
/* Encode parameter */
gint64 deadline;
/* Controls */
VPX_SCALING_MODE h_scaling_mode;
VPX_SCALING_MODE v_scaling_mode;
int cpu_used;
gboolean enable_auto_alt_ref;
unsigned int noise_sensitivity;
unsigned int sharpness;
unsigned int static_threshold;
vp8e_token_partitions token_partitions;
unsigned int arnr_maxframes;
unsigned int arnr_strength;
unsigned int arnr_type;
vp8e_tuning tuning;
unsigned int cq_level;
unsigned int max_intra_bitrate_pct;
/* Timebase - a value of 0 will use the framerate */
unsigned int timebase_n;
unsigned int timebase_d;
/* state */
gboolean inited;
vpx_image_t image;
int n_frames;
GstVideoCodecState *input_state;
};
struct _GstVP9EncClass
{
GstVideoEncoderClass base_video_encoder_class;
};
GType gst_vp9_enc_get_type (void);
G_END_DECLS
#endif /* __GST_VP9_ENC_H__ */
......@@ -27,6 +27,8 @@
#include "gstvp8dec.h"
#include "gstvp8enc.h"
#include "gstvp9dec.h"
#include "gstvp9enc.h"
static gboolean
plugin_init (GstPlugin * plugin)
......@@ -41,6 +43,16 @@ plugin_init (GstPlugin * plugin)
gst_vp8_enc_get_type ());
#endif
#ifdef HAVE_VP9_DECODER
gst_element_register (plugin, "vp9dec", GST_RANK_PRIMARY,
gst_vp9_dec_get_type ());
#endif
#ifdef HAVE_VP9_ENCODER
gst_element_register (plugin, "vp9enc", GST_RANK_PRIMARY,
gst_vp9_enc_get_type ());
#endif
return TRUE;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment