gst_plugins_good/gst/avi/gstavidemux.h
author hgs
Wed, 24 Mar 2010 18:04:17 -0500
changeset 16 8e837d1bf446
permissions -rw-r--r--
201009
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
/* GStreamer
hgs
parents:
diff changeset
     2
 * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
hgs
parents:
diff changeset
     3
 * Copyright (C) <2006> Nokia Corporation (contact <stefan.kost@nokia.com>)
hgs
parents:
diff changeset
     4
 *
hgs
parents:
diff changeset
     5
 * This library is free software; you can redistribute it and/or
hgs
parents:
diff changeset
     6
 * modify it under the terms of the GNU Library General Public
hgs
parents:
diff changeset
     7
 * License as published by the Free Software Foundation; either
hgs
parents:
diff changeset
     8
 * version 2 of the License, or (at your option) any later version.
hgs
parents:
diff changeset
     9
 *
hgs
parents:
diff changeset
    10
 * This library is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
hgs
parents:
diff changeset
    13
 * Library General Public License for more details.
hgs
parents:
diff changeset
    14
 *
hgs
parents:
diff changeset
    15
 * You should have received a copy of the GNU Library General Public
hgs
parents:
diff changeset
    16
 * License along with this library; if not, write to the
hgs
parents:
diff changeset
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
hgs
parents:
diff changeset
    18
 * Boston, MA 02111-1307, USA.
hgs
parents:
diff changeset
    19
 */
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#ifndef __GST_AVI_DEMUX_H__
hgs
parents:
diff changeset
    22
#define __GST_AVI_DEMUX_H__
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include <gst/gst.h>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include "avi-ids.h"
hgs
parents:
diff changeset
    27
#include "gst/riff/riff-ids.h"
hgs
parents:
diff changeset
    28
#include "gst/riff/riff-read.h"
hgs
parents:
diff changeset
    29
#include <gst/base/gstadapter.h>
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
G_BEGIN_DECLS
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
#define GST_TYPE_AVI_DEMUX \
hgs
parents:
diff changeset
    34
  (gst_avi_demux_get_type ())
hgs
parents:
diff changeset
    35
#define GST_AVI_DEMUX(obj) \
hgs
parents:
diff changeset
    36
  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AVI_DEMUX, GstAviDemux))
hgs
parents:
diff changeset
    37
#define GST_AVI_DEMUX_CLASS(klass) \
hgs
parents:
diff changeset
    38
  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AVI_DEMUX, GstAviDemuxClass))
hgs
parents:
diff changeset
    39
#define GST_IS_AVI_DEMUX(obj) \
hgs
parents:
diff changeset
    40
  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_DEMUX))
hgs
parents:
diff changeset
    41
#define GST_IS_AVI_DEMUX_CLASS(klass) \
hgs
parents:
diff changeset
    42
  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_DEMUX))
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
#define GST_AVI_DEMUX_MAX_STREAMS       16
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
#define CHUNKID_TO_STREAMNR(chunkid) \
hgs
parents:
diff changeset
    47
  ((((chunkid) & 0xff) - '0') * 10 + \
hgs
parents:
diff changeset
    48
   (((chunkid) >> 8) & 0xff) - '0')
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
#define GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME 1
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
/* 48 bytes */
hgs
parents:
diff changeset
    53
