summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <rob@ti.com>2010-11-26 14:45:18 -0600
committerRob Clark <rob@ti.com>2010-11-27 09:22:32 -0600
commit345a40ec8d947f6864bd1ec67fa08eea1ddd306a (patch)
tree6e26d66f7beab2e67b9fa8b7ac2537808e1e425e
parent17bedd4de5fce07d849d542601cdc7d6d89f7143 (diff)
vp7dec: add On2 VP7 support
-rw-r--r--README2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/gstducati.c4
-rw-r--r--src/gstducativp7dec.c151
-rw-r--r--src/gstducativp7dec.h55
5 files changed, 212 insertions, 2 deletions
diff --git a/README b/README
index 78b2fd8..a32ba31 100644
--- a/README
+++ b/README
@@ -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__ */