summaryrefslogtreecommitdiff
path: root/gst/onvif
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2014-06-05 15:06:33 +0200
committerOlivier CrĂȘte <olivier.crete@collabora.com>2014-12-11 14:00:59 -0500
commit189005184c2f398509500ad69a2ef74708cfa576 (patch)
tree3af40d4c185db2890a8539890b4d089c68234dfd /gst/onvif
parentb424b72df12965dea8db6c7ad8bb9c96d73f015f (diff)
add rtponvifextract element
https://bugzilla.gnome.org/show_bug.cgi?id=731769
Diffstat (limited to 'gst/onvif')
-rw-r--r--gst/onvif/Makefile.am3
-rw-r--r--gst/onvif/gstrtponvif.c4
-rw-r--r--gst/onvif/gstrtponvifparse.c150
-rw-r--r--gst/onvif/gstrtponvifparse.h62
4 files changed, 218 insertions, 1 deletions
diff --git a/gst/onvif/Makefile.am b/gst/onvif/Makefile.am
index 9d0223bd4..2aa779bf3 100644
--- a/gst/onvif/Makefile.am
+++ b/gst/onvif/Makefile.am
@@ -2,7 +2,8 @@ plugin_LTLIBRARIES = libgstrtponvif.la
libgstrtponvif_la_SOURCES = \
gstrtponvif.c \
- gstrtponviftimestamp.c gstrtponviftimestamp.h
+ gstrtponviftimestamp.c gstrtponviftimestamp.h \
+ gstrtponvifparse.c gstonvifparse.h
libgstrtponvif_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
$(GST_BASE_CFLAGS) $(GST_CFLAGS)
libgstrtponvif_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
diff --git a/gst/onvif/gstrtponvif.c b/gst/onvif/gstrtponvif.c
index 8f24d94fb..c6742327d 100644
--- a/gst/onvif/gstrtponvif.c
+++ b/gst/onvif/gstrtponvif.c
@@ -25,6 +25,7 @@
#include <gst/gst.h>
#include "gstrtponviftimestamp.h"
+#include "gstrtponvifparse.h"
static gboolean
plugin_init (GstPlugin * plugin)
@@ -32,6 +33,9 @@ plugin_init (GstPlugin * plugin)
if (!gst_element_register (plugin, "rtponviftimestamp", GST_RANK_NONE,
GST_TYPE_RTP_ONVIF_TIMESTAMP))
return FALSE;
+ if (!gst_element_register (plugin, "rtponvifparse", GST_RANK_NONE,
+ GST_TYPE_RTP_ONVIF_PARSE))
+ return FALSE;
return TRUE;
}
diff --git a/gst/onvif/gstrtponvifparse.c b/gst/onvif/gstrtponvifparse.c
new file mode 100644
index 000000000..f48ac0749
--- /dev/null
+++ b/gst/onvif/gstrtponvifparse.c
@@ -0,0 +1,150 @@
+/*
+ * gstrtponviftimestamp-parse.c
+ *
+ * Copyright (C) 2014 Axis Communications AB
+ * Author: Guillaume Desmottes <guillaume.desmottes@collabora.com>
+ *
+ * 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; either
+ * version 2.1 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
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gst/rtp/gstrtpbuffer.h>
+
+#include "gstrtponvifparse.h"
+
+static GstFlowReturn gst_rtp_onvif_parse_chain (GstPad * pad,
+ GstObject * parent, GstBuffer * buf);
+
+static GstStaticPadTemplate sink_template_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-rtp")
+ );
+
+static GstStaticPadTemplate src_template_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-rtp")
+ );
+
+G_DEFINE_TYPE (GstRtpOnvifParse, gst_rtp_onvif_parse, GST_TYPE_ELEMENT);
+
+static void
+gst_rtp_onvif_parse_class_init (GstRtpOnvifParseClass * klass)
+{
+ GstElementClass *gstelement_class;
+
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ /* register pads */
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sink_template_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&src_template_factory));
+
+ gst_element_class_set_static_metadata (gstelement_class,
+ "ONVIF NTP timestamps RTP extension", "Effect/RTP",
+ "Add absolute timestamps and flags of recorded data in a playback "
+ "session", "Guillaume Desmottes <guillaume.desmottes@collabora.com>");
+}
+
+static void
+gst_rtp_onvif_parse_init (GstRtpOnvifParse * self)
+{
+ self->sinkpad =
+ gst_pad_new_from_static_template (&sink_template_factory, "sink");
+ gst_pad_set_chain_function (self->sinkpad, gst_rtp_onvif_parse_chain);
+ gst_element_add_pad (GST_ELEMENT (self), self->sinkpad);
+ GST_PAD_SET_PROXY_CAPS (self->sinkpad);
+
+ self->srcpad =
+ gst_pad_new_from_static_template (&src_template_factory, "src");
+ gst_element_add_pad (GST_ELEMENT (self), self->srcpad);
+}
+
+#define EXTENSION_ID 0xABAC
+#define EXTENSION_SIZE 3
+
+static gboolean
+handle_buffer (GstRtpOnvifParse * self, GstBuffer * buf)
+{
+ GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
+ guint8 *data;
+ guint16 bits;
+ guint wordlen;
+ guint8 flags;
+ /*
+ guint64 timestamp;
+ guint8 cseq;
+ */
+
+ if (!gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp)) {
+ GST_ELEMENT_ERROR (self, STREAM, FAILED,
+ ("Failed to map RTP buffer"), (NULL));
+ return FALSE;
+ }
+
+ /* Check if the ONVIF RTP extension is present in the packet */
+ if (!gst_rtp_buffer_get_extension_data (&rtp, &bits, (gpointer) & data,
+ &wordlen))
+ goto out;
+
+ if (bits != EXTENSION_ID || wordlen != EXTENSION_SIZE)
+ goto out;
+
+ /* timestamp = GST_READ_UINT64_BE (data); TODO */
+ flags = GST_READ_UINT8 (data + 8);
+ /* cseq = GST_READ_UINT8 (data + 9); TODO */
+
+ /* C */
+ if (flags & (1 << 7))
+ GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+ else
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+
+ /* E */
+ /* if (flags & (1 << 6)); TODO */
+
+ /* D */
+ if (flags & (1 << 5))
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ else
+ GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DISCONT);
+
+out:
+ gst_rtp_buffer_unmap (&rtp);
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_rtp_onvif_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
+{
+ GstRtpOnvifParse *self = GST_RTP_ONVIF_PARSE (parent);
+
+ if (!handle_buffer (self, buf)) {
+ gst_buffer_unref (buf);
+ return GST_FLOW_ERROR;
+ }
+
+ return gst_pad_push (self->srcpad, buf);
+}
diff --git a/gst/onvif/gstrtponvifparse.h b/gst/onvif/gstrtponvifparse.h
new file mode 100644
index 000000000..437b1abcf
--- /dev/null
+++ b/gst/onvif/gstrtponvifparse.h
@@ -0,0 +1,62 @@
+/*
+ * gstrtponviftimestamp-parse.h
+ *
+ * Copyright (C) 2014 Axis Communications AB
+ * Author: Guillaume Desmottes <guillaume.desmottes@collabora.com>
+ *
+ * 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; either
+ * version 2.1 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
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GST_RTP_ONVIF_PARSE_H__
+#define __GST_RTP_ONVIF_PARSE_H__
+
+
+#include <gst/gst.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define GST_TYPE_RTP_ONVIF_PARSE \
+ (gst_rtp_onvif_parse_get_type())
+#define GST_RTP_ONVIF_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_ONVIF_PARSE,GstRtpOnvifParse))
+#define GST_RTP_ONVIF_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_ONVIF_PARSE,GstRtpOnvifParseClass))
+#define GST_IS_RTP_ONVIF_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_ONVIF_PARSE))
+#define GST_IS_RTP_ONVIF_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_ONVIF_PARSE))
+
+typedef struct _GstRtpOnvifParse GstRtpOnvifParse;
+typedef struct _GstRtpOnvifParseClass GstRtpOnvifParseClass;
+
+struct _GstRtpOnvifParse {
+ GstElement element;
+
+ /* pads */
+ GstPad *sinkpad,*srcpad;
+};
+
+struct _GstRtpOnvifParseClass {
+ GstElementClass parent_class;
+};
+
+GType gst_rtp_onvif_parse_get_type(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GST_RTP_ONVIF_PARSE_H__ */