diff options
author | Rob Clark <rob@ti.com> | 2010-11-26 14:45:18 -0600 |
---|---|---|
committer | Rob Clark <rob@ti.com> | 2010-11-27 09:22:32 -0600 |
commit | 345a40ec8d947f6864bd1ec67fa08eea1ddd306a (patch) | |
tree | 6e26d66f7beab2e67b9fa8b7ac2537808e1e425e | |
parent | 17bedd4de5fce07d849d542601cdc7d6d89f7143 (diff) |
vp7dec: add On2 VP7 support
-rw-r--r-- | README | 2 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/gstducati.c | 4 | ||||
-rw-r--r-- | src/gstducativp7dec.c | 151 | ||||
-rw-r--r-- | src/gstducativp7dec.h | 55 |
5 files changed, 212 insertions, 2 deletions
@@ -22,7 +22,7 @@ libdce (https://github.com/robclark/libdce) matching your kernel version. TODO ---- -+ vp7, realvideo ++ realvideo + fallbacks for sink elements not providing TILER buffers to decode into + search the code for XXX or TODO ;-) diff --git a/src/Makefile.am b/src/Makefile.am index d985378..b336abf 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,6 +2,7 @@ plugin_LTLIBRARIES = libgstducati.la # headers we need but don't want installed noinst_HEADERS = \ + gstducativp7dec.h \ gstducativp6dec.h \ gstducativc1dec.h \ gstducatimpeg4dec.h \ @@ -11,6 +12,7 @@ noinst_HEADERS = \ # sources used to compile this plug-in libgstducati_la_SOURCES = \ + gstducativp7dec.c \ gstducativp6dec.c \ gstducativc1dec.c \ gstducatimpeg4dec.c \ diff --git a/src/gstducati.c b/src/gstducati.c index 5cb800b..fe98e9a 100644 --- a/src/gstducati.c +++ b/src/gstducati.c @@ -27,6 +27,7 @@ #include "gstducatimpeg4dec.h" #include "gstducativc1dec.h" #include "gstducativp6dec.h" +#include "gstducativp7dec.h" GST_DEBUG_CATEGORY (gst_ducati_debug); @@ -41,7 +42,8 @@ plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "ducatih264dec", GST_RANK_PRIMARY, GST_TYPE_DUCATIH264DEC) && gst_element_register (plugin, "ducatimpeg4dec", GST_RANK_PRIMARY, GST_TYPE_DUCATIMPEG4DEC) && gst_element_register (plugin, "ducativc1dec", GST_RANK_PRIMARY, GST_TYPE_DUCATIVC1DEC) && - gst_element_register (plugin, "ducativp6dec", GST_RANK_PRIMARY, GST_TYPE_DUCATIVP6DEC); + gst_element_register (plugin, "ducativp6dec", GST_RANK_PRIMARY, GST_TYPE_DUCATIVP6DEC) && + gst_element_register (plugin, "ducativp7dec", GST_RANK_PRIMARY, GST_TYPE_DUCATIVP7DEC); } void * diff --git a/src/gstducativp7dec.c b/src/gstducativp7dec.c new file mode 100644 index 0000000..087a3c6 --- /dev/null +++ b/src/gstducativp7dec.c @@ -0,0 +1,151 @@ +/* + * GStreamer + * Copyright (c) 2010, Texas Instruments Incorporated + * + * This library 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 + * version 2.1 of the License. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * SECTION:element-ducativp7dec + * + * FIXME:Describe ducativp7dec here. + * + * <refsect2> + * <title>Example launch line</title> + * |[ + * gst-launch -v -m fakesrc ! ducativp7dec ! fakesink silent=TRUE + * ]| + * </refsect2> + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> + +#include "gstducativp7dec.h" + + +#define PADX 48 +#define PADY 48 + + +GST_BOILERPLATE (GstDucatiVP7Dec, gst_ducati_vp7dec, GstDucatiVidDec, + GST_TYPE_DUCATIVIDDEC); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-vp7, " + "width = (int)[ 16, 2048 ], " + "height = (int)[ 16, 2048 ], " + "framerate = (fraction)[ 0, max ];") + ); + +/* GstDucatiVidDec vmethod implementations */ + +static void +gst_ducati_vp7dec_update_buffer_size (GstDucatiVidDec * self) +{ + gint w = self->width; + gint h = self->height; + + /* calculate output buffer parameters: */ + self->padded_width = (w + (2 * PADX) + 0x7f) & ~0x7f; + self->padded_height = h + 2 * PADY; + self->min_buffers = 8; +} + +static gboolean +gst_ducati_vp7dec_allocate_params (GstDucatiVidDec * self, gint params_sz, + gint dynparams_sz, gint status_sz, gint inargs_sz, gint outargs_sz) +{ + gboolean ret = parent_class->allocate_params (self, + sizeof (Ivp7VDEC_Params), sizeof (Ivp7VDEC_DynamicParams), + sizeof (Ivp7VDEC_Status), sizeof (Ivp7VDEC_InArgs), + sizeof (Ivp7VDEC_OutArgs)); + + if (ret) { + Ivp7VDEC_Params *params = (Ivp7VDEC_Params *) self->params; + self->params->displayDelay = IVIDDEC3_DECODE_ORDER; + self->dynParams->newFrameFlag = FALSE; + self->dynParams->lateAcquireArg = -1; + self->params->numInputDataUnits = 1; + self->params->numOutputDataUnits = 1; + params->ivfFormat = FALSE; + } + + return ret; +} + +/* this should be unneeded in future codec versions: */ +static GstBuffer * +gst_ducati_vp7dec_push_input (GstDucatiVidDec * vdec, GstBuffer * buf) +{ + GstDucatiVP7Dec *self = GST_DUCATIVP7DEC (vdec); + guint32 sz; + + if (G_UNLIKELY (vdec->first_in_buffer) && vdec->codec_data) { + // XXX none of the vp7 clips I've seen have codec_data.. + } + + /* current codec version requires size prepended on input buffer: */ + sz = GST_BUFFER_SIZE (buf); + push_input (vdec, (guint8 *)&sz, 4); + + push_input (vdec, GST_BUFFER_DATA (buf), sz); + gst_buffer_unref (buf); + + return NULL; +} + + +/* GObject vmethod implementations */ + +static void +gst_ducati_vp7dec_base_init (gpointer gclass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); + + gst_element_class_set_details_simple (element_class, + "DucatiVP7Dec", + "Codec/Decoder/Video", + "Decodes video in On2 VP7 format with ducati", + "Rob Clark <rob@ti.com>"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); +} + +static void +gst_ducati_vp7dec_class_init (GstDucatiVP7DecClass * klass) +{ + GstDucatiVidDecClass *bclass = GST_DUCATIVIDDEC_CLASS (klass); + bclass->codec_name = "ivahd_vp7dec"; + bclass->update_buffer_size = + GST_DEBUG_FUNCPTR (gst_ducati_vp7dec_update_buffer_size); + bclass->allocate_params = + GST_DEBUG_FUNCPTR (gst_ducati_vp7dec_allocate_params); + bclass->push_input = + GST_DEBUG_FUNCPTR (gst_ducati_vp7dec_push_input); +} + +static void +gst_ducati_vp7dec_init (GstDucatiVP7Dec * self, + GstDucatiVP7DecClass * gclass) +{ +} diff --git a/src/gstducativp7dec.h b/src/gstducativp7dec.h new file mode 100644 index 0000000..cae9a0a --- /dev/null +++ b/src/gstducativp7dec.h @@ -0,0 +1,55 @@ +/* + * GStreamer + * Copyright (c) 2010, Texas Instruments Incorporated + * + * This library 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 + * version 2.1 of the License. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GST_DUCATIVP7DEC_H__ +#define __GST_DUCATIVP7DEC_H__ + +#include <gst/gst.h> + +#include "gstducatividdec.h" + +#include <ti/sdo/codecs/vp7dec/ivp7vdec.h> + + +G_BEGIN_DECLS + +#define GST_TYPE_DUCATIVP7DEC (gst_ducati_vp7dec_get_type()) +#define GST_DUCATIVP7DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DUCATIVP7DEC, GstDucatiVP7Dec)) +#define GST_DUCATIVP7DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DUCATIVP7DEC, GstDucatiVP7DecClass)) +#define GST_IS_DUCATIVP7DEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DUCATIVP7DEC)) +#define GST_IS_DUCATIVP7DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DUCATIVP7DEC)) + +typedef struct _GstDucatiVP7Dec GstDucatiVP7Dec; +typedef struct _GstDucatiVP7DecClass GstDucatiVP7DecClass; + +struct _GstDucatiVP7Dec +{ + GstDucatiVidDec parent; +}; + +struct _GstDucatiVP7DecClass +{ + GstDucatiVidDecClass parent_class; +}; + +GType gst_ducati_vp7dec_get_type (void); + +G_END_DECLS + +#endif /* __GST_DUCATIVP7DEC_H__ */ |