summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim.muller@collabora.co.uk>2009-07-01 13:49:57 +0100
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2009-09-23 16:54:41 +0100
commit410ebb7eb3d6c216c977d5562b20020f4138b7bd (patch)
tree37f185cc371c0cab14ea6d9c76c977a4ed1e135e
parent02581dd2a5f6d193eecb19568a4d425e26d5bb64 (diff)
qtdemux: add QtAtomParser, an inlined GstByteReader variant
-rw-r--r--gst/qtdemux/Makefile.am1
-rw-r--r--gst/qtdemux/qtatomparser.h125
-rw-r--r--gst/qtdemux/qtdemux.c1
3 files changed, 127 insertions, 0 deletions
diff --git a/gst/qtdemux/Makefile.am b/gst/qtdemux/Makefile.am
index 2f97f8d1..6c315094 100644
--- a/gst/qtdemux/Makefile.am
+++ b/gst/qtdemux/Makefile.am
@@ -10,6 +10,7 @@ libgstqtdemux_la_SOURCES = quicktime.c gstrtpxqtdepay.c qtdemux.c qtdemux_types.
libgstqtdemux_la_LIBTOOLFLAGS = --tag=disable-static
noinst_HEADERS = \
+ qtatomparser.h \
qtdemux.h \
qtdemux_types.h \
qtdemux_dump.h \
diff --git a/gst/qtdemux/qtatomparser.h b/gst/qtdemux/qtatomparser.h
new file mode 100644
index 00000000..44f40c2a
--- /dev/null
+++ b/gst/qtdemux/qtatomparser.h
@@ -0,0 +1,125 @@
+/* GStreamer QuickTime atom parser
+ * Copyright (C) 2009 Tim-Philipp Müller <tim centricular net>
+ *
+ * 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef QT_ATOM_PARSER_H
+#define QT_ATOM_PARSER_H
+
+#include <gst/base/gstbytereader.h>
+
+/* our inlined version of GstByteReader */
+
+typedef GstByteReader QtAtomParser;
+
+static inline void
+qt_atom_parser_init (QtAtomParser * parser, const guint8 * data, guint size)
+{
+ gst_byte_reader_init (parser, data, size);
+}
+
+static inline guint
+qt_atom_parser_get_remaining (QtAtomParser * parser)
+{
+ return parser->size - parser->byte;
+}
+
+static inline gboolean
+qt_atom_parser_skip (QtAtomParser * parser, guint nbytes)
+{
+ if (G_UNLIKELY (qt_atom_parser_get_remaining (parser) < nbytes))
+ return FALSE;
+
+ parser->byte += nbytes;
+ return TRUE;
+}
+
+static inline void
+qt_atom_parser_skip_unchecked (QtAtomParser * parser, guint nbytes)
+{
+ parser->byte += nbytes;
+}
+
+#ifndef GST_READ_UINT8_BE
+#define GST_READ_UINT8_BE GST_READ_UINT8
+#endif
+
+#define _QT_ATOM_PARSER_GET_PEEK_BITS(bits,typebits) \
+static inline gboolean \
+qt_atom_parser_get_uint##bits (QtAtomParser * parser, guint##typebits * val) \
+{ \
+ if (G_UNLIKELY (qt_atom_parser_get_remaining (parser) < (bits / 8))) \
+ return FALSE; \
+ *val = GST_READ_UINT##bits##_BE (parser->data + parser->byte); \
+ parser->byte += bits / 8; \
+ return TRUE; \
+} \
+\
+static inline gboolean \
+qt_atom_parser_peek_uint##bits (QtAtomParser * parser, guint##typebits * val) \
+{ \
+ if (G_UNLIKELY (qt_atom_parser_get_remaining (parser) < (bits / 8))) \
+ return FALSE; \
+ *val = GST_READ_UINT##bits##_BE (parser->data + parser->byte); \
+ return TRUE; \
+} \
+\
+static inline guint##typebits \
+qt_atom_parser_get_uint##bits##_unchecked (QtAtomParser * parser) \
+{ \
+ guint##typebits val = GST_READ_UINT##bits##_BE (parser->data + parser->byte); \
+ parser->byte += bits / 8; \
+ return val; \
+} \
+\
+static inline guint##typebits \
+qt_atom_parser_peek_uint##bits##_unchecked (QtAtomParser * parser) \
+{ \
+ return GST_READ_UINT##bits##_BE (parser->data + parser->byte); \
+}
+
+_QT_ATOM_PARSER_GET_PEEK_BITS(8,8);
+_QT_ATOM_PARSER_GET_PEEK_BITS(16,16);
+_QT_ATOM_PARSER_GET_PEEK_BITS(24,32);
+_QT_ATOM_PARSER_GET_PEEK_BITS(32,32);
+_QT_ATOM_PARSER_GET_PEEK_BITS(64,64);
+
+static inline gboolean
+qt_atom_parser_peek_sub (QtAtomParser * parser, guint offset, guint size,
+ QtAtomParser * sub)
+{
+ *sub = *parser;
+
+ if (G_UNLIKELY (!gst_byte_reader_skip (sub, offset)))
+ return FALSE;
+
+ return (gst_byte_reader_get_remaining (sub) >= size);
+}
+
+static inline gboolean
+qt_atom_parser_skipn_and_get_uint32 (QtAtomParser * parser,
+ guint bytes_to_skip, guint32 * val)
+{
+ if (G_UNLIKELY (qt_atom_parser_get_remaining (parser) < (bytes_to_skip + 4)))
+ return FALSE;
+
+ qt_atom_parser_skip_unchecked (parser, bytes_to_skip);
+ *val = qt_atom_parser_get_uint32_unchecked (parser);
+ return TRUE;
+}
+
+#endif /* QT_ATOM_PARSER_H */
diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c
index 7f34ded0..98514e2b 100644
--- a/gst/qtdemux/qtdemux.c
+++ b/gst/qtdemux/qtdemux.c
@@ -49,6 +49,7 @@
#include <gst/tag/tag.h>
+#include "qtatomparser.h"
#include "qtdemux_types.h"
#include "qtdemux_dump.h"
#include "qtdemux_fourcc.h"