Blame gst/matroska/ebml-read.h

Packit 1f69a5
/* GStreamer EBML I/O
Packit 1f69a5
 * (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
Packit 1f69a5
 *
Packit 1f69a5
 * ebml-read.c: read EBML data from file/stream
Packit 1f69a5
 *
Packit 1f69a5
 * This library is free software; you can redistribute it and/or
Packit 1f69a5
 * modify it under the terms of the GNU Library General Public
Packit 1f69a5
 * License as published by the Free Software Foundation; either
Packit 1f69a5
 * version 2 of the License, or (at your option) any later version.
Packit 1f69a5
 *
Packit 1f69a5
 * This library is distributed in the hope that it will be useful,
Packit 1f69a5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1f69a5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 1f69a5
 * Library General Public License for more details.
Packit 1f69a5
 *
Packit 1f69a5
 * You should have received a copy of the GNU Library General Public
Packit 1f69a5
 * License along with this library; if not, write to the
Packit 1f69a5
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit 1f69a5
 * Boston, MA 02110-1301, USA.
Packit 1f69a5
 */
Packit 1f69a5
Packit 1f69a5
#ifndef __GST_EBML_READ_H__
Packit 1f69a5
#define __GST_EBML_READ_H__
Packit 1f69a5
Packit 1f69a5
#include <gst/gst.h>
Packit 1f69a5
#include <gst/base/gstbytereader.h>
Packit 1f69a5
Packit 1f69a5
G_BEGIN_DECLS
Packit 1f69a5
Packit 1f69a5
#define GST_TYPE_EBML_READ \
Packit 1f69a5
  (gst_ebml_read_get_type ())
Packit 1f69a5
#define GST_EBML_READ(obj) \
Packit 1f69a5
  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_EBML_READ, GstEbmlRead))
Packit 1f69a5
#define GST_EBML_READ_CLASS(klass) \
Packit 1f69a5
  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_EBML_READ, GstEbmlReadClass))
Packit 1f69a5
#define GST_IS_EBML_READ(obj) \
Packit 1f69a5
  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_EBML_READ))
Packit 1f69a5
#define GST_IS_EBML_READ_CLASS(klass) \
Packit 1f69a5
  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_READ))
Packit 1f69a5
#define GST_EBML_READ_GET_CLASS(obj) \
Packit 1f69a5
  (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_READ, GstEbmlReadClass))
Packit 1f69a5
Packit 1f69a5
GST_DEBUG_CATEGORY_EXTERN (ebmlread_debug);
Packit 1f69a5
Packit 1f69a5
/* custom flow return code */
Packit 1f69a5
#define  GST_FLOW_PARSE  GST_FLOW_CUSTOM_ERROR
Packit 1f69a5
Packit 1f69a5
typedef struct _GstEbmlMaster {
Packit 1f69a5
  guint64       offset;
Packit 1f69a5
  GstByteReader br;
Packit 1f69a5
} GstEbmlMaster;
Packit 1f69a5
Packit 1f69a5
typedef struct _GstEbmlRead {
Packit 1f69a5
  GstElement *el;
Packit 1f69a5
Packit 1f69a5
  GstBuffer *buf;
Packit 1f69a5
  guint64 offset;
Packit 1f69a5
  GstMapInfo map;
Packit 1f69a5
Packit 1f69a5
  GArray *readers;
Packit 1f69a5
} GstEbmlRead;
Packit 1f69a5
Packit 1f69a5
typedef GstFlowReturn (*GstPeekData) (gpointer * context, guint peek, const guint8 ** data);
Packit 1f69a5
Packit 1f69a5
/* returns UNEXPECTED if not enough data */
Packit 1f69a5
GstFlowReturn gst_ebml_peek_id_length    (guint32 * _id, guint64 * _length,
Packit 1f69a5
                                          guint * _needed,
Packit 1f69a5
                                          GstPeekData peek, gpointer * ctx,
Packit 1f69a5
                                          GstElement * el, guint64 offset);
Packit 1f69a5
Packit 1f69a5
void          gst_ebml_read_init         (GstEbmlRead * ebml,
Packit 1f69a5
                                          GstElement * el, GstBuffer * buf,
Packit 1f69a5
                                          guint64 offset);
