Merge branch 'master' into 0.11
[platform/upstream/gstreamer.git] / gst / avi / gstavidemux.h
1 /* GStreamer
2  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
3  * Copyright (C) <2006> Nokia Corporation (contact <stefan.kost@nokia.com>)
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #ifndef __GST_AVI_DEMUX_H__
22 #define __GST_AVI_DEMUX_H__
23
24 #include <gst/gst.h>
25
26 #include "avi-ids.h"
27 #include "gst/riff/riff-ids.h"
28 #include "gst/riff/riff-read.h"
29 #include <gst/base/gstadapter.h>
30
31 G_BEGIN_DECLS
32
33 #define GST_TYPE_AVI_DEMUX \
34   (gst_avi_demux_get_type ())
35 #define GST_AVI_DEMUX(obj) \
36   (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AVI_DEMUX, GstAviDemux))
37 #define GST_AVI_DEMUX_CLASS(klass) \
38   (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AVI_DEMUX, GstAviDemuxClass))
39 #define GST_IS_AVI_DEMUX(obj) \
40   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_DEMUX))
41 #define GST_IS_AVI_DEMUX_CLASS(klass) \
42   (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_DEMUX))
43
44 #define GST_AVI_DEMUX_MAX_STREAMS       16
45
46 #define CHUNKID_TO_STREAMNR(chunkid) \
47   ((((chunkid) & 0xff) - '0') * 10 + \
48    (((chunkid) >> 8) & 0xff) - '0')
49
50
51 /* new index entries 24 bytes */
52 typedef struct {
53   guint32        flags;
54   guint32        size;    /* bytes of the data */
55   guint64        offset;  /* data offset in file */
56   guint64        total;   /* total bytes before */
57 } GstAviIndexEntry;
58
59 typedef struct {
60   /* index of this streamcontext */
61   guint          num;
62
63   /* pad*/
64   GstPad        *pad;
65   gboolean       exposed;
66
67   /* stream info and headers */
68   gst_riff_strh *strh;
69   union {
70     gst_riff_strf_vids *vids;
71     gst_riff_strf_auds *auds;
72     gst_riff_strf_iavs *iavs;
73     gpointer     data;
74   } strf;
75   GstBuffer     *extradata, *initdata;
76   gchar         *name;
77
78   /* the start/step/stop entries */
79   guint          start_entry;
80   guint          step_entry;
81   guint          stop_entry;
82
83   /* current index entry */
84   guint          current_entry;
85   /* position (byte, frame, time) for current_entry */
86   guint          current_total;
87   GstClockTime   current_timestamp;
88   GstClockTime   current_ts_end;
89   guint64        current_offset;
90   guint64        current_offset_end;
91
92   GstFlowReturn  last_flow;
93   gboolean       discont;
94
95   /* stream length */
96   guint64        total_bytes;
97   guint32        total_blocks;
98   guint          n_keyframes;
99   /* stream length according to index */
100   GstClockTime   idx_duration;
101   /* stream length according to header */
102   GstClockTime   hdr_duration;
103   /* stream length based on header/index */
104   GstClockTime   duration;
105
106   /* VBR indicator */
107   gboolean       is_vbr;
108
109   /* openDML support (for files >4GB) */
110   gboolean       superindex;
111   guint64       *indexes;
112
113   /* new indexes */
114   GstAviIndexEntry *index;     /* array with index entries */
115   guint             idx_n;     /* number of entries */
116   guint             idx_max;   /* max allocated size of entries */
117
118   GstTagList    *taglist;
119
120   gint           index_id;
121 } GstAviStream;
122
123 typedef enum {
124   GST_AVI_DEMUX_START,
125   GST_AVI_DEMUX_HEADER,
126   GST_AVI_DEMUX_MOVI,
127   GST_AVI_DEMUX_SEEK,
128 } GstAviDemuxState;
129
130 typedef enum {
131   GST_AVI_DEMUX_HEADER_TAG_LIST,
132   GST_AVI_DEMUX_HEADER_AVIH,
133   GST_AVI_DEMUX_HEADER_ELEMENTS,
134   GST_AVI_DEMUX_HEADER_INFO,
135   GST_AVI_DEMUX_HEADER_JUNK,
136   GST_AVI_DEMUX_HEADER_DATA
137 } GstAviDemuxHeaderState;
138
139 typedef struct _GstAviDemux {
140   GstElement     parent;
141
142   /* pads */
143   GstPad        *sinkpad;
144
145   /* AVI decoding state */
146   GstAviDemuxState state;
147   GstAviDemuxHeaderState header_state;
148   guint64        offset;
149   gboolean       abort_buffering;
150
151   /* when we loaded the indexes */
152   gboolean       have_index;
153   /* index offset in the file */
154   guint64        index_offset;
155
156   /* streams */
157   GstAviStream   stream[GST_AVI_DEMUX_MAX_STREAMS];
158   guint          num_streams;
159   guint          num_v_streams;
160   guint          num_a_streams;
161   guint          num_t_streams;  /* subtitle text streams */
162
163   guint          main_stream; /* used for seeking */
164
165   /* for streaming mode */
166   gboolean       streaming;
167   gboolean       have_eos;
168   GstAdapter    *adapter;
169   guint          todrop;
170
171   /* some stream info for length */
172   gst_riff_avih *avih;
173   GstClockTime   duration;
174
175   /* segment in TIME */
176   GstSegment     segment;
177
178   /* pending tags/events */
179   GstEvent      *seg_event;
180   GstTagList    *globaltags;
181   gboolean       got_tags;
182
183 #if 0
184   /* gst index support */
185   GstIndex      *element_index;
186   gint           index_id;
187 #endif
188
189   gboolean       seekable;
190
191   guint64        first_movi_offset;
192   guint64        idx1_offset; /* offset in file of list/chunk after movi */
193   GstEvent      *seek_event;
194
195   gboolean       building_index;
196   guint          odml_stream;
197   guint          odml_subidx;
198   guint64       *odml_subidxs;
199
200   guint64        seek_kf_offset; /* offset of the keyframe to which we want to seek */
201 } GstAviDemux;
202
203 typedef struct _GstAviDemuxClass {
204   GstElementClass parent_class;
205 } GstAviDemuxClass;
206
207 GType           gst_avi_demux_get_type          (void);
208
209 G_END_DECLS
210
211 #endif /* __GST_AVI_DEMUX_H__ */