typedef struct {
hgs
parents:
diff changeset
    54
  guint          index_nr;      /* = (entry-index_entries)/sizeof(gst_avi_index_entry); */
hgs
parents:
diff changeset
    55
  guchar         stream_nr;
hgs
parents:
diff changeset
    56
  guchar         flags;
hgs
parents:
diff changeset
    57
  guint64        ts;
hgs
parents:
diff changeset
    58
  guint64        dur;           /* =entry[1].ts-entry->ts */
hgs
parents:
diff changeset
    59
  guint64        offset;
hgs
parents:
diff changeset
    60
  guint64        bytes_before;  /* calculated */
hgs
parents:
diff changeset
    61
  guint32        frames_before; /* calculated */
hgs
parents:
diff changeset
    62
  guint32        size;          /* could be read from the chunk (if we don't split) */
hgs
parents:
diff changeset
    63
} gst_avi_index_entry;
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
typedef struct {
hgs
parents:
diff changeset
    66
  /* index of this streamcontext */
hgs
parents:
diff changeset
    67
  guint          num;
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
  /* pad*/
hgs
parents:
diff changeset
    70
  GstPad        *pad;
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
  /* stream info and headers */
hgs
parents:
diff changeset
    73
  gst_riff_strh *strh;
hgs
parents:
diff changeset
    74
  union {
hgs
parents:
diff changeset
    75
    gst_riff_strf_vids *vids;
hgs
parents:
diff changeset
    76
    gst_riff_strf_auds *auds;
hgs
parents:
diff changeset
    77
    gst_riff_strf_iavs *iavs;
hgs
parents:
diff changeset
    78
    gpointer     data;
hgs
parents:
diff changeset
    79
  } strf;
hgs
parents:
diff changeset
    80
  GstBuffer     *extradata, *initdata;
hgs
parents:
diff changeset
    81
  gchar         *name;
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
  /* current position (byte, frame, time) and other status vars */
hgs
parents:
diff changeset
    84
  guint          current_frame;
hgs
parents:
diff changeset
    85
  guint64        current_byte;
hgs
parents:
diff changeset
    86
  GstFlowReturn  last_flow;
hgs
parents:
diff changeset
    87
  gboolean       discont;
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
  /* stream length */
hgs
parents:
diff changeset
    90
  guint64        total_bytes;
hgs
parents:
diff changeset
    91
  guint32        total_frames;
hgs
parents:
diff changeset
    92
  guint32        total_blocks;
hgs
parents:
diff changeset
    93
  /* stream length according to index */
hgs
parents:
diff changeset
    94
  GstClockTime   idx_duration;
hgs
parents:
diff changeset
    95
  /* stream length according to header */
hgs
parents:
diff changeset
    96
  GstClockTime   hdr_duration;
hgs
parents:
diff changeset
    97
  /* stream length based on header/index */
hgs
parents:
diff changeset
    98
  GstClockTime   duration;
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
  /* VBR indicator */
hgs
parents:
diff changeset
   101
  gboolean       is_vbr;
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
  /* openDML support (for files >4GB) */
hgs
parents:
diff changeset
   104
  gboolean       superindex;
hgs
parents:
diff changeset
   105
  guint64       *indexes;
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
  GstTagList	*taglist;
hgs
parents:
diff changeset
   108
} avi_stream_context;
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
typedef enum {
hgs
parents:
diff changeset
   111
  GST_AVI_DEMUX_START,
hgs
parents:
diff changeset
   112
  GST_AVI_DEMUX_HEADER,
hgs
parents:
diff changeset
   113
  GST_AVI_DEMUX_MOVI,
hgs
parents:
diff changeset
   114
} GstAviDemuxState;
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
typedef enum {
hgs
parents:
diff changeset
   117
  GST_AVI_DEMUX_HEADER_TAG_LIST,
hgs
parents:
diff changeset
   118
  GST_AVI_DEMUX_HEADER_AVIH,
hgs
parents:
diff changeset
   119
  GST_AVI_DEMUX_HEADER_ELEMENTS,
hgs
parents:
diff changeset
   120
  GST_AVI_DEMUX_HEADER_INFO,
hgs
parents:
diff changeset
   121
  GST_AVI_DEMUX_HEADER_JUNK,
hgs
parents:
diff changeset
   122
  GST_AVI_DEMUX_HEADER_DATA
hgs
parents:
diff changeset
   123
} GstAviDemuxHeaderState;
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
typedef struct _GstAviDemux {
hgs
parents:
diff changeset
   126
  GstElement     parent;
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
  /* pads */
hgs
parents:
diff changeset
   129
  GstPad        *sinkpad;
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
  /* AVI decoding state */
hgs
parents:
diff changeset
   132
  GstAviDemuxState state;
hgs
parents:
diff changeset
   133
  GstAviDemuxHeaderState header_state;
hgs
parents:
diff changeset
   134
  guint64        offset;
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
  /* index */
hgs
parents:
diff changeset
   137
  gst_avi_index_entry *index_entries;
hgs
parents:
diff changeset
   138
  guint          index_size;
hgs
parents:
diff changeset
   139
  guint64        index_offset;
hgs
parents:
diff changeset
   140
  guint          current_entry;
hgs
parents:
diff changeset
   141
  guint          reverse_start_index;
hgs
parents:
diff changeset
   142
  guint          reverse_stop_index;
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
  /* streams */
hgs
parents:
diff changeset
   145
  guint          num_streams;
hgs
parents:
diff changeset
   146
  guint          num_v_streams;
hgs
parents:
diff changeset
   147
  guint          num_a_streams;
hgs
parents:
diff changeset
   148
  guint          num_t_streams;  /* subtitle text streams */
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
  avi_stream_context stream[GST_AVI_DEMUX_MAX_STREAMS];
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
  /* for streaming mode */
hgs
parents:
diff changeset
   153
  gboolean      streaming;
hgs
parents:
diff changeset
   154
  gboolean      have_eos;
hgs
parents:
diff changeset
   155
  GstAdapter    *adapter;
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
  /* some stream info for length */
hgs
parents:
diff changeset
   158
  gst_riff_avih *avih;
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
  /* segment in TIME */
hgs
parents:
diff changeset
   161
  GstSegment     segment;
hgs
parents:
diff changeset
   162
  gboolean       segment_running;
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
  /* pending tags/events */
hgs
parents:
diff changeset
   165
  GstEvent      *seek_event;
hgs
parents:
diff changeset
   166
  GstTagList	*globaltags;
hgs
parents:
diff changeset
   167
  gboolean	got_tags;
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
} GstAviDemux;
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
typedef struct _GstAviDemuxClass {
hgs
parents:
diff changeset
   172
  GstElementClass parent_class;
hgs
parents:
diff changeset
   173
} GstAviDemuxClass;
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
GType           gst_avi_demux_get_type          (void);
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
G_END_DECLS
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
#endif /* __GST_AVI_DEMUX_H__ */