Packit 1f69a5
Packit 1f69a5
void          gst_ebml_read_clear        (GstEbmlRead * ebml);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_peek_id           (GstEbmlRead * ebml, guint32 * id);
Packit 1f69a5
Packit 1f69a5
/* return _PARSE if not enough data to read what is needed, _ERROR or _OK */
Packit 1f69a5
GstFlowReturn gst_ebml_read_skip         (GstEbmlRead *ebml);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_buffer       (GstEbmlRead *ebml,
Packit 1f69a5
                                          guint32     *id,
Packit 1f69a5
                                          GstBuffer  **buf);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_uint         (GstEbmlRead *ebml,
Packit 1f69a5
                                          guint32     *id,
Packit 1f69a5
                                          guint64     *num);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_sint         (GstEbmlRead *ebml,
Packit 1f69a5
                                          guint32     *id,
Packit 1f69a5
                                          gint64      *num);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_float        (GstEbmlRead *ebml,
Packit 1f69a5
                                          guint32     *id,
Packit 1f69a5
                                          gdouble     *num);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_ascii        (GstEbmlRead *ebml,
Packit 1f69a5
                                          guint32     *id,
Packit 1f69a5
                                          gchar      **str);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_utf8         (GstEbmlRead *ebml,
Packit 1f69a5
                                          guint32     *id,
Packit 1f69a5
                                          gchar      **str);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_date         (GstEbmlRead *ebml,
Packit 1f69a5
                                          guint32     *id,
Packit 1f69a5
                                          gint64      *date);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_master       (GstEbmlRead *ebml,
Packit 1f69a5
                                          guint32     *id);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_pop_master   (GstEbmlRead *ebml);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_binary       (GstEbmlRead *ebml,
Packit 1f69a5
                                          guint32     *id,
Packit 1f69a5
                                          guint8     **binary,
Packit 1f69a5
                                          guint64     *length);
Packit 1f69a5
Packit 1f69a5
GstFlowReturn gst_ebml_read_header       (GstEbmlRead *read,
Packit 1f69a5
                                          gchar      **doctype,
Packit 1f69a5
                                          guint       *version);
Packit 1f69a5
Packit 1f69a5
/* Returns current (absolute) position of Ebml parser,
Packit 1f69a5
 * i.e. taking into account offset provided at init */
Packit 1f69a5
static inline guint64
Packit 1f69a5
gst_ebml_read_get_pos (GstEbmlRead * ebml)
Packit 1f69a5
{
Packit 1f69a5
  GstEbmlMaster *m;
Packit 1f69a5
Packit 1f69a5
  g_return_val_if_fail (ebml->readers, 0);
Packit 1f69a5
  g_return_val_if_fail (ebml->readers->len, 0);
Packit 1f69a5
Packit 1f69a5
  m = &(g_array_index (ebml->readers, GstEbmlMaster, ebml->readers->len - 1));
Packit 1f69a5
  return m->offset + gst_byte_reader_get_pos (&m->br);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
/* Returns starting offset of Ebml parser */
Packit 1f69a5
static inline guint64
Packit 1f69a5
gst_ebml_read_get_offset (GstEbmlRead * ebml)
Packit 1f69a5
{
Packit 1f69a5
  return ebml->offset;
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
static inline GstByteReader *
Packit 1f69a5
gst_ebml_read_br (GstEbmlRead * ebml)
Packit 1f69a5
{
Packit 1f69a5
  g_return_val_if_fail (ebml->readers, NULL);
Packit 1f69a5
  g_return_val_if_fail (ebml->readers->len, NULL);
Packit 1f69a5
Packit 1f69a5
  return &(g_array_index (ebml->readers,
Packit 1f69a5
          GstEbmlMaster, ebml->readers->len - 1).br);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
static inline gboolean
Packit 1f69a5
gst_ebml_read_has_remaining (GstEbmlRead * ebml, guint64 bytes_needed,
Packit 1f69a5
    gboolean auto_pop)
Packit 1f69a5
{
Packit 1f69a5
  gboolean res;
Packit 1f69a5
Packit 1f69a5
  res = (gst_byte_reader_get_remaining (gst_ebml_read_br (ebml)) >= bytes_needed);
Packit 1f69a5
  if (G_LIKELY (!res && auto_pop)) {
Packit 1f69a5
    gst_ebml_read_pop_master (ebml);
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  return G_LIKELY (res);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
G_END_DECLS
Packit 1f69a5
Packit 1f69a5
#endif /* __GST_EBML_READ_H__